mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 00:22:00 +02:00
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: Michael Stoler <michael.stoler@vastdata.com>
Fixes: a1147b8281 ("NFS: Fix up directory verifier races")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
bd4928ec79
commit
9bd545539b
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user