Commit 9bd54553 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFS: Initialise verifiers for visible dentries in readdir and lookup



Ensure that the verifiers are initialised before calling
d_splice_alias() in both nfs_prime_dcache() and nfs_lookup().

Reported-by: default avatarMichael Stoler <michael.stoler@vastdata.com>
Fixes: a1147b82 ("NFS: Fix up directory verifier races")
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent bd4928ec
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -789,16 +789,17 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry,
		goto out;
	}

	nfs_set_verifier(dentry, dir_verifier);
	inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr);
	alias = d_splice_alias(inode, dentry);
	d_lookup_done(dentry);
	if (alias) {
		if (IS_ERR(alias))
			goto out;
		nfs_set_verifier(alias, dir_verifier);
		dput(dentry);
		dentry = alias;
	}
	nfs_set_verifier(dentry, dir_verifier);
	trace_nfs_readdir_lookup(d_inode(parent), dentry, 0);
out:
	dput(dentry);
@@ -1994,13 +1995,14 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
	nfs_lookup_advise_force_readdirplus(dir, flags);

no_entry:
	nfs_set_verifier(dentry, dir_verifier);
	res = d_splice_alias(inode, dentry);
	if (res != NULL) {
		if (IS_ERR(res))
			goto out;
		nfs_set_verifier(res, dir_verifier);
		dentry = res;
	}
	nfs_set_verifier(dentry, dir_verifier);
out:
	trace_nfs_lookup_exit(dir, dentry, flags, PTR_ERR_OR_ZERO(res));
	nfs_free_fattr(fattr);