]> www.infradead.org Git - users/hch/xfs.git/commitdiff
NFSv4: Fix clearing of layout segments in layoutreturn
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 21 Aug 2024 18:05:01 +0000 (14:05 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Thu, 22 Aug 2024 21:01:10 +0000 (17:01 -0400)
Make sure that we clear the layout segments in cases where we see a
fatal error, and also in the case where the layout is invalid.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs4proc.c
fs/nfs/pnfs.c

index 06df74362e947effed917e28adab272693947b39..b8ffbe52ba15a5c0204d9e7cb62e4d2a414b5d9a 100644 (file)
@@ -9998,6 +9998,7 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)
                fallthrough;
        default:
                task->tk_status = 0;
+               lrp->res.lrs_present = 0;
                fallthrough;
        case 0:
                break;
@@ -10011,9 +10012,11 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)
                task->tk_status = 0;
                break;
        case -NFS4ERR_DELAY:
-               if (nfs4_async_handle_error(task, server, NULL, NULL) != -EAGAIN)
-                       break;
-               goto out_restart;
+               if (nfs4_async_handle_error(task, server, NULL, NULL) ==
+                   -EAGAIN)
+                       goto out_restart;
+               lrp->res.lrs_present = 0;
+               break;
        }
        return;
 out_restart:
index aa698481bec8d1544aef72518f50f0e19fb46e27..0d16b383a45262f75f06db6601669b7f55df4fa4 100644 (file)
@@ -1284,10 +1284,9 @@ void pnfs_layoutreturn_free_lsegs(struct pnfs_layout_hdr *lo,
        LIST_HEAD(freeme);
 
        spin_lock(&inode->i_lock);
-       if (!pnfs_layout_is_valid(lo) ||
-           !nfs4_stateid_match_other(&lo->plh_stateid, arg_stateid))
+       if (!nfs4_stateid_match_other(&lo->plh_stateid, arg_stateid))
                goto out_unlock;
-       if (stateid) {
+       if (stateid && pnfs_layout_is_valid(lo)) {
                u32 seq = be32_to_cpu(arg_stateid->seqid);
 
                pnfs_mark_matching_lsegs_invalid(lo, &freeme, range, seq);