Skip to content

Commit 4a639a7

Browse files
rmacklemchucklever
authored andcommitted
NFSD: Add nfsd4_encode_fattr4_acl_trueform
Mapping between NFSv4 ACLs and POSIX ACLs is semantically imprecise: a client that sets an NFSv4 ACL and reads it back may see a different ACL than it wrote. The proposed NFSv4 POSIX ACL extension introduces the FATTR4_ACL_TRUEFORM attribute, which reports whether a file object stores its access control permissions using NFSv4 ACLs or POSIX ACLs. A client aware of this extension can avoid lossy translation by requesting and setting ACLs in their native format. When NFSD is built with CONFIG_NFSD_V4_POSIX_ACLS, report ACL_MODEL_POSIX_DRAFT for file objects on file systems with the SB_POSIXACL flag set, and ACL_MODEL_NONE otherwise. Linux file systems do not store NFSv4 ACLs natively, so ACL_MODEL_NFS4 is never reported. Signed-off-by: Rick Macklem <rmacklem@uoguelph.ca> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
1 parent 91dc464 commit 4a639a7

1 file changed

Lines changed: 26 additions & 0 deletions

File tree

fs/nfsd/nfs4xdr.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3470,6 +3470,22 @@ static __be32 nfsd4_encode_fattr4_open_arguments(struct xdr_stream *xdr,
34703470
return nfs_ok;
34713471
}
34723472

3473+
#ifdef CONFIG_NFSD_V4_POSIX_ACLS
3474+
3475+
static __be32 nfsd4_encode_fattr4_acl_trueform(struct xdr_stream *xdr,
3476+
const struct nfsd4_fattr_args *args)
3477+
{
3478+
aclmodel4 trueform = ACL_MODEL_NONE;
3479+
3480+
if (IS_POSIXACL(d_inode(args->dentry)))
3481+
trueform = ACL_MODEL_POSIX_DRAFT;
3482+
if (!xdrgen_encode_aclmodel4(xdr, trueform))
3483+
return nfserr_resource;
3484+
return nfs_ok;
3485+
}
3486+
3487+
#endif /* CONFIG_NFSD_V4_POSIX_ACLS */
3488+
34733489
static const nfsd4_enc_attr nfsd4_enc_fattr4_encode_ops[] = {
34743490
[FATTR4_SUPPORTED_ATTRS] = nfsd4_encode_fattr4_supported_attrs,
34753491
[FATTR4_TYPE] = nfsd4_encode_fattr4_type,
@@ -3573,6 +3589,16 @@ static const nfsd4_enc_attr nfsd4_enc_fattr4_encode_ops[] = {
35733589
[FATTR4_TIME_DELEG_ACCESS] = nfsd4_encode_fattr4__inval,
35743590
[FATTR4_TIME_DELEG_MODIFY] = nfsd4_encode_fattr4__inval,
35753591
[FATTR4_OPEN_ARGUMENTS] = nfsd4_encode_fattr4_open_arguments,
3592+
3593+
/* Reserved */
3594+
[87] = nfsd4_encode_fattr4__inval,
3595+
[88] = nfsd4_encode_fattr4__inval,
3596+
3597+
#ifdef CONFIG_NFSD_V4_POSIX_ACLS
3598+
[FATTR4_ACL_TRUEFORM] = nfsd4_encode_fattr4_acl_trueform,
3599+
#else
3600+
[FATTR4_ACL_TRUEFORM] = nfsd4_encode_fattr4__noop,
3601+
#endif
35763602
};
35773603

35783604
/*

0 commit comments

Comments
 (0)