From: Chuck Lever <cel@kernel.org>
To: NeilBrown <neil@brown.name>, 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>
Subject: [PATCH v1 15/17] NFSD: Use xdrgen XDR functions for the NFS-ACL v2 GETATTR procedure
Date: Thu, 22 Oct 2026 09:53:39 -0400 [thread overview]
Message-ID: <20261022135341.14265-16-cel@kernel.org> (raw)
In-Reply-To: <20261022135341.14265-1-cel@kernel.org>
Convert the NFS-ACL version 2 GETATTR procedure to xdrgen. Unlike
the GETACL and SETACL conversions, neither direction needs a
hand-written XDR tail: GETATTR2args carries only a file handle, so
the generated nfs_acl_svc_decode_GETATTR2args decodes the argument
in full, and GETATTR2res carries only a status word and, on
success, the file attributes, so the generated
nfs_acl_svc_encode_GETATTR2res emits the entire reply. Wrapper
structures bridge the generated GETATTR2args and GETATTR2res types
and the legacy svc_fh and scratch kstat that the NFSD VFS layer
still uses.
The procedure's pc_argzero is zero because the generated decoder
writes the whole GETATTR2args, making the earlier defensive memset
of the argument buffer unnecessary.
The reply no longer carries a file handle, so the procedure
verifies the handle, captures the resulting attributes, and
releases the handle itself. GETATTR has no ACLs to release, so its
release callback is dropped entirely. Filling the fattr reuses
nfsacld_stat_to_fattr() from the GETACL conversion, so the wire
result matches what the NFSv2 GETATTR encoder already produces.
GETATTR was the last NFS-ACL v2 procedure to use the file-local
struct nfsd_attrstat and the generic struct nfsd_fhandle, so this
removes that structure definition and the two now-unused members
of the XDR storage union.
Signed-off-by: Chuck Lever <cel@kernel.org>
---
fs/nfsd/nfs2acl.c | 81 ++++++++++++++++++++++++++++-------------------
1 file changed, 48 insertions(+), 33 deletions(-)
diff --git a/fs/nfsd/nfs2acl.c b/fs/nfsd/nfs2acl.c
index 24ec141796b4..d4261ef076bd 100644
--- a/fs/nfsd/nfs2acl.c
+++ b/fs/nfsd/nfs2acl.c
@@ -35,12 +35,6 @@
struct posix_acl;
-struct nfsd_attrstat {
- __be32 status;
- struct svc_fh fh;
- struct kstat stat;
-};
-
/*
* Wrapper structures combine xdrgen types with legacy structures.
* The xdrgen field must be first so the structure can be cast
@@ -87,6 +81,20 @@ struct SETACL2res_wrapper {
static_assert(offsetof(struct SETACL2res_wrapper, xdrgen) == 0);
+struct GETATTR2args_wrapper {
+ struct GETATTR2args xdrgen;
+ struct svc_fh fh;
+};
+
+static_assert(offsetof(struct GETATTR2args_wrapper, xdrgen) == 0);
+
+struct GETATTR2res_wrapper {
+ struct GETATTR2res xdrgen;
+ struct kstat stat;
+};
+
+static_assert(offsetof(struct GETATTR2res_wrapper, xdrgen) == 0);
+
struct nfsd3_accessargs {
struct svc_fh fh;
__u32 access;
@@ -99,11 +107,6 @@ struct nfsd3_accessres {
struct kstat stat;
};
-bool nfssvc_decode_fhandleargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
-bool nfssvc_encode_attrstatres(struct svc_rqst *rqstp, struct xdr_stream *xdr);
-
-void nfssvc_release_attrstat(struct svc_rqst *rqstp);
-
bool svcxdr_decode_fhandle(struct xdr_stream *xdr, struct svc_fh *fhp);
bool svcxdr_encode_stat(struct xdr_stream *xdr, __be32 status);
bool svcxdr_encode_fattr(struct svc_rqst *rqstp, struct xdr_stream *xdr,
@@ -478,23 +481,36 @@ static __be32 nfsacld_proc_setacl(struct svc_rqst *rqstp)
goto out;
}
-/*
- * Check file attributes
+/**
+ * nfsacld_proc_getattr - GETATTR: Get the attributes of a file
+ * @rqstp: RPC transaction context
+ *
+ * Return:
+ * %rpc_success: RPC executed successfully
+ *
+ * RPC synopsis:
+ * GETATTR2res ACLPROC2_GETATTR(GETATTR2args) = 3;
*/
static __be32 nfsacld_proc_getattr(struct svc_rqst *rqstp)
{
- struct nfsd_fhandle *argp = rqstp->rq_argp;
- struct nfsd_attrstat *resp = rqstp->rq_resp;
+ struct GETATTR2args_wrapper *argp = rqstp->rq_argp;
+ struct GETATTR2res_wrapper *resp = rqstp->rq_resp;
+ struct svc_fh *fhp = &argp->fh;
- dprintk("nfsd: GETATTR %s\n", SVCFH_fmt(&argp->fh));
+ nfsacld_fhandle_to_svc_fh(fhp, &argp->xdrgen.fh);
+ dprintk("nfsd: GETATTR %s\n", SVCFH_fmt(fhp));
- fh_copy(&resp->fh, &argp->fh);
- resp->status = fh_verify(rqstp, &resp->fh, 0, NFSD_MAY_NOP);
- if (resp->status != acl2_ok)
+ resp->xdrgen.status = fh_verify(rqstp, fhp, 0, NFSD_MAY_NOP);
+ if (resp->xdrgen.status != acl2_ok)
goto out;
- resp->status = fh_getattr(&resp->fh, &resp->stat);
+ resp->xdrgen.status = fh_getattr(fhp, &resp->stat);
+
out:
- resp->status = nfsacld_map_status(resp->status);
+ if (resp->xdrgen.status == acl2_ok)
+ nfsacld_stat_to_fattr(rqstp, &resp->xdrgen.u.resok.attr,
+ &resp->stat, fhp);
+ fh_put(fhp);
+ resp->xdrgen.status = nfsacld_map_status(resp->xdrgen.status);
return rpc_success;
}
@@ -824,16 +840,15 @@ static const struct svc_procedure nfsd_acl_procedures2[5] = {
.pc_name = "SETACL",
},
[ACLPROC2_GETATTR] = {
- .pc_func = nfsacld_proc_getattr,
- .pc_decode = nfssvc_decode_fhandleargs,
- .pc_encode = nfssvc_encode_attrstatres,
- .pc_release = nfssvc_release_attrstat,
- .pc_argsize = sizeof(struct nfsd_fhandle),
- .pc_argzero = sizeof(struct nfsd_fhandle),
- .pc_ressize = sizeof(struct nfsd_attrstat),
- .pc_cachetype = RC_NOCACHE,
- .pc_xdrressize = ST+AT,
- .pc_name = "GETATTR",
+ .pc_func = nfsacld_proc_getattr,
+ .pc_decode = nfs_acl_svc_decode_GETATTR2args,
+ .pc_encode = nfs_acl_svc_encode_GETATTR2res,
+ .pc_argsize = sizeof(struct GETATTR2args_wrapper),
+ .pc_argzero = 0,
+ .pc_ressize = sizeof(struct GETATTR2res_wrapper),
+ .pc_cachetype = RC_NOCACHE,
+ .pc_xdrressize = NFS_ACL2_GETATTR2res_sz,
+ .pc_name = "GETATTR",
},
[ACLPROC2_ACCESS] = {
.pc_func = nfsacld_proc_access,
@@ -855,11 +870,11 @@ static const struct svc_procedure nfsd_acl_procedures2[5] = {
union nfsd_acl2_xdrstore {
struct GETACL2args_wrapper getaclargs;
struct SETACL2args_wrapper setaclargs;
+ struct GETATTR2args_wrapper getattrargs;
struct nfsd3_accessargs accessargs;
- struct nfsd_fhandle fhandle;
struct GETACL2res_wrapper getaclres;
struct SETACL2res_wrapper setaclres;
- struct nfsd_attrstat attrstat;
+ struct GETATTR2res_wrapper getattrres;
struct nfsd3_accessres accessres;
};
--
2.56.0
next prev parent reply other threads:[~2026-10-22 13:53 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-22 13:53 [PATCH v1 00/17] Convert server-side NFS_ACLv2 XDR to use xdrgen Chuck Lever
2026-10-22 13:53 ` [PATCH v1 01/17] xdrgen: Reject out-of-range unsigned short values on decode Chuck Lever
2026-10-22 13:53 ` [PATCH v1 02/17] xdrgen: Reject out-of-range " Chuck Lever
2026-10-22 13:53 ` [PATCH v1 03/17] nfs_common: Export posix_acl_from_nfsacl for server ACL codecs Chuck Lever
2026-10-22 13:53 ` [PATCH v1 04/17] NFSD: Remove the unused NFSACL_MAXWORDS macro Chuck Lever
2026-10-22 13:53 ` [PATCH v1 05/17] NFSD: Move the definition of NFS_ACL_MAX_ENTRIES Chuck Lever
2026-10-22 13:53 ` [PATCH v1 06/17] Documentation: Add the RPC language description of NFS_ACLv2 Chuck Lever
2026-10-22 13:53 ` [PATCH v1 07/17] NFSD: Add infrastructure for generating NFS_ACLv2 XDR encoders and decoders Chuck Lever
2026-10-22 13:53 ` [PATCH v1 08/17] NFSD: Remove '#include "xdr3.h"' from nfs2acl.c Chuck Lever
2026-10-22 13:53 ` [PATCH v1 09/17] NFSD: Remove '#include "xdr.h"' " Chuck Lever
2026-10-22 13:53 ` [PATCH v1 10/17] NFSD: Switch to using the NFS_ACLv2 status codes Chuck Lever
2026-10-22 13:53 ` [PATCH v1 11/17] NFSD: Use xdrgen XDR functions for the NFS-ACL v2 NULL procedure Chuck Lever
2026-10-22 13:53 ` [PATCH v1 12/17] NFSD: Implement NFS-ACL v2 ACL encoding and decoding with xdrgen Chuck Lever
2026-10-22 13:53 ` [PATCH v1 13/17] NFSD: Use xdrgen XDR functions for the NFS-ACL v2 GETACL procedure Chuck Lever
2026-10-22 13:53 ` [PATCH v1 14/17] NFSD: Use xdrgen XDR functions for the NFS-ACL v2 SETACL procedure Chuck Lever
2026-10-22 13:53 ` Chuck Lever [this message]
2026-10-22 13:53 ` [PATCH v1 16/17] NFSD: Use xdrgen XDR functions for the NFS-ACL v2 ACCESS procedure Chuck Lever
2026-10-22 13:53 ` [PATCH v1 17/17] NFSD: Map every NFS_ACLv2 reply status into aclstat2 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=20261022135341.14265-16-cel@kernel.org \
--to=cel@kernel.org \
--cc=dai.ngo@oracle.com \
--cc=jlayton@kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=neil@brown.name \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox