]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
NFS: Initialise verifiers for visible dentries in readdir and lookup
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 19 Nov 2025 13:36:16 +0000 (08:36 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 19 Nov 2025 13:45:53 +0000 (08:45 -0500)
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>
fs/nfs/dir.c

index d557b0443e8b0411811f75b96d3f015b2b2339d5..2eead7e85be5bfdc1beceda81abb8a8cbb0a9f42 100644 (file)
@@ -789,16 +789,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);
@@ -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);