]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Oct 2024 13:10:33 +0000 (15:10 +0200)
[ Upstream commit d72b7963115bea971a28eaa2cb76722c023f9fdf ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfs/nfs4proc.c
fs/nfs/pnfs.c

index 770fa1cb112d81d1c036efc313b5afe876f17192..f1c351e40c7a5160ec46207c58b17c8013b792a9 100644 (file)
@@ -9755,13 +9755,16 @@ 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;
        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;
        }
        dprintk("<-- %s\n", __func__);
        return;
index e13f1c762951a11363199c1a2375a5aaf371ca1b..fb12a2193884695a2a675518372b62b5a1e1cda7 100644 (file)
@@ -1169,10 +1169,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);