From: Chuck Lever <cel@kernel.org>
To: NeilBrown <neilb@ownmail.net>, Jeff Layton <jlayton@kernel.org>,
Olga Kornievskaia <okorniev@redhat.com>,
Dai Ngo <dai.ngo@oracle.com>, Tom Talpey <tom@talpey.com>
Cc: <linux-nfs@vger.kernel.org>, Chuck Lever <chuck.lever@oracle.com>
Subject: [PATCH v2 02/42] lockd: Introduce nlm__int__deadlock
Date: Fri, 23 Jan 2026 13:52:19 -0500 [thread overview]
Message-ID: <20260123185259.1215767-3-cel@kernel.org> (raw)
In-Reply-To: <20260123185259.1215767-1-cel@kernel.org>
From: Chuck Lever <chuck.lever@oracle.com>
The use of CONFIG_LOCKD_V4 in combination with a later cast_status()
in the NLMv3 code is difficult to reason about. Instead, replace the
use of nlm_deadlock with an implementation-defined status value that
version-specific code translates appropriately.
The new approach establishes a translation boundary: generic lockd
code returns nlm__int__deadlock when posix_lock_file() yields
-EDEADLK. Version-specific handlers (svc4proc.c for NLMv4,
svcproc.c for NLMv3) translate this internal status to the
appropriate wire protocol value. NLMv4 maps to nlm4_deadlock;
NLMv3 maps to nlm_lck_denied (since NLMv3 lacks a deadlock-specific
status code).
Later this modification will also remove the need to include NLMv4
headers in NLMv3 and generic code.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/lockd/svc4proc.c | 10 ++++++++--
fs/lockd/svclock.c | 8 +-------
fs/lockd/svcproc.c | 4 +++-
include/linux/lockd/lockd.h | 7 +++++++
include/linux/lockd/xdr.h | 2 --
5 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
index 4b6f18d97734..061686b36b38 100644
--- a/fs/lockd/svc4proc.c
+++ b/fs/lockd/svc4proc.c
@@ -146,10 +146,16 @@ __nlm4svc_proc_lock(struct svc_rqst *rqstp, struct nlm_res *resp)
resp->status = nlmsvc_lock(rqstp, file, host, &argp->lock,
argp->block, &argp->cookie,
argp->reclaim);
- if (resp->status == nlm_drop_reply)
+ switch (resp->status) {
+ case nlm_drop_reply:
rc = rpc_drop_reply;
- else
+ break;
+ case nlm__int__deadlock:
+ resp->status = nlm4_deadlock;
+ fallthrough;
+ default:
dprintk("lockd: LOCK status %d\n", ntohl(resp->status));
+ }
nlmsvc_release_lockowner(&argp->lock);
nlmsvc_release_host(host);
diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c
index 712df1e025d8..e80e3b4ee689 100644
--- a/fs/lockd/svclock.c
+++ b/fs/lockd/svclock.c
@@ -33,12 +33,6 @@
#define NLMDBG_FACILITY NLMDBG_SVCLOCK
-#ifdef CONFIG_LOCKD_V4
-#define nlm_deadlock nlm4_deadlock
-#else
-#define nlm_deadlock nlm_lck_denied
-#endif
-
static void nlmsvc_release_block(struct nlm_block *block);
static void nlmsvc_insert_block(struct nlm_block *block, unsigned long);
static void nlmsvc_remove_block(struct nlm_block *block);
@@ -589,7 +583,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
goto out;
case -EDEADLK:
nlmsvc_remove_block(block);
- ret = nlm_deadlock;
+ ret = nlm__int__deadlock;
goto out;
default: /* includes ENOLCK */
nlmsvc_remove_block(block);
diff --git a/fs/lockd/svcproc.c b/fs/lockd/svcproc.c
index 95c6bf7ab757..3e890534c3dc 100644
--- a/fs/lockd/svcproc.c
+++ b/fs/lockd/svcproc.c
@@ -27,7 +27,7 @@ static inline __be32 cast_status(__be32 status)
case nlm_lck_denied_grace_period:
case nlm_drop_reply:
break;
- case nlm4_deadlock:
+ case nlm__int__deadlock:
status = nlm_lck_denied;
break;
default:
@@ -39,6 +39,8 @@ static inline __be32 cast_status(__be32 status)
#else
static inline __be32 cast_status(__be32 status)
{
+ if (status == nlm__int__deadlock)
+ status = nlm_lck_denied;
return status;
}
#endif
diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h
index 330e38776bb2..36a744f212ca 100644
--- a/include/linux/lockd/lockd.h
+++ b/include/linux/lockd/lockd.h
@@ -38,6 +38,13 @@
*/
#define LOCKD_DFLT_TIMEO 10
+/*
+ * Internal-use status codes, not to be placed on the wire.
+ * Version handlers translate these to appropriate wire values.
+ */
+#define nlm_drop_reply cpu_to_be32(30000)
+#define nlm__int__deadlock cpu_to_be32(30001)
+
/*
* Lockd host handle (used both by the client and server personality).
*/
diff --git a/include/linux/lockd/xdr.h b/include/linux/lockd/xdr.h
index 17d53165d9f2..292e4e38d17d 100644
--- a/include/linux/lockd/xdr.h
+++ b/include/linux/lockd/xdr.h
@@ -33,8 +33,6 @@ struct svc_rqst;
#define nlm_lck_blocked cpu_to_be32(NLM_LCK_BLOCKED)
#define nlm_lck_denied_grace_period cpu_to_be32(NLM_LCK_DENIED_GRACE_PERIOD)
-#define nlm_drop_reply cpu_to_be32(30000)
-
/* Lock info passed via NLM */
struct nlm_lock {
char * caller;
--
2.52.0
next prev parent reply other threads:[~2026-01-23 18:53 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-23 18:52 [PATCH v2 00/42] Clarify module API boundaries Chuck Lever
2026-01-23 18:52 ` [PATCH v2 01/42] lockd: Simplify cast_status() in svcproc.c Chuck Lever
2026-01-23 18:52 ` Chuck Lever [this message]
2026-01-26 12:34 ` [PATCH v2 02/42] lockd: Introduce nlm__int__deadlock Jeff Layton
2026-01-26 14:36 ` Chuck Lever
2026-01-23 18:52 ` [PATCH v2 03/42] lockd: Have nlm_fopen() return errno values Chuck Lever
2026-01-23 18:52 ` [PATCH v2 04/42] lockd: Relocate nlmsvc_unlock API declarations Chuck Lever
2026-01-23 18:52 ` [PATCH v2 05/42] NFS: Use nlmclnt_rpc_clnt() helper to retrieve nlm_host's rpc_clnt Chuck Lever
2026-01-23 20:23 ` Jeff Layton
2026-01-23 20:44 ` Chuck Lever
2026-01-23 21:30 ` Jeff Layton
2026-01-23 21:37 ` Chuck Lever
2026-01-23 18:52 ` [PATCH v2 06/42] lockd: Move xdr4.h from include/linux/lockd/ to fs/lockd/ Chuck Lever
2026-01-23 18:52 ` [PATCH v2 07/42] lockd: Move share.h " Chuck Lever
2026-01-23 18:52 ` [PATCH v2 08/42] lockd: Relocate include/linux/lockd/lockd.h Chuck Lever
2026-01-23 18:52 ` [PATCH v2 09/42] lockd: Remove lockd/debug.h Chuck Lever
2026-01-23 18:52 ` [PATCH v2 10/42] lockd: Move xdr.h from include/linux/lockd/ to fs/lockd/ Chuck Lever
2026-01-24 1:20 ` kernel test robot
2026-01-24 2:57 ` kernel test robot
2026-01-23 18:52 ` [PATCH v2 11/42] lockd: Make linux/lockd/nlm.h an internal header Chuck Lever
2026-01-23 18:52 ` [PATCH v2 12/42] lockd: Move nlm4svc_set_file_lock_range() Chuck Lever
2026-01-23 18:52 ` [PATCH v2 13/42] lockd: Relocate svc_version definitions to XDR layer Chuck Lever
2026-01-23 18:52 ` [PATCH v2 14/42] Documentation: Add the RPC language description of NLM version 4 Chuck Lever
2026-01-23 18:52 ` [PATCH v2 15/42] lockd: Use xdrgen XDR functions for the NLMv4 NULL procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 16/42] lockd: Use xdrgen XDR functions for the NLMv4 TEST procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 17/42] lockd: Use xdrgen XDR functions for the NLMv4 LOCK procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 18/42] lockd: Use xdrgen XDR functions for the NLMv4 CANCEL procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 19/42] lockd: Use xdrgen XDR functions for the NLMv4 UNLOCK procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 20/42] lockd: Use xdrgen XDR functions for the NLMv4 GRANTED procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 21/42] lockd: Refactor nlm4svc_callback() Chuck Lever
2026-01-23 18:52 ` [PATCH v2 22/42] lockd: Use xdrgen XDR functions for the NLMv4 TEST_MSG procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 23/42] lockd: Use xdrgen XDR functions for the NLMv4 LOCK_MSG procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 24/42] lockd: Use xdrgen XDR functions for the NLMv4 CANCEL_MSG procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 25/42] lockd: Use xdrgen XDR functions for the NLMv4 UNLOCK_MSG procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 26/42] lockd: Use xdrgen XDR functions for the NLMv4 GRANTED_MSG procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 27/42] lockd: Use xdrgen XDR functions for the NLMv4 TEST_RES procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 28/42] lockd: Use xdrgen XDR functions for the NLMv4 LOCK_RES procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 29/42] lockd: Use xdrgen XDR functions for the NLMv4 CANCEL_RES procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 30/42] lockd: Use xdrgen XDR functions for the NLMv4 UNLOCK_RES procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 31/42] lockd: Use xdrgen XDR functions for the NLMv4 GRANTED_RES procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 32/42] lockd: Use xdrgen XDR functions for the NLMv4 SM_NOTIFY procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 33/42] lockd: Convert server-side undefined procedures to xdrgen Chuck Lever
2026-01-23 18:52 ` [PATCH v2 34/42] lockd: Hoist file_lock init out of nlm4svc_decode_shareargs() Chuck Lever
2026-01-23 18:52 ` [PATCH v2 35/42] lockd: Prepare share helpers for xdrgen conversion Chuck Lever
2026-01-23 18:52 ` [PATCH v2 36/42] lockd: Use xdrgen XDR functions for the NLMv4 SHARE procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 37/42] lockd: Use xdrgen XDR functions for the NLMv4 UNSHARE procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 38/42] lockd: Use xdrgen XDR functions for the NLMv4 NM_LOCK procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 39/42] lockd: Use xdrgen XDR functions for the NLMv4 FREE_ALL procedure Chuck Lever
2026-01-23 18:52 ` [PATCH v2 40/42] lockd: Add LOCKD_SHARE_SVID constant for DOS sharing mode Chuck Lever
2026-01-23 18:52 ` [PATCH v2 41/42] lockd: Remove C macros that are no longer used Chuck Lever
2026-01-23 18:52 ` [PATCH v2 42/42] lockd: Remove dead code from fs/lockd/xdr4.c Chuck Lever
2026-01-26 12:51 ` [PATCH v2 00/42] Clarify module API boundaries Jeff Layton
2026-01-26 14:35 ` Chuck Lever
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260123185259.1215767-3-cel@kernel.org \
--to=cel@kernel.org \
--cc=chuck.lever@oracle.com \
--cc=dai.ngo@oracle.com \
--cc=jlayton@kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@ownmail.net \
--cc=okorniev@redhat.com \
--cc=tom@talpey.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.