All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andreas Gruenbacher <agruenba@redhat.com>
To: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Andreas Gruenbacher <agruenba@redhat.com>,
	Christoph Hellwig <hch@infradead.org>,
	"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, linux-xfs@vger.kernel.org,
	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
Subject: [PATCH v28 17/21] richacl: Add richacl xattr handler
Date: Mon, 13 Feb 2017 16:32:33 +0100	[thread overview]
Message-ID: <1486999957-2381-18-git-send-email-agruenba@redhat.com> (raw)
In-Reply-To: <1486999957-2381-1-git-send-email-agruenba@redhat.com>

Add richacl xattr handler implementing the xattr operations based on the
get_richacl and set_richacl inode operations.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
---
 fs/richacl.c                  | 22 ++++++++++++++++
 fs/richacl_xattr.c            | 61 +++++++++++++++++++++++++++++++++++++++++++
 include/linux/richacl.h       |  1 +
 include/linux/richacl_xattr.h |  2 ++
 4 files changed, 86 insertions(+)

diff --git a/fs/richacl.c b/fs/richacl.c
index 4edce8b..1945691 100644
--- a/fs/richacl.c
+++ b/fs/richacl.c
@@ -543,6 +543,28 @@ void richacl_compute_max_masks(struct richacl *acl)
 EXPORT_SYMBOL_GPL(richacl_compute_max_masks);
 
 /**
+ * set_richacl  -  set the richacl of an inode
+ * @inode:	inode whose richacl to set
+ * @acl:	access control list
+ */
+int
+set_richacl(struct inode *inode, struct richacl *acl)
+{
+	if (!IS_RICHACL(inode))
+		return -EOPNOTSUPP;
+	if (!inode->i_op->set_richacl)
+		return -EOPNOTSUPP;
+
+	if (!uid_eq(current_fsuid(), inode->i_uid) &&
+	    inode_permission(inode, MAY_CHMOD) &&
+	    !capable(CAP_FOWNER))
+		return -EPERM;
+
+	return inode->i_op->set_richacl(inode, acl);
+}
+EXPORT_SYMBOL(set_richacl);
+
+/**
  * __richacl_chmod  -  update the file masks to reflect the new mode
  * @acl:	access control list
  * @mode:	new file permission bits including the file type
diff --git a/fs/richacl_xattr.c b/fs/richacl_xattr.c
index dc1ad36..5eb4aba 100644
--- a/fs/richacl_xattr.c
+++ b/fs/richacl_xattr.c
@@ -18,7 +18,9 @@
 #include <linux/fs.h>
 #include <linux/slab.h>
 #include <linux/module.h>
+#include <linux/xattr.h>
 #include <linux/richacl_xattr.h>
+#include <uapi/linux/xattr.h>
 
 /**
  * richacl_from_xattr  -  convert a richacl xattr into the in-memory representation
@@ -159,3 +161,62 @@ richacl_to_xattr(struct user_namespace *user_ns,
 	return real_size;
 }
 EXPORT_SYMBOL_GPL(richacl_to_xattr);
+
+static bool
+richacl_xattr_list(struct dentry *dentry)
+{
+	return IS_RICHACL(d_backing_inode(dentry));
+}
+
+static int
+richacl_xattr_get(const struct xattr_handler *handler,
+		  struct dentry *unused, struct inode *inode,
+		  const char *name, void *buffer, size_t buffer_size)
+{
+	struct richacl *acl;
+	int error;
+
+	if (*name)
+		return -EINVAL;
+	if (!IS_RICHACL(inode))
+		return -EOPNOTSUPP;
+	if (S_ISLNK(inode->i_mode))
+		return -EOPNOTSUPP;
+	acl = get_richacl(inode);
+	if (IS_ERR(acl))
+		return PTR_ERR(acl);
+	if (acl == NULL)
+		return -ENODATA;
+	error = richacl_to_xattr(current_user_ns(), acl, buffer, buffer_size);
+	richacl_put(acl);
+	return error;
+}
+
+static int
+richacl_xattr_set(const struct xattr_handler *handler,
+		  struct dentry *unused, struct inode *inode,
+		  const char *name, const void *value, size_t size,
+		  int flags)
+{
+	struct richacl *acl = NULL;
+	int ret;
+
+	if (value) {
+		acl = richacl_from_xattr(current_user_ns(), value, size,
+					 -EINVAL);
+		if (IS_ERR(acl))
+			return PTR_ERR(acl);
+	}
+
+	ret = set_richacl(inode, acl);
+	richacl_put(acl);
+	return ret;
+}
+
+struct xattr_handler richacl_xattr_handler = {
+	.name = XATTR_NAME_RICHACL,
+	.list = richacl_xattr_list,
+	.get = richacl_xattr_get,
+	.set = richacl_xattr_set,
+};
+EXPORT_SYMBOL(richacl_xattr_handler);
diff --git a/include/linux/richacl.h b/include/linux/richacl.h
index 737513b..7530920 100644
--- a/include/linux/richacl.h
+++ b/include/linux/richacl.h
@@ -205,5 +205,6 @@ extern int richacl_chmod(struct inode *, umode_t);
 extern int richacl_equiv_mode(const struct richacl *, umode_t *);
 extern struct richacl *richacl_inherit(const struct richacl *, int);
 extern struct richacl *richacl_create(umode_t *, struct inode *);
+extern int set_richacl(struct inode *, struct richacl *);
 
 #endif /* __RICHACL_H */
diff --git a/include/linux/richacl_xattr.h b/include/linux/richacl_xattr.h
index 0efa14b..6c6adb1 100644
--- a/include/linux/richacl_xattr.h
+++ b/include/linux/richacl_xattr.h
@@ -26,4 +26,6 @@ extern size_t richacl_xattr_size(const struct richacl *);
 extern int richacl_to_xattr(struct user_namespace *, const struct richacl *,
 			    void *, size_t);
 
+extern struct xattr_handler richacl_xattr_handler;
+
 #endif /* __RICHACL_XATTR_H */
-- 
2.7.4

  parent reply	other threads:[~2017-02-13 15:32 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-13 15:32 [PATCH v28 00/21] Richacls (Core and Ext4) Andreas Gruenbacher
2017-02-13 15:32 ` Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 01/21] vfs: Add IS_ACL() and IS_RICHACL() tests Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 02/21] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 03/21] vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD " Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 04/21] vfs: Add permission flags for setting file attributes Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 05/21] richacl: In-memory representation and helper functions Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 06/21] richacl: Permission mapping functions Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 07/21] richacl: Permission check algorithm Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 08/21] richacl: Compute maximum file masks from an acl Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 11/21] vfs: Cache richacl in struct inode Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 13/21] richacl: Check if an acl is equivalent to a file mode Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 14/21] richacl: Create-time inheritance Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 15/21] richacl: Automatic Inheritance Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 16/21] richacl: xattr mapping functions Andreas Gruenbacher
2017-02-13 15:32 ` Andreas Gruenbacher [this message]
     [not found] ` <1486999957-2381-1-git-send-email-agruenba-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2017-02-13 15:32   ` [PATCH v28 09/21] vfs: Cache base_acl objects in inodes Andreas Gruenbacher
2017-02-13 15:32     ` Andreas Gruenbacher
2017-02-13 15:32   ` [PATCH v28 10/21] vfs: Add get_richacl and set_richacl inode operations Andreas Gruenbacher
2017-02-13 15:32     ` Andreas Gruenbacher
2017-02-13 15:32   ` [PATCH v28 12/21] richacl: Update the file masks in chmod() Andreas Gruenbacher
2017-02-13 15:32     ` Andreas Gruenbacher
2017-02-13 15:32   ` [PATCH v28 18/21] vfs: Add richacl permission checking Andreas Gruenbacher
2017-02-13 15:32     ` Andreas Gruenbacher
2017-02-13 15:32   ` [PATCH v28 19/21] vfs: Move check_posix_acl and check_richacl out of fs/namei.c Andreas Gruenbacher
2017-02-13 15:32     ` Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 20/21] ext4: Add richacl support Andreas Gruenbacher
2017-02-13 15:32 ` [PATCH v28 21/21] ext4: Add richacl feature flag Andreas Gruenbacher

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=1486999957-2381-18-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=hch@infradead.org \
    --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=linux-xfs@vger.kernel.org \
    --cc=trond.myklebust@primarydata.com \
    --cc=tytso@mit.edu \
    --cc=viro@zeniv.linux.org.uk \
    /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.