mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
NFS: Initialise verifiers for visible dentries in readdir and lookup
[ Upstream commit 9bd545539b233725a3416801f7c374bff0327d6e ]
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
@@ -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