]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
NFSv4/pnfs: Layoutreturn on close must handle fatal networking errors
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 6 Apr 2025 09:05:27 +0000 (11:05 +0200)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 28 Apr 2025 03:25:44 +0000 (23:25 -0400)
If we have a fatal ENETDOWN or ENETUNREACH error, then the layoutreturn
on close code should also handle that as fatal, and free the layouts.

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

index 5f582713bf05eb72eb34b2e2c06d1edcd3c258d3..10fdd065a61c23dc1df8803c2539c8e7b00fc897 100644 (file)
@@ -1661,6 +1661,18 @@ int pnfs_roc_done(struct rpc_task *task, struct nfs4_layoutreturn_args **argpp,
                /* Was there an RPC level error? If not, retry */
                if (task->tk_rpc_status == 0)
                        break;
+               /*
+                * Is there a fatal network level error?
+                * If so release the layout, but flag the error.
+                */
+               if ((task->tk_rpc_status == -ENETDOWN ||
+                    task->tk_rpc_status == -ENETUNREACH) &&
+                   task->tk_flags & RPC_TASK_NETUNREACH_FATAL) {
+                       *ret = 0;
+                       (*respp)->lrs_present = 0;
+                       retval = -EIO;
+                       break;
+               }
                /* If the call was not sent, let caller handle it */
                if (!RPC_WAS_SENT(task))
                        return 0;