The branch main has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=8e2a90ac8089e168f71d797f8b3b67659f72c7af
commit 8e2a90ac8089e168f71d797f8b3b67659f72c7af Author: Rick Macklem <rmack...@freebsd.org> AuthorDate: 2025-06-26 20:22:53 +0000 Commit: Rick Macklem <rmack...@freebsd.org> CommitDate: 2025-06-26 20:22:53 +0000 nfscommon: Factor out conversion of ae_perm to NFSv4 ACE flags This patch factors the code that converts the ae_perm bits in an NFSv4 style ACL to the NFSv4 on-the-wire format into a separate function. This function will be used by the NFSv4 server in a future commit. This patch should not change NFSv4 semantics. --- sys/fs/nfs/nfs_commonacl.c | 64 +++++++++++++++++++++++++++------------------- sys/fs/nfs/nfs_var.h | 1 + 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/sys/fs/nfs/nfs_commonacl.c b/sys/fs/nfs/nfs_commonacl.c index 55e6f89dd8ec..69afa8d41712 100644 --- a/sys/fs/nfs/nfs_commonacl.c +++ b/sys/fs/nfs/nfs_commonacl.c @@ -352,32 +352,7 @@ nfsrv_buildace(struct nfsrv_descript *nd, u_char *name, int namelen, if (ace->ae_perm & ACL_SYNCHRONIZE) acemask |= NFSV4ACE_SYNCHRONIZE; } else { - if (ace->ae_perm & ACL_READ_DATA) - acemask |= NFSV4ACE_READDATA; - if (ace->ae_perm & ACL_WRITE_DATA) - acemask |= NFSV4ACE_WRITEDATA; - if (ace->ae_perm & ACL_APPEND_DATA) - acemask |= NFSV4ACE_APPENDDATA; - if (ace->ae_perm & ACL_READ_NAMED_ATTRS) - acemask |= NFSV4ACE_READNAMEDATTR; - if (ace->ae_perm & ACL_WRITE_NAMED_ATTRS) - acemask |= NFSV4ACE_WRITENAMEDATTR; - if (ace->ae_perm & ACL_EXECUTE) - acemask |= NFSV4ACE_EXECUTE; - if (ace->ae_perm & ACL_READ_ATTRIBUTES) - acemask |= NFSV4ACE_READATTRIBUTES; - if (ace->ae_perm & ACL_WRITE_ATTRIBUTES) - acemask |= NFSV4ACE_WRITEATTRIBUTES; - if (ace->ae_perm & ACL_DELETE) - acemask |= NFSV4ACE_DELETE; - if (ace->ae_perm & ACL_READ_ACL) - acemask |= NFSV4ACE_READACL; - if (ace->ae_perm & ACL_WRITE_ACL) - acemask |= NFSV4ACE_WRITEACL; - if (ace->ae_perm & ACL_WRITE_OWNER) - acemask |= NFSV4ACE_WRITEOWNER; - if (ace->ae_perm & ACL_SYNCHRONIZE) - acemask |= NFSV4ACE_SYNCHRONIZE; + acemask = nfs_aceperm(ace->ae_perm); } *tl++ = txdr_unsigned(acemask); *tl++ = txdr_unsigned(namelen); @@ -387,6 +362,43 @@ nfsrv_buildace(struct nfsrv_descript *nd, u_char *name, int namelen, return (full_len + 4 * NFSX_UNSIGNED); } +/* + * Convert ae_perm to NFSv4 ACL acemask4 for regular files. + */ +uint32_t +nfs_aceperm(acl_perm_t ae_perm) +{ + uint32_t acemask = 0x0; + + if (ae_perm & ACL_READ_DATA) + acemask |= NFSV4ACE_READDATA; + if (ae_perm & ACL_WRITE_DATA) + acemask |= NFSV4ACE_WRITEDATA; + if (ae_perm & ACL_APPEND_DATA) + acemask |= NFSV4ACE_APPENDDATA; + if (ae_perm & ACL_READ_NAMED_ATTRS) + acemask |= NFSV4ACE_READNAMEDATTR; + if (ae_perm & ACL_WRITE_NAMED_ATTRS) + acemask |= NFSV4ACE_WRITENAMEDATTR; + if (ae_perm & ACL_EXECUTE) + acemask |= NFSV4ACE_EXECUTE; + if (ae_perm & ACL_READ_ATTRIBUTES) + acemask |= NFSV4ACE_READATTRIBUTES; + if (ae_perm & ACL_WRITE_ATTRIBUTES) + acemask |= NFSV4ACE_WRITEATTRIBUTES; + if (ae_perm & ACL_DELETE) + acemask |= NFSV4ACE_DELETE; + if (ae_perm & ACL_READ_ACL) + acemask |= NFSV4ACE_READACL; + if (ae_perm & ACL_WRITE_ACL) + acemask |= NFSV4ACE_WRITEACL; + if (ae_perm & ACL_WRITE_OWNER) + acemask |= NFSV4ACE_WRITEOWNER; + if (ae_perm & ACL_SYNCHRONIZE) + acemask |= NFSV4ACE_SYNCHRONIZE; + return (acemask); +} + /* * Build an NFSv4 ACL. */ diff --git a/sys/fs/nfs/nfs_var.h b/sys/fs/nfs/nfs_var.h index 626946a70774..7206d12bd6fa 100644 --- a/sys/fs/nfs/nfs_var.h +++ b/sys/fs/nfs/nfs_var.h @@ -439,6 +439,7 @@ int nfs_supportsnfsv4acls(vnode_t); /* nfs_commonacl.c */ int nfsrv_dissectace(struct nfsrv_descript *, struct acl_entry *, bool, int *, int *, NFSPROC_T *); +uint32_t nfs_aceperm(acl_perm_t); int nfsrv_buildacl(struct nfsrv_descript *, NFSACL_T *, __enum_uint8(vtype), NFSPROC_T *); int nfsrv_compareacl(NFSACL_T *, NFSACL_T *);