]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nfsd: fix filecache lookup
authorTrond Myklebust <trondmy@gmail.com>
Mon, 6 Jan 2020 18:18:03 +0000 (13:18 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 11 Feb 2020 12:35:32 +0000 (04:35 -0800)
commit 28c7d86bb6172ffbb1a1237c6388e77f9fe5f181 upstream.

If the lookup keeps finding a nfsd_file with an unhashed open file,
then retry once only.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Cc: stable@vger.kernel.org
Fixes: 65294c1f2c5e "nfsd: add a new struct file caching facility to nfsd"
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/nfsd/filecache.c

index ef55e9b1cd4e458b6b8516909645e1ca987fdcb1..3007b8945d3883f565a9f935d28328b62681ff9c 100644 (file)
@@ -791,6 +791,7 @@ nfsd_file_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp,
        struct nfsd_file *nf, *new;
        struct inode *inode;
        unsigned int hashval;
+       bool retry = true;
 
        /* FIXME: skip this if fh_dentry is already set? */
        status = fh_verify(rqstp, fhp, S_IFREG,
@@ -826,6 +827,11 @@ wait_for_construction:
 
        /* Did construction of this file fail? */
        if (!test_bit(NFSD_FILE_HASHED, &nf->nf_flags)) {
+               if (!retry) {
+                       status = nfserr_jukebox;
+                       goto out;
+               }
+               retry = false;
                nfsd_file_put_noref(nf);
                goto retry;
        }