From nobody Fri Dec 19 09:50:25 2025 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A3411285C96 for ; Tue, 9 Dec 2025 13:56:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765288597; cv=none; b=A8ePqu6jUYU7ExJztUutGEKWkznO80+ZgH9iKeKY1syjQQrNklBjKaQFFLxdUk0BXzAqkvdEjfS5MU7j9H8kfgBLRV0SeiubLiex2N4qtqez3tuwBINs5L4+nnugVhDYQNr4V+QQadCz5DJAC8ZtDK+3Cf0ccB5+2gPDEcdingA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765288597; c=relaxed/simple; bh=DDo+cKxTkb5ZWvas2yqnIp0nDs+AXNSlAmtNYMUN9n4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=W7hDcJ76TOQxbAJQ+cQP1bUBhz8Wd3XCFqElyIhfkZ4UUYBu+Pj6ant7bdse9XzQfbS4aTMZbV/krtcRf3Zn7+OLZfiFDAvPRCzF3annYvS4xWremzewYTk6s0j8SW6tPYz8lqC9lOe8tndsio33YVPluje4Js7EOpwcSuWXJyY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=lvZ4R2QW; arc=none smtp.client-ip=209.85.221.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lvZ4R2QW" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-42f8830c20dso267705f8f.1 for ; Tue, 09 Dec 2025 05:56:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765288594; x=1765893394; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=nyJc1SZYiHDio8qNRqD/ZJgwhbMfnS6ETYolR/1zdAU=; b=lvZ4R2QWosenUamKdaKqGRrQ+uBtfW6HYfA3WfrurKvh9X4qtYKYcp0pJTWF1m9PRK fLrXgznYQWDzwFy/Wyi7+lB5XERc4DAvFfRsyZnGbrPYy1xxwmYYUehYXpMv5PLtdVBp GwDF1ailH8W6uRz16WHhvaLeFfo/GdUPosxFCGVGMD46waycpspd8eN4ByaY4Zyek35h wqT4B6dmWKgw4N/v9qFSI6cy0yEm7fkllIBiiwU2DUYzKRKRjNz2yOlVP8I2dTXocsEZ JQetPyMYrVDTTR+/lNhE8qwxZwUVvAJe1a8usGN8X4YgwvMETNNgeMPFmNYHoGX7B7sl AjRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765288594; x=1765893394; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=nyJc1SZYiHDio8qNRqD/ZJgwhbMfnS6ETYolR/1zdAU=; b=seryIvVSSEowdLGt9JBTfSIyw231CmIQgXBncDahdPGWP3eOZG58U9Z4yXNggPQ3fR bkBUQKgJSZUozy6BE6N9HzmKGD03L1J3ZUz/+FH62DK1YSqzhhlqFXOhBobs6PMtC3I1 l/JIItPSk8sO+XKnkJSLHAUzcdJBIsae5iw2tlAGQ81LYCybQqmlCKyIpnnseYuozaan XgNij8ope3OQ+wNkoEWTCVBnpBBds+YfnuScISpYSm0vhA+faxXjdd9LSdKXxqypKDHa 9GfKKuDOWyW8AbyYxCE8a3nhWFmB1oEeab/UbYIIqhqGt4kGGZXSJiaN/mzlApLnUopg oB3g== X-Forwarded-Encrypted: i=1; AJvYcCXzdP8zw9XVhY1+z/jaPWtm/orjQJJOJuoIGsTYuZRYcaCJQ+ehHOJazCFPuzzRMQUtQ4jo/xnQOCqbj7M=@vger.kernel.org X-Gm-Message-State: AOJu0YzKlmcqsrbPCmwXLDCcabwul1vGCj7hbiGrfncqtWCsvuKiR7Tr yXXYsy7IwfcTPPq5kGAcnMQ12TjQhtagGPsbRRq4MqaB3OgqDdeOQyxz X-Gm-Gg: ASbGncs/x5txGeTcdQmkGcI/o7vPxXt0+ZwSdAEwvcGyWk7rZFzkETy9lks8DJeIDaH Yoyrky3o4S7lEwLZOmQgw4xXGpnG1ceSmvp5cbCQDuwz4NXcmVuGWjhH0cePlQTX5sXrlpPqxpS Bkwd5tVPDbV1Eqnxr+elrx9mg9a84qhn7zA3nvglqYvqSsIG4Br9FgMvoz4hm0plg6ia8oUfV/B 31DfTFLR26Ndq4pgZ0oOmS01avwz00ryBBRvbggQ+INrGcXy3lwJLcCWbvSRRiTwev7/TVAftix zrnZExhSq+bG4ag1rRAS6FGNjsucJtIx/xBGhL8TqiutDxAL7TzxcsfsaIhFvY6QjQ1/SadZOV3 fOK+1XpyFu6QKCEjlfSnswCkfcxVv5PBl/2sXY2obUs1Aya1TDMJb9EwNODS3Ykpxpkl7QIHUtB EmCJwuvqK6vJNL0MmexG9PG+Vyp55g07+jyfWwQIwsD9LMzOAlAV7auwUPg1XUp8Cav0i1pOlN6 gHd4B5oSOB2oZWaBdgakxqS8uw= X-Google-Smtp-Source: AGHT+IFExbUUinOx5olBapVOFt8pUpUWbWpQrJAIGGIbJUmmV7d7OKRw6VaHLwCyPDpJ/ONTsM+01A== X-Received: by 2002:a05:600c:46cf:b0:477:a977:b8a0 with SMTP id 5b1f17b1804b1-47a7d69abf0mr14209385e9.3.1765288593608; Tue, 09 Dec 2025 05:56:33 -0800 (PST) Received: from Mac.localdomain.com (walt-26-b2-v4wan-170690-cust332.vm13.cable.virginm.net. [82.19.157.77]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47a7d2eb5a2sm20521545e9.0.2025.12.09.05.56.32 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 09 Dec 2025 05:56:33 -0800 (PST) From: Robert Milkowski To: trondmy@kernel.org Cc: anna@kernel.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, Robert Milkowski Subject: [PATCH] pnfs/filelayout: handle data server op_status errors Date: Tue, 9 Dec 2025 13:56:20 +0000 Message-ID: <20251209135620.27492-1-rmilkowski@gmail.com> X-Mailer: git-send-email 2.50.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Data servers can return NFS-level status in op_status, but the file layout driver only looked at RPC transport errors. That means session errors, layout-invalidating statuses, and retry hints from the DS can be ignored, leading to missed session recovery, stale layouts, or failed retries. Pass the DS op_status into the async error handler and handle the same set of NFS status codes as flexfiles (see commit 38074de35b01, "NFSv4/flexfiles: Fix handling of NFS level errors in I/O"). Wire the read/write/commit callbacks to propagate op_status so the file layout driver can invalidate layouts, trigger session recovery, or retry as appropriate. Signed-off-by: Robert Milkowski --- fs/nfs/filelayout/filelayout.c | 54 ++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c index 5c4551117c58..2808baa19f83 100644 --- a/fs/nfs/filelayout/filelayout.c +++ b/fs/nfs/filelayout/filelayout.c @@ -121,6 +121,7 @@ static void filelayout_reset_read(struct nfs_pgio_heade= r *hdr) } =20 static int filelayout_async_handle_error(struct rpc_task *task, + u32 op_status, struct nfs4_state *state, struct nfs_client *clp, struct pnfs_layout_segment *lseg) @@ -130,6 +131,48 @@ static int filelayout_async_handle_error(struct rpc_ta= sk *task, struct nfs4_deviceid_node *devid =3D FILELAYOUT_DEVID_NODE(lseg); struct nfs4_slot_table *tbl =3D &clp->cl_session->fc_slot_table; =20 + if (op_status) { + switch (op_status) { + case NFS4_OK: + case NFS4ERR_NXIO: + break; + case NFS4ERR_BADSESSION: + case NFS4ERR_BADSLOT: + case NFS4ERR_BAD_HIGH_SLOT: + case NFS4ERR_DEADSESSION: + case NFS4ERR_CONN_NOT_BOUND_TO_SESSION: + case NFS4ERR_SEQ_FALSE_RETRY: + case NFS4ERR_SEQ_MISORDERED: + dprintk("%s op_status %u, Reset session. Exchangeid " + "flags 0x%x\n", __func__, op_status, + clp->cl_exchange_flags); + nfs4_schedule_session_recovery(clp->cl_session, + op_status); + goto out_retry; + case NFS4ERR_DELAY: + case NFS4ERR_GRACE: + case NFS4ERR_RETRY_UNCACHED_REP: + rpc_delay(task, FILELAYOUT_POLL_RETRY_MAX); + goto out_retry; + case NFS4ERR_ACCESS: + case NFS4ERR_PNFS_NO_LAYOUT: + case NFS4ERR_STALE: + case NFS4ERR_BADHANDLE: + case NFS4ERR_ISDIR: + case NFS4ERR_FHEXPIRED: + case NFS4ERR_WRONG_TYPE: + case NFS4ERR_NOMATCHING_LAYOUT: + case NFSERR_PERM: + dprintk("%s Invalid layout op_status %u\n", __func__, + op_status); + pnfs_destroy_layout(NFS_I(inode)); + rpc_wake_up(&tbl->slot_tbl_waitq); + goto reset; + default: + goto reset; + } + } + if (task->tk_status >=3D 0) return 0; =20 @@ -196,6 +239,8 @@ static int filelayout_async_handle_error(struct rpc_tas= k *task, task->tk_status); return -NFS4ERR_RESET_TO_MDS; } + +out_retry: task->tk_status =3D 0; return -EAGAIN; } @@ -208,7 +253,8 @@ static int filelayout_read_done_cb(struct rpc_task *tas= k, int err; =20 trace_nfs4_pnfs_read(hdr, task->tk_status); - err =3D filelayout_async_handle_error(task, hdr->args.context->state, + err =3D filelayout_async_handle_error(task, hdr->res.op_status, + hdr->args.context->state, hdr->ds_clp, hdr->lseg); =20 switch (err) { @@ -318,7 +364,8 @@ static int filelayout_write_done_cb(struct rpc_task *ta= sk, int err; =20 trace_nfs4_pnfs_write(hdr, task->tk_status); - err =3D filelayout_async_handle_error(task, hdr->args.context->state, + err =3D filelayout_async_handle_error(task, hdr->res.op_status, + hdr->args.context->state, hdr->ds_clp, hdr->lseg); =20 switch (err) { @@ -346,7 +393,8 @@ static int filelayout_commit_done_cb(struct rpc_task *t= ask, int err; =20 trace_nfs4_pnfs_commit_ds(data, task->tk_status); - err =3D filelayout_async_handle_error(task, NULL, data->ds_clp, + err =3D filelayout_async_handle_error(task, data->res.op_status, + NULL, data->ds_clp, data->lseg); =20 switch (err) { base-commit: cb015814f8b6eebcbb8e46e111d108892c5e6821 --=20 2.47.1