mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
NFS: Initialise verifiers for visible dentries in readdir and lookup
[ Upstream commit9bd545539b] Ensure that the verifiers are initialised before calling d_splice_alias() in both nfs_prime_dcache() and nfs_lookup(). Reported-by: Michael Stoler <michael.stoler@vastdata.com> Fixes:a1147b8281("NFS: Fix up directory verifier races") Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
29e8d9b274
commit
991609c4a7
+4
-2
@@ -785,16 +785,17 @@ again:
|
||||
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);
|
||||
@@ -2000,13 +2001,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);
|
||||
|
||||
Reference in New Issue
Block a user