From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B9E8632B48D; Wed, 24 Sep 2025 18:07:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758737261; cv=none; b=Qi3oLyvG5FTloXs99g4E0Bg6GQ9O3o2HCZiQoZ7saESn9RCHjTXIwi57n0YhNpiKnYy10QNlHgLSXngToDpyOqqtgDNSMsjdn9ZAFj+GDrmwwUzrqgsdCk/Enez+uAIj99LH44GDtak4V9aZhg/bDk9i3I0QmDRo0e58YKPv3hA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758737261; c=relaxed/simple; bh=B1FrYfSR5VHNXEHJ+GogbfuoPzE7sBH/pi3IILillLw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Z1oqq4Sq27ySOzDZMuh7/51ct1xfyFLne6ZhOxRMEi+URvSM1jmrsj/iHzOj9N8ODOjzi011AC4RcGuzpWpdT7c1mFQK6pYjgzPHOWEmZOWtUulJrFcA5M4mH+e3WrkXQNk+uIuJUq8Mdxm4qeMuaqBSHTzFwo+Fe98SY27W8vk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=sYLf0LvJ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="sYLf0LvJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 56EA0C4CEF0; Wed, 24 Sep 2025 18:07:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1758737261; bh=B1FrYfSR5VHNXEHJ+GogbfuoPzE7sBH/pi3IILillLw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=sYLf0LvJa7rqWxdlifvNmzdIwV9WbDdxa+DKs8Y/sWB/tpEgFF0nC0dk6Qc/r/zDJ 0VlvQyQuo0+sPQHuOZyD7MD6caYmVTMO309gV/6WXMaSmioJ/H04SgHlMxhlEjc/Y6 qS6hZcMsvor1EWYbXL/65HUHL7SKQTepudqfNe1rD/9/4d0tPzHESRBvYR40P0/lUO EA2aYd0wQyR84358/GbGkSWr0dTplI2eqPjdxy9fK3RgEaGfNjDtIrvZH1/rBkGoIH +dGuM1yrpsH9L93jO9gYS4CcstUuunuvoZPjccJ5E/zQun6ShXK4laiO0cH8IPNKYm fc03S4BwcIYGg== From: Jeff Layton Date: Wed, 24 Sep 2025 14:06:11 -0400 Subject: [PATCH v3 25/38] nfsd: add callback encoding and decoding linkages for CB_NOTIFY Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20250924-dir-deleg-v3-25-9f3af8bc5c40@kernel.org> References: <20250924-dir-deleg-v3-0-9f3af8bc5c40@kernel.org> In-Reply-To: <20250924-dir-deleg-v3-0-9f3af8bc5c40@kernel.org> To: Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , NeilBrown , Olga Kornievskaia , Dai Ngo , Jonathan Corbet , Amir Goldstein , Miklos Szeredi , Paulo Alcantara , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Paulo Alcantara Cc: Rick Macklem , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, linux-doc@vger.kernel.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4158; i=jlayton@kernel.org; h=from:subject:message-id; bh=B1FrYfSR5VHNXEHJ+GogbfuoPzE7sBH/pi3IILillLw=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo1DMP8QJ2n5PeJMeCID9hQ+8KIBvEQbBLZ8us1 Ep6yO+A3vuJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaNQzDwAKCRAADmhBGVaC FWIBD/9l32283ADEjuVcJ6aK5/MjZCoU1SRyLJIqWd0XZ9PMLBTOkGNNkC3Xpzen/P4oebYBDg9 Ggl6eW8TxISGDaSAX3P0rt/lOSKVu+qOWWUEIYliPqd/fPN0ubQH03qGt12mOhsPOLh4uKjstl5 HOm4vNEFlhZWPC1My9k9Tf0siQPjlnhu6pJZ9aJiyi20d5bt2nWjtqnTbJ6SvTlu0KiqPQ7CXpj XfpRGLtmrWXP4ldkMXOjwjPIF0raCIkeoH87FtqK5FhTJS2qVAs+p53Kuq8VNH3FsTyR9KIbFLf aFGT8oaLiS8giObaYj2G46w/EXh9R5CpInhurEslz02nwrQlI1Lu8KD0OuZSW5n2egPEY+MDyZM I97C/GkbDQBUEuJA2m1BLNi2spU9YU5hI1XhtbhnAGul2Hah71BpvDTYGXdyUNXyyWDZZay1j4n 011gpbg7a4bN9W4iqG5a33Hejn7cjU8fn6/nTH1a1XvcxXIwgUrf3bUS15SgbiNIO5cmWWywDrZ IRf/lAnXAIl5qk7kf4/2FyfDUfGS1/l7OoSAlsZYct6o0CblKkaLiNghyWWHm6AUangu+5WLXVN IJ3kWl/99zotJwSdkrAHS+hjP8BmD+y9HAN+ixFhkNlCFdh6H60D/AI/R5vj9r0JcVQ+OYBBYn2 mMOSf5gwXAgZCcA== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 Add routines for encoding and decoding CB_NOTIFY messages. These call into the code generated by xdrgen to do the actual encoding and decoding. Signed-off-by: Jeff Layton --- fs/nfsd/nfs4callback.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ fs/nfsd/state.h | 8 ++++++++ fs/nfsd/xdr4cb.h | 12 ++++++++++++ 3 files changed, 66 insertions(+) diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index d13a4819d764269338f2b05a05f975c037e589af..fe7b20b94d76efd309e27c1a3ef359e7101dac80 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c @@ -865,6 +865,51 @@ static void encode_stateowner(struct xdr_stream *xdr, struct nfs4_stateowner *so xdr_encode_opaque(p, so->so_owner.data, so->so_owner.len); } +static void nfs4_xdr_enc_cb_notify(struct rpc_rqst *req, + struct xdr_stream *xdr, + const void *data) +{ + const struct nfsd4_callback *cb = data; + struct nfs4_cb_compound_hdr hdr = { + .ident = 0, + .minorversion = cb->cb_clp->cl_minorversion, + }; + struct CB_NOTIFY4args args = { }; + + WARN_ON_ONCE(hdr.minorversion == 0); + + encode_cb_compound4args(xdr, &hdr); + encode_cb_sequence4args(xdr, cb, &hdr); + + /* + * FIXME: get stateid and fh from delegation. Inline the cna_changes + * buffer, and zero it. + */ + WARN_ON_ONCE(!xdrgen_encode_CB_NOTIFY4args(xdr, &args)); + + hdr.nops++; + encode_cb_nops(&hdr); +} + +static int nfs4_xdr_dec_cb_notify(struct rpc_rqst *rqstp, + struct xdr_stream *xdr, + void *data) +{ + struct nfsd4_callback *cb = data; + struct nfs4_cb_compound_hdr hdr; + int status; + + status = decode_cb_compound4res(xdr, &hdr); + if (unlikely(status)) + return status; + + status = decode_cb_sequence4res(xdr, cb); + if (unlikely(status || cb->cb_seq_status)) + return status; + + return decode_cb_op_status(xdr, OP_CB_NOTIFY, &cb->cb_status); +} + static void nfs4_xdr_enc_cb_notify_lock(struct rpc_rqst *req, struct xdr_stream *xdr, const void *data) @@ -1026,6 +1071,7 @@ static const struct rpc_procinfo nfs4_cb_procedures[] = { #ifdef CONFIG_NFSD_PNFS PROC(CB_LAYOUT, COMPOUND, cb_layout, cb_layout), #endif + PROC(CB_NOTIFY, COMPOUND, cb_notify, cb_notify), PROC(CB_NOTIFY_LOCK, COMPOUND, cb_notify_lock, cb_notify_lock), PROC(CB_OFFLOAD, COMPOUND, cb_offload, cb_offload), PROC(CB_RECALL_ANY, COMPOUND, cb_recall_any, cb_recall_any), diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index bacb9f9eff3aaf7076d53f06826026569a567bd9..596d0bbf868c0ca2a31fa20f3ac61db66b60636d 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h @@ -189,6 +189,13 @@ struct nfs4_cb_fattr { u64 ncf_cur_fsize; }; +/* + * FIXME: the current backchannel encoder can't handle a send buffer longer + * than a single page (see bc_alloc/bc_free). + */ +#define NOTIFY4_EVENT_QUEUE_SIZE 3 +#define NOTIFY4_PAGE_ARRAY_SIZE 1 + /* * Represents a delegation stateid. The nfs4_client holds references to these * and they are put when it is being destroyed or when the delegation is @@ -755,6 +762,7 @@ enum nfsd4_cb_op { NFSPROC4_CLNT_CB_NOTIFY_LOCK, NFSPROC4_CLNT_CB_RECALL_ANY, NFSPROC4_CLNT_CB_GETATTR, + NFSPROC4_CLNT_CB_NOTIFY, }; /* Returns true iff a is later than b: */ diff --git a/fs/nfsd/xdr4cb.h b/fs/nfsd/xdr4cb.h index f4e29c0c701c9b04c44dadc752e847dc4da163d6..b06d0170d7c43b9ad3a3a4f49878dc3f8b46099d 100644 --- a/fs/nfsd/xdr4cb.h +++ b/fs/nfsd/xdr4cb.h @@ -33,6 +33,18 @@ cb_sequence_dec_sz + \ op_dec_sz) +#define NFS4_enc_cb_notify_sz (cb_compound_enc_hdr_sz + \ + cb_sequence_enc_sz + \ + 1 + enc_stateid_sz + \ + enc_nfs4_fh_sz + \ + 1 + \ + NOTIFY4_EVENT_QUEUE_SIZE * \ + (2 + (NFS4_OPAQUE_LIMIT >> 2))) + +#define NFS4_dec_cb_notify_sz (cb_compound_dec_hdr_sz + \ + cb_sequence_dec_sz + \ + op_dec_sz) + #define NFS4_enc_cb_notify_lock_sz (cb_compound_enc_hdr_sz + \ cb_sequence_enc_sz + \ 2 + 1 + \ -- 2.51.0