Skip to content

Commit 9bd5455

Browse files
author
Trond Myklebust
committed
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: a1147b8 ("NFS: Fix up directory verifier races") Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
1 parent bd4928e commit 9bd5455

1 file changed

Lines changed: 4 additions & 2 deletions

File tree

fs/nfs/dir.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -789,16 +789,17 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry,
789789
goto out;
790790
}
791791

792+
nfs_set_verifier(dentry, dir_verifier);
792793
inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr);
793794
alias = d_splice_alias(inode, dentry);
794795
d_lookup_done(dentry);
795796
if (alias) {
796797
if (IS_ERR(alias))
797798
goto out;
799+
nfs_set_verifier(alias, dir_verifier);
798800
dput(dentry);
799801
dentry = alias;
800802
}
801-
nfs_set_verifier(dentry, dir_verifier);
802803
trace_nfs_readdir_lookup(d_inode(parent), dentry, 0);
803804
out:
804805
dput(dentry);
@@ -1994,13 +1995,14 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
19941995
nfs_lookup_advise_force_readdirplus(dir, flags);
19951996

19961997
no_entry:
1998+
nfs_set_verifier(dentry, dir_verifier);
19971999
res = d_splice_alias(inode, dentry);
19982000
if (res != NULL) {
19992001
if (IS_ERR(res))
20002002
goto out;
2003+
nfs_set_verifier(res, dir_verifier);
20012004
dentry = res;
20022005
}
2003-
nfs_set_verifier(dentry, dir_verifier);
20042006
out:
20052007
trace_nfs_lookup_exit(dir, dentry, flags, PTR_ERR_OR_ZERO(res));
20062008
nfs_free_fattr(fattr);

0 commit comments

Comments
 (0)