]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pNFS/NFSv4: Try to return invalid layout in pnfs_layout_process()
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 21 Jan 2021 22:11:42 +0000 (17:11 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 25 Jan 2021 01:52:30 +0000 (20:52 -0500)
If the server returns a new stateid that does not match the one in our
cache, then try to return the one we hold instead of just invalidating
it on the client side. This ensures that both client and server will
agree that the stateid is invalid.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/pnfs.c

index e68e6f8cb407954d01445ae1b0e5bf95a44b036e..d6262289cf4aac133cb58b3cde5a7918a17b189d 100644 (file)
@@ -2398,7 +2398,13 @@ pnfs_layout_process(struct nfs4_layoutget *lgp)
                 * We got an entirely new state ID.  Mark all segments for the
                 * inode invalid, and retry the layoutget
                 */
-               pnfs_mark_layout_stateid_invalid(lo, &free_me);
+               struct pnfs_layout_range range = {
+                       .iomode = IOMODE_ANY,
+                       .length = NFS4_MAX_UINT64,
+               };
+               pnfs_set_plh_return_info(lo, IOMODE_ANY, 0);
+               pnfs_mark_matching_lsegs_return(lo, &lo->plh_return_segs,
+                                               &range, 0);
                goto out_forget;
        }
 
@@ -2417,7 +2423,6 @@ out_forget:
        spin_unlock(&ino->i_lock);
        lseg->pls_layout = lo;
        NFS_SERVER(ino)->pnfs_curr_ld->free_lseg(lseg);
-       pnfs_free_lseg_list(&free_me);
        return ERR_PTR(-EAGAIN);
 }