linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andreas Gruenbacher <agruenba@redhat.com>
To: Alexander Viro <viro@zeniv.linux.org.uk>,
	"Theodore Ts'o" <tytso@mit.edu>,
	Andreas Dilger <adilger.kernel@dilger.ca>,
	"J. Bruce Fields" <bfields@fieldses.org>,
	Jeff Layton <jlayton@poochiereds.net>,
	Trond Myklebust <trond.myklebust@primarydata.com>,
	Anna Schumaker <anna.schumaker@netapp.com>,
	Dave Chinner <david@fromorbit.com>,
	linux-ext4@vger.kernel.org, xfs@oss.sgi.com,
	linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org,
	linux-api@vger.kernel.org
Cc: Andreas Gruenbacher <agruenba@redhat.com>
Subject: [PATCH v12 24/49] xfs: Change how listxattr generates synthetic attributes
Date: Fri, 23 Oct 2015 20:41:37 +0200	[thread overview]
Message-ID: <1445625722-13791-25-git-send-email-agruenba@redhat.com> (raw)
In-Reply-To: <1445625722-13791-1-git-send-email-agruenba@redhat.com>

Instead of adding the synthesized POSIX ACL attribute names after listing all
non-synthesized attributes, generate them immediately when listing the
non-synthesized attributes.

In addition, merge xfs_xattr_put_listent and xfs_xattr_put_listent_sizes to
ensure that the list size is computed correctly; the split version was
overestimating the list size for non-root users.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
---
 fs/xfs/xfs_acl.c   |  23 ---------
 fs/xfs/xfs_acl.h   |   4 --
 fs/xfs/xfs_xattr.c | 137 +++++++++++++++++++++++------------------------------
 3 files changed, 59 insertions(+), 105 deletions(-)

diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c
index 7b03383..778a464 100644
--- a/fs/xfs/xfs_acl.c
+++ b/fs/xfs/xfs_acl.c
@@ -231,29 +231,6 @@ __xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
 	return error;
 }
 
-static int
-xfs_acl_exists(struct inode *inode, unsigned char *name)
-{
-	int len = XFS_ACL_MAX_SIZE(XFS_M(inode->i_sb));
-
-	return (xfs_attr_get(XFS_I(inode), name, NULL, &len,
-			    ATTR_ROOT|ATTR_KERNOVAL) == 0);
-}
-
-int
-posix_acl_access_exists(struct inode *inode)
-{
-	return xfs_acl_exists(inode, SGI_ACL_FILE);
-}
-
-int
-posix_acl_default_exists(struct inode *inode)
-{
-	if (!S_ISDIR(inode->i_mode))
-		return 0;
-	return xfs_acl_exists(inode, SGI_ACL_DEFAULT);
-}
-
 int
 xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 {
diff --git a/fs/xfs/xfs_acl.h b/fs/xfs/xfs_acl.h
index 9ee0a0d..cf973f5 100644
--- a/fs/xfs/xfs_acl.h
+++ b/fs/xfs/xfs_acl.h
@@ -24,15 +24,11 @@ struct posix_acl;
 #ifdef CONFIG_XFS_POSIX_ACL
 extern struct posix_acl *xfs_get_acl(struct inode *inode, int type);
 extern int xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type);
-extern int posix_acl_access_exists(struct inode *inode);
-extern int posix_acl_default_exists(struct inode *inode);
 #else
 static inline struct posix_acl *xfs_get_acl(struct inode *inode, int type)
 {
 	return NULL;
 }
 # define xfs_set_acl					NULL
-# define posix_acl_access_exists(inode)			0
-# define posix_acl_default_exists(inode)		0
 #endif /* CONFIG_XFS_POSIX_ACL */
 #endif	/* __XFS_ACL_H__ */
diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c
index c0368151..8428aed 100644
--- a/fs/xfs/xfs_xattr.c
+++ b/fs/xfs/xfs_xattr.c
@@ -106,47 +106,19 @@ const struct xattr_handler *xfs_xattr_handlers[] = {
 	NULL
 };
 
-static unsigned int xfs_xattr_prefix_len(int flags)
-{
-	if (flags & XFS_ATTR_SECURE)
-		return sizeof("security");
-	else if (flags & XFS_ATTR_ROOT)
-		return sizeof("trusted");
-	else
-		return sizeof("user");
-}
-
-static const char *xfs_xattr_prefix(int flags)
-{
-	if (flags & XFS_ATTR_SECURE)
-		return xfs_xattr_security_handler.prefix;
-	else if (flags & XFS_ATTR_ROOT)
-		return xfs_xattr_trusted_handler.prefix;
-	else
-		return xfs_xattr_user_handler.prefix;
-}
-
 static int
-xfs_xattr_put_listent(
+__xfs_xattr_put_listent(
 	struct xfs_attr_list_context *context,
-	int		flags,
-	unsigned char	*name,
-	int		namelen,
-	int		valuelen,
-	unsigned char	*value)
+	char *prefix,
+	int prefix_len,
+	unsigned char *name,
+	int namelen)
 {
-	unsigned int prefix_len = xfs_xattr_prefix_len(flags);
 	char *offset;
 	int arraytop;
 
-	ASSERT(context->count >= 0);
-
-	/*
-	 * Only show root namespace entries if we are actually allowed to
-	 * see them.
-	 */
-	if ((flags & XFS_ATTR_ROOT) && !capable(CAP_SYS_ADMIN))
-		return 0;
+	if (!context->alist)
+		goto compute_size;
 
 	arraytop = context->count + prefix_len + namelen + 1;
 	if (arraytop > context->firstu) {
@@ -154,17 +126,19 @@ xfs_xattr_put_listent(
 		return 1;
 	}
 	offset = (char *)context->alist + context->count;
-	strncpy(offset, xfs_xattr_prefix(flags), prefix_len);
+	strncpy(offset, prefix, prefix_len);
 	offset += prefix_len;
 	strncpy(offset, (char *)name, namelen);			/* real name */
 	offset += namelen;
 	*offset = '\0';
+
+compute_size:
 	context->count += prefix_len + namelen + 1;
 	return 0;
 }
 
 static int
-xfs_xattr_put_listent_sizes(
+xfs_xattr_put_listent(
 	struct xfs_attr_list_context *context,
 	int		flags,
 	unsigned char	*name,
@@ -172,24 +146,55 @@ xfs_xattr_put_listent_sizes(
 	int		valuelen,
 	unsigned char	*value)
 {
-	context->count += xfs_xattr_prefix_len(flags) + namelen + 1;
-	return 0;
-}
+	char *prefix;
+	int prefix_len;
 
-static int
-list_one_attr(const char *name, const size_t len, void *data,
-		size_t size, ssize_t *result)
-{
-	char *p = data + *result;
+	ASSERT(context->count >= 0);
 
-	*result += len;
-	if (!size)
-		return 0;
-	if (*result > size)
-		return -ERANGE;
+	if (flags & XFS_ATTR_ROOT) {
+#ifdef CONFIG_XFS_POSIX_ACL
+		if (namelen == SGI_ACL_FILE_SIZE &&
+		    strncmp(name, SGI_ACL_FILE,
+			    SGI_ACL_FILE_SIZE) == 0) {
+			int ret = __xfs_xattr_put_listent(
+					context, XATTR_SYSTEM_PREFIX,
+					XATTR_SYSTEM_PREFIX_LEN,
+					XATTR_POSIX_ACL_ACCESS,
+					strlen(XATTR_POSIX_ACL_ACCESS));
+			if (ret)
+				return ret;
+		} else if (namelen == SGI_ACL_DEFAULT_SIZE &&
+			 strncmp(name, SGI_ACL_DEFAULT,
+				 SGI_ACL_DEFAULT_SIZE) == 0) {
+			int ret = __xfs_xattr_put_listent(
+					context, XATTR_SYSTEM_PREFIX,
+					XATTR_SYSTEM_PREFIX_LEN,
+					XATTR_POSIX_ACL_DEFAULT,
+					strlen(XATTR_POSIX_ACL_DEFAULT));
+			if (ret)
+				return ret;
+		}
+#endif
 
-	strcpy(p, name);
-	return 0;
+		/*
+		 * Only show root namespace entries if we are actually allowed to
+		 * see them.
+		 */
+		if (!capable(CAP_SYS_ADMIN))
+			return 0;
+
+		prefix = XATTR_TRUSTED_PREFIX;
+		prefix_len = XATTR_TRUSTED_PREFIX_LEN;
+	} else if (flags & XFS_ATTR_SECURE) {
+		prefix = XATTR_SECURITY_PREFIX;
+		prefix_len = XATTR_SECURITY_PREFIX_LEN;
+	} else {
+		prefix = XATTR_USER_PREFIX;
+		prefix_len = XATTR_USER_PREFIX_LEN;
+	}
+
+	return __xfs_xattr_put_listent(context, prefix, prefix_len, name,
+				       namelen);
 }
 
 ssize_t
@@ -198,7 +203,6 @@ xfs_vn_listxattr(struct dentry *dentry, char *data, size_t size)
 	struct xfs_attr_list_context context;
 	struct attrlist_cursor_kern cursor = { 0 };
 	struct inode		*inode = d_inode(dentry);
-	int			error;
 
 	/*
 	 * First read the regular on-disk attributes.
@@ -207,37 +211,14 @@ xfs_vn_listxattr(struct dentry *dentry, char *data, size_t size)
 	context.dp = XFS_I(inode);
 	context.cursor = &cursor;
 	context.resynch = 1;
-	context.alist = data;
+	context.alist = size ? data : NULL;
 	context.bufsize = size;
 	context.firstu = context.bufsize;
-
-	if (size)
-		context.put_listent = xfs_xattr_put_listent;
-	else
-		context.put_listent = xfs_xattr_put_listent_sizes;
+	context.put_listent = xfs_xattr_put_listent;
 
 	xfs_attr_list_int(&context);
 	if (context.count < 0)
 		return -ERANGE;
 
-	/*
-	 * Then add the two synthetic ACL attributes.
-	 */
-	if (posix_acl_access_exists(inode)) {
-		error = list_one_attr(POSIX_ACL_XATTR_ACCESS,
-				strlen(POSIX_ACL_XATTR_ACCESS) + 1,
-				data, size, &context.count);
-		if (error)
-			return error;
-	}
-
-	if (posix_acl_default_exists(inode)) {
-		error = list_one_attr(POSIX_ACL_XATTR_DEFAULT,
-				strlen(POSIX_ACL_XATTR_DEFAULT) + 1,
-				data, size, &context.count);
-		if (error)
-			return error;
-	}
-
 	return context.count;
 }
-- 
2.5.0


  parent reply	other threads:[~2015-10-23 18:44 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-23 18:41 [PATCH v12 00/49] Richacls Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 01/49] vfs: Add IS_ACL() and IS_RICHACL() tests Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 02/49] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 03/49] vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD " Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 04/49] vfs: Make the inode passed to inode_change_ok non-const Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 05/49] vfs: Add permission flags for setting file attributes Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 06/49] richacl: In-memory representation and helper functions Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 07/49] richacl: Permission mapping functions Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 08/49] richacl: Compute maximum file masks from an acl Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 09/49] richacl: Permission check algorithm Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 10/49] vfs: Cache base_acl objects in inodes Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 11/49] vfs: Add get_richacl and set_richacl inode operations Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 12/49] vfs: Cache richacl in struct inode Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 13/49] richacl: Update the file masks in chmod() Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 14/49] richacl: Check if an acl is equivalent to a file mode Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 15/49] richacl: Create-time inheritance Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 16/49] richacl: Automatic Inheritance Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 17/49] richacl: xattr mapping functions Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 18/49] richacl: Add richacl xattr handler Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 19/49] vfs: Add richacl permission checking Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 20/49] ext4: Add richacl support Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 21/49] ext4: Add richacl feature flag Andreas Gruenbacher
2015-10-23 19:34   ` Austin S Hemmelgarn
2015-10-23 18:41 ` [PATCH v12 22/49] xfs: Fix error path in xfs_get_acl Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 23/49] xfs: Make xfs_set_mode non-static Andreas Gruenbacher
2015-10-23 18:41 ` Andreas Gruenbacher [this message]
2015-10-23 18:41 ` [PATCH v12 25/49] xfs: Add richacl support Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 26/49] richacl: acl editing helper functions Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 27/49] richacl: Move everyone@ aces down the acl Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 28/49] richacl: Propagate everyone@ permissions to other aces Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 29/49] richacl: Set the owner permissions to the owner mask Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 30/49] richacl: Set the other permissions to the other mask Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 31/49] richacl: Isolate the owner and group classes Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 32/49] richacl: Apply the file masks to a richacl Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 33/49] richacl: Create richacl from mode values Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 34/49] nfsd: Keep list of acls to dispose of in compoundargs Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 35/49] nfsd: Use richacls as internal acl representation Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 36/49] nfsd: Add richacl support Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 37/49] nfsd: Add support for the v4.1 dacl attribute Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 38/49] nfsd: Add support for the MAY_CREATE_{FILE,DIR} permissions Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 39/49] richacl: Add support for unmapped identifiers Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 40/49] nfsd: Add support for unmapped richace identifiers Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 41/49] ext4: Don't allow unmapped identifiers in richacls Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 42/49] xfs: " Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 43/49] sunrpc: Allow to demand-allocate pages to encode into Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 44/49] sunrpc: Add xdr_init_encode_pages Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 45/49] nfs: Fix GETATTR bitmap verification Andreas Gruenbacher
2015-10-23 18:41 ` [PATCH v12 46/49] nfs: Remove unused xdr page offsets in getacl/setacl arguments Andreas Gruenbacher
2015-10-23 18:42 ` [PATCH v12 47/49] nfs: Distinguish missing users and groups from nobody Andreas Gruenbacher
2015-10-23 18:42 ` [PATCH v12 48/49] nfs: Add richacl support Andreas Gruenbacher
2015-10-23 18:42 ` [PATCH v12 49/49] nfs: Add support for the v4.1 dacl attribute Andreas Gruenbacher
2015-10-23 20:03 ` [PATCH v12 00/49] Richacls Frank Filz

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=1445625722-13791-25-git-send-email-agruenba@redhat.com \
    --to=agruenba@redhat.com \
    --cc=adilger.kernel@dilger.ca \
    --cc=anna.schumaker@netapp.com \
    --cc=bfields@fieldses.org \
    --cc=david@fromorbit.com \
    --cc=jlayton@poochiereds.net \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=trond.myklebust@primarydata.com \
    --cc=tytso@mit.edu \
    --cc=viro@zeniv.linux.org.uk \
    --cc=xfs@oss.sgi.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;
as well as URLs for NNTP newsgroup(s).