All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chuck Lever <chuck.lever@oracle.com>
To: linux-nfs@vger.kernel.org
Subject: [PATCH v2 33/43] NFSD: Add an xdr_stream-based encoder for NFSv2/3 ACLs
Date: Sat, 06 Mar 2021 17:32:31 -0500	[thread overview]
Message-ID: <161506995167.4312.487114288405058622.stgit@klimt.1015granger.net> (raw)
In-Reply-To: <161506956174.4312.17478383686779759287.stgit@klimt.1015granger.net>

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/nfs_common/nfsacl.c |   71 ++++++++++++++++++++++++++++++++++++++++++++++++
 include/linux/nfsacl.h |    3 ++
 2 files changed, 74 insertions(+)

diff --git a/fs/nfs_common/nfsacl.c b/fs/nfs_common/nfsacl.c
index 79c563c1a5e8..5a5bd85d08f8 100644
--- a/fs/nfs_common/nfsacl.c
+++ b/fs/nfs_common/nfsacl.c
@@ -136,6 +136,77 @@ int nfsacl_encode(struct xdr_buf *buf, unsigned int base, struct inode *inode,
 }
 EXPORT_SYMBOL_GPL(nfsacl_encode);
 
+/**
+ * nfs_stream_encode_acl - Encode an NFSv3 ACL
+ *
+ * @xdr: an xdr_stream positioned to receive an encoded ACL
+ * @inode: inode of file whose ACL this is
+ * @acl: posix_acl to encode
+ * @encode_entries: whether to encode ACEs as well
+ * @typeflag: ACL type: NFS_ACL_DEFAULT or zero
+ *
+ * Return values:
+ *   %false: The ACL could not be encoded
+ *   %true: @xdr is advanced to the next available position
+ */
+bool nfs_stream_encode_acl(struct xdr_stream *xdr, struct inode *inode,
+			   struct posix_acl *acl, int encode_entries,
+			   int typeflag)
+{
+	const size_t elem_size = XDR_UNIT * 3;
+	u32 entries = (acl && acl->a_count) ? max_t(int, acl->a_count, 4) : 0;
+	struct nfsacl_encode_desc nfsacl_desc = {
+		.desc = {
+			.elem_size = elem_size,
+			.array_len = encode_entries ? entries : 0,
+			.xcode = xdr_nfsace_encode,
+		},
+		.acl = acl,
+		.typeflag = typeflag,
+		.uid = inode->i_uid,
+		.gid = inode->i_gid,
+	};
+	struct nfsacl_simple_acl aclbuf;
+	unsigned int base;
+	int err;
+
+	if (entries > NFS_ACL_MAX_ENTRIES)
+		return false;
+	if (xdr_stream_encode_u32(xdr, entries) < 0)
+		return false;
+
+	if (encode_entries && acl && acl->a_count == 3) {
+		struct posix_acl *acl2 = &aclbuf.acl;
+
+		/* Avoid the use of posix_acl_alloc().  nfsacl_encode() is
+		 * invoked in contexts where a memory allocation failure is
+		 * fatal.  Fortunately this fake ACL is small enough to
+		 * construct on the stack. */
+		posix_acl_init(acl2, 4);
+
+		/* Insert entries in canonical order: other orders seem
+		 to confuse Solaris VxFS. */
+		acl2->a_entries[0] = acl->a_entries[0];  /* ACL_USER_OBJ */
+		acl2->a_entries[1] = acl->a_entries[1];  /* ACL_GROUP_OBJ */
+		acl2->a_entries[2] = acl->a_entries[1];  /* ACL_MASK */
+		acl2->a_entries[2].e_tag = ACL_MASK;
+		acl2->a_entries[3] = acl->a_entries[2];  /* ACL_OTHER */
+		nfsacl_desc.acl = acl2;
+	}
+
+	base = xdr_stream_pos(xdr);
+	if (!xdr_reserve_space(xdr, XDR_UNIT +
+			       elem_size * nfsacl_desc.desc.array_len))
+		return false;
+	err = xdr_encode_array2(xdr->buf, base, &nfsacl_desc.desc);
+	if (err)
+		return false;
+
+	return true;
+}
+EXPORT_SYMBOL_GPL(nfs_stream_encode_acl);
+
+
 struct nfsacl_decode_desc {
 	struct xdr_array2_desc desc;
 	unsigned int count;
diff --git a/include/linux/nfsacl.h b/include/linux/nfsacl.h
index 0ba99c513649..8e76a79cdc6a 100644
--- a/include/linux/nfsacl.h
+++ b/include/linux/nfsacl.h
@@ -41,5 +41,8 @@ nfsacl_decode(struct xdr_buf *buf, unsigned int base, unsigned int *aclcnt,
 extern bool
 nfs_stream_decode_acl(struct xdr_stream *xdr, unsigned int *aclcnt,
 		      struct posix_acl **pacl);
+extern bool
+nfs_stream_encode_acl(struct xdr_stream *xdr, struct inode *inode,
+		      struct posix_acl *acl, int encode_entries, int typeflag);
 
 #endif  /* __LINUX_NFSACL_H */



  parent reply	other threads:[~2021-03-06 22:33 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-06 22:29 [PATCH v2 00/43] NFSv2/3 XDR encoder overhaul Chuck Lever
2021-03-06 22:29 ` [PATCH v2 01/43] NFSD: Extract the svcxdr_init_encode() helper Chuck Lever
2021-03-06 22:29 ` [PATCH v2 02/43] NFSD: Update the GETATTR3res encoder to use struct xdr_stream Chuck Lever
2021-03-06 22:29 ` [PATCH v2 03/43] NFSD: Update the NFSv3 ACCESS3res " Chuck Lever
2021-03-06 22:29 ` [PATCH v2 04/43] NFSD: Update the NFSv3 LOOKUP3res " Chuck Lever
2021-03-06 22:29 ` [PATCH v2 05/43] NFSD: Update the NFSv3 wccstat result " Chuck Lever
2021-03-06 22:29 ` [PATCH v2 06/43] NFSD: Update the NFSv3 READLINK3res " Chuck Lever
2021-03-06 22:29 ` [PATCH v2 07/43] NFSD: Update the NFSv3 READ3res encode " Chuck Lever
2021-03-06 22:30 ` [PATCH v2 08/43] NFSD: Update the NFSv3 WRITE3res encoder " Chuck Lever
2021-03-06 22:30 ` [PATCH v2 09/43] NFSD: Update the NFSv3 CREATE family of encoders " Chuck Lever
2021-03-06 22:30 ` [PATCH v2 10/43] NFSD: Update the NFSv3 RENAMEv3res encoder " Chuck Lever
2021-03-06 22:30 ` [PATCH v2 11/43] NFSD: Update the NFSv3 LINK3res " Chuck Lever
2021-03-06 22:30 ` [PATCH v2 12/43] NFSD: Update the NFSv3 FSSTAT3res " Chuck Lever
2021-03-06 22:30 ` [PATCH v2 13/43] NFSD: Update the NFSv3 FSINFO3res " Chuck Lever
2021-03-06 22:30 ` [PATCH v2 14/43] NFSD: Update the NFSv3 PATHCONF3res " Chuck Lever
2021-03-06 22:30 ` [PATCH v2 15/43] NFSD: Update the NFSv3 COMMIT3res " Chuck Lever
2021-03-06 22:30 ` [PATCH v2 16/43] NFSD: Add a helper that encodes NFSv3 directory offset cookies Chuck Lever
2021-03-06 22:30 ` [PATCH v2 17/43] NFSD: Count bytes instead of pages in the NFSv3 READDIR encoder Chuck Lever
2021-03-06 22:31 ` [PATCH v2 18/43] NFSD: Update the NFSv3 READDIR3res encoder to use struct xdr_stream Chuck Lever
2021-03-06 22:31 ` [PATCH v2 19/43] NFSD: Update NFSv3 READDIR entry encoders " Chuck Lever
2021-03-06 22:31 ` [PATCH v2 20/43] NFSD: Remove unused NFSv3 directory entry encoders Chuck Lever
2021-03-06 22:31 ` [PATCH v2 21/43] NFSD: Reduce svc_rqst::rq_pages churn during READDIR operations Chuck Lever
2021-03-06 22:31 ` [PATCH v2 22/43] NFSD: Update the NFSv2 stat encoder to use struct xdr_stream Chuck Lever
2021-03-06 22:31 ` [PATCH v2 23/43] NFSD: Update the NFSv2 attrstat " Chuck Lever
2021-03-06 22:31 ` [PATCH v2 24/43] NFSD: Update the NFSv2 diropres " Chuck Lever
2021-03-06 22:31 ` [PATCH v2 25/43] NFSD: Update the NFSv2 READLINK result " Chuck Lever
2021-03-06 22:31 ` [PATCH v2 26/43] NFSD: Update the NFSv2 READ " Chuck Lever
2021-03-06 22:31 ` [PATCH v2 27/43] NFSD: Update the NFSv2 STATFS " Chuck Lever
2021-03-06 22:32 ` [PATCH v2 28/43] NFSD: Add a helper that encodes NFSv3 directory offset cookies Chuck Lever
2021-03-06 22:32 ` [PATCH v2 29/43] NFSD: Count bytes instead of pages in the NFSv2 READDIR encoder Chuck Lever
2021-03-06 22:32 ` [PATCH v2 30/43] NFSD: Update the NFSv2 READDIR result encoder to use struct xdr_stream Chuck Lever
2021-03-06 22:32 ` [PATCH v2 31/43] NFSD: Update the NFSv2 READDIR entry " Chuck Lever
2021-03-06 22:32 ` [PATCH v2 32/43] NFSD: Remove unused NFSv2 directory entry encoders Chuck Lever
2021-03-06 22:32 ` Chuck Lever [this message]
2021-03-06 22:32 ` [PATCH v2 34/43] NFSD: Update the NFSv2 GETACL result encoder to use struct xdr_stream Chuck Lever
2021-03-06 22:32 ` [PATCH v2 35/43] NFSD: Update the NFSv2 SETACL " Chuck Lever
2021-03-06 22:32 ` [PATCH v2 36/43] NFSD: Update the NFSv2 ACL GETATTR " Chuck Lever
2021-03-06 22:32 ` [PATCH v2 37/43] NFSD: Update the NFSv2 ACL ACCESS " Chuck Lever
2021-03-06 22:33 ` [PATCH v2 38/43] NFSD: Clean up after updating NFSv2 ACL encoders Chuck Lever
2021-03-06 22:33 ` [PATCH v2 39/43] NFSD: Update the NFSv3 GETACL result encoder to use struct xdr_stream Chuck Lever
2021-03-06 22:33 ` [PATCH v2 40/43] NFSD: Update the NFSv3 SETACL " Chuck Lever
2021-03-06 22:33 ` [PATCH v2 41/43] NFSD: Clean up after updating NFSv3 ACL encoders Chuck Lever
2021-03-06 22:33 ` [PATCH v2 42/43] NFSD: Add a tracepoint to record directory entry encoding Chuck Lever
2021-03-06 22:33 ` [PATCH v2 43/43] NFSD: Clean up NFSDDBG_FACILITY macro 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=161506995167.4312.487114288405058622.stgit@klimt.1015granger.net \
    --to=chuck.lever@oracle.com \
    --cc=linux-nfs@vger.kernel.org \
    /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.