Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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: a1147b8281bd ("NFS: Fix up directory verifier races")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>

+4 -2
+4 -2
fs/nfs/dir.c
··· 789 789 goto out; 790 790 } 791 791 792 + nfs_set_verifier(dentry, dir_verifier); 792 793 inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr); 793 794 alias = d_splice_alias(inode, dentry); 794 795 d_lookup_done(dentry); 795 796 if (alias) { 796 797 if (IS_ERR(alias)) 797 798 goto out; 799 + nfs_set_verifier(alias, dir_verifier); 798 800 dput(dentry); 799 801 dentry = alias; 800 802 } 801 - nfs_set_verifier(dentry, dir_verifier); 802 803 trace_nfs_readdir_lookup(d_inode(parent), dentry, 0); 803 804 out: 804 805 dput(dentry); ··· 1995 1994 nfs_lookup_advise_force_readdirplus(dir, flags); 1996 1995 1997 1996 no_entry: 1997 + nfs_set_verifier(dentry, dir_verifier); 1998 1998 res = d_splice_alias(inode, dentry); 1999 1999 if (res != NULL) { 2000 2000 if (IS_ERR(res)) 2001 2001 goto out; 2002 + nfs_set_verifier(res, dir_verifier); 2002 2003 dentry = res; 2003 2004 } 2004 - nfs_set_verifier(dentry, dir_verifier); 2005 2005 out: 2006 2006 trace_nfs_lookup_exit(dir, dentry, flags, PTR_ERR_OR_ZERO(res)); 2007 2007 nfs_free_fattr(fattr);