* [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 @ 2013-12-11 10:42 Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 01/18] reiserfs: prefix ACL symbols with reiserfs_ Christoph Hellwig ` (17 more replies) 0 siblings, 18 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com This series consolidates the various cut'n'pasted Posix ACL implementations into a single common one based on the ->get_acl method Linus added a while ago and a new ->set_acl counterpart. This remove ~1800 lines of code and provides a single place to implement various nasty little gems of the semantics. Unfortunately the 9p code is still left out - it implements the ACLs in two very weird ways, one using the common code but on the client only, and one pasing things straight through to the server. We could easily convert it to the new code on the write side if ->set_acl took a dentry, but there's no cance to do that on the ->get_acl side. Ideas how to handle it welcome. After that we'd be ready to never go into the fs for the ACL attributes and branch straight to the ACL code below the syscall, repairing the old API braindamage of overloading ACLs onto the xattrs. Changes from V1: - check for symlinks in the ACL code and remove checks in the lower level functions. - remove get_acl instances for symlinks in a few filesystems - pass a umode_t mode argument to posix_acl_chmod to accomodate f2fs - various cosemtic bits from the reviews. Note that I still haven't heard from ocfs2 folks, so the patch is left unchanged. ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 01/18] reiserfs: prefix ACL symbols with reiserfs_ 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 02/18] fs: add get_acl helper Christoph Hellwig ` (16 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0001-reiserfs-prefix-ACL-symbols-with-reiserfs_.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/35841bc7/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 02/18] fs: add get_acl helper 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 01/18] reiserfs: prefix ACL symbols with reiserfs_ Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-12 19:06 ` Andreas Gruenbacher 2013-12-11 10:42 ` [Cluster-devel] [PATCH 03/18] fs: add a set_acl inode operation Christoph Hellwig ` (15 subsequent siblings) 17 siblings, 1 reply; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0002-fs-add-get_acl-helper.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/2311bc1c/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 02/18] fs: add get_acl helper 2013-12-11 10:42 ` [Cluster-devel] [PATCH 02/18] fs: add get_acl helper Christoph Hellwig @ 2013-12-12 19:06 ` Andreas Gruenbacher 2013-12-12 21:04 ` Christoph Hellwig 0 siblings, 1 reply; 29+ messages in thread From: Andreas Gruenbacher @ 2013-12-12 19:06 UTC (permalink / raw) To: cluster-devel.redhat.com Christoph, > +struct posix_acl *get_acl(struct inode *inode, int type) > +{ > + struct posix_acl *acl; > + > + acl = get_cached_acl(inode, type); > + if (acl != ACL_NOT_CACHED) > + return acl; > + > + if (!IS_POSIXACL(inode)) > + return NULL; > + > + /* > + * A filesystem can force a ACL callback by just never filling the > + * ACL cache. But normally you'd fill the cache either at inode > + * instantiation time, or on the first ->get_acl call. > + * > + * If the filesystem doesn't have a get_acl() function at all, we'll > + * just create the negative cache entry. > + */ > + if (!inode->i_op->get_acl) { > + set_cached_acl(inode, type, NULL); > + return ERR_PTR(-EAGAIN); The function should return NULL here. Andreas ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 02/18] fs: add get_acl helper 2013-12-12 19:06 ` Andreas Gruenbacher @ 2013-12-12 21:04 ` Christoph Hellwig 0 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-12 21:04 UTC (permalink / raw) To: cluster-devel.redhat.com On Thu, Dec 12, 2013 at 08:06:09PM +0100, Andreas Gruenbacher wrote: > > + /* > > + * A filesystem can force a ACL callback by just never filling the > > + * ACL cache. But normally you'd fill the cache either at inode > > + * instantiation time, or on the first ->get_acl call. > > + * > > + * If the filesystem doesn't have a get_acl() function at all, we'll > > + * just create the negative cache entry. > > + */ > > + if (!inode->i_op->get_acl) { > > + set_cached_acl(inode, type, NULL); > > + return ERR_PTR(-EAGAIN); > > The function should return NULL here. Indeed. EAGAIN is the convention check_acl() in fs/namei.c uses, but it will return that automatically if we just return NULL here. ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 03/18] fs: add a set_acl inode operation 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 01/18] reiserfs: prefix ACL symbols with reiserfs_ Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 02/18] fs: add get_acl helper Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 04/18] fs: add generic xattr_acl handlers Christoph Hellwig ` (14 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0003-fs-add-a-set_acl-inode-operation.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/12450327/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 04/18] fs: add generic xattr_acl handlers 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (2 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 03/18] fs: add a set_acl inode operation Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-12 19:07 ` Andreas Gruenbacher 2013-12-11 10:42 ` [Cluster-devel] [PATCH 05/18] fs: make posix_acl_chmod more useful Christoph Hellwig ` (13 subsequent siblings) 17 siblings, 1 reply; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0004-fs-add-generic-xattr_acl-handlers.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/91db43bc/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 04/18] fs: add generic xattr_acl handlers 2013-12-11 10:42 ` [Cluster-devel] [PATCH 04/18] fs: add generic xattr_acl handlers Christoph Hellwig @ 2013-12-12 19:07 ` Andreas Gruenbacher 0 siblings, 0 replies; 29+ messages in thread From: Andreas Gruenbacher @ 2013-12-12 19:07 UTC (permalink / raw) To: cluster-devel.redhat.com Christoph, > +static int > +posix_acl_xattr_set(struct dentry *dentry, const char *name, > + const void *value, size_t size, int flags, int type) > +{ > + struct inode *inode = dentry->d_inode; > + struct posix_acl *acl = NULL; > + int ret; > + > + if (!IS_POSIXACL(inode)) > + return -EOPNOTSUPP; > + if (S_ISLNK(inode->i_mode) || !inode->i_op->set_acl) > + return -EOPNOTSUPP; Sama here, I would remove the S_ISLNK() check. Andreas ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 05/18] fs: make posix_acl_chmod more useful 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (3 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 04/18] fs: add generic xattr_acl handlers Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-12 19:07 ` Andreas Gruenbacher 2013-12-11 10:42 ` [Cluster-devel] [PATCH 06/18] fs: make posix_acl_create " Christoph Hellwig ` (12 subsequent siblings) 17 siblings, 1 reply; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0005-fs-make-posix_acl_chmod-more-useful.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/176a07d3/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 05/18] fs: make posix_acl_chmod more useful 2013-12-11 10:42 ` [Cluster-devel] [PATCH 05/18] fs: make posix_acl_chmod more useful Christoph Hellwig @ 2013-12-12 19:07 ` Andreas Gruenbacher 2013-12-12 21:05 ` Christoph Hellwig 0 siblings, 1 reply; 29+ messages in thread From: Andreas Gruenbacher @ 2013-12-12 19:07 UTC (permalink / raw) To: cluster-devel.redhat.com Christoph, > +int > +posix_acl_chmod(struct inode *inode) > +{ > + struct posix_acl *acl; > + int ret = 0; > + > + if (S_ISLNK(inode->i_mode) || !inode->i_op->set_acl) > + return -EOPNOTSUPP; Symlinks never have get_acl callbacks, so I would remove the S_ISLNK() check here. Andreas ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 05/18] fs: make posix_acl_chmod more useful 2013-12-12 19:07 ` Andreas Gruenbacher @ 2013-12-12 21:05 ` Christoph Hellwig 0 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-12 21:05 UTC (permalink / raw) To: cluster-devel.redhat.com On Thu, Dec 12, 2013 at 08:07:20PM +0100, Andreas Gruenbacher wrote: > Christoph, > > > +int > > +posix_acl_chmod(struct inode *inode) > > +{ > > + struct posix_acl *acl; > > + int ret = 0; > > + > > + if (S_ISLNK(inode->i_mode) || !inode->i_op->set_acl) > > + return -EOPNOTSUPP; > > Symlinks never have get_acl callbacks, so I would remove the S_ISLNK() check here. Yeah, will simplify it. Same for the other places where we have both checks. ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 06/18] fs: make posix_acl_create more useful 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (4 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 05/18] fs: make posix_acl_chmod more useful Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 07/18] btrfs: use generic posix ACL infrastructure Christoph Hellwig ` (11 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0006-fs-make-posix_acl_create-more-useful.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/eb09193e/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 07/18] btrfs: use generic posix ACL infrastructure 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (5 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 06/18] fs: make posix_acl_create " Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 08/18] ext2/3/4: " Christoph Hellwig ` (10 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0007-btrfs-use-generic-posix-ACL-infrastructure.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/876d757d/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 08/18] ext2/3/4: use generic posix ACL infrastructure 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (6 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 07/18] btrfs: use generic posix ACL infrastructure Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 09/18] f2fs: " Christoph Hellwig ` (9 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0008-ext2-3-4-use-generic-posix-ACL-infrastructure.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/6d2a563e/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 09/18] f2fs: use generic posix ACL infrastructure 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (7 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 08/18] ext2/3/4: " Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 10/18] hfsplus: " Christoph Hellwig ` (8 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0009-f2fs-use-generic-posix-ACL-infrastructure.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/2cec2935/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 10/18] hfsplus: use generic posix ACL infrastructure 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (8 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 09/18] f2fs: " Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 11/18] jffs2: " Christoph Hellwig ` (7 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0010-hfsplus-use-generic-posix-ACL-infrastructure.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/d51bfb09/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 11/18] jffs2: use generic posix ACL infrastructure 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (9 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 10/18] hfsplus: " Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 12/18] ocfs2: " Christoph Hellwig ` (6 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0011-jffs2-use-generic-posix-ACL-infrastructure.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/a3efba51/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 12/18] ocfs2: use generic posix ACL infrastructure 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (10 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 11/18] jffs2: " Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 13/18] reiserfs: " Christoph Hellwig ` (5 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0012-ocfs2-use-generic-posix-ACL-infrastructure.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/88e1778c/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 13/18] reiserfs: use generic posix ACL infrastructure 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (11 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 12/18] ocfs2: " Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 14/18] xfs: " Christoph Hellwig ` (4 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0013-reiserfs-use-generic-posix-ACL-infrastructure.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/6aa889e6/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 14/18] xfs: use generic posix ACL infrastructure 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (12 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 13/18] reiserfs: " Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 15/18] jfs: " Christoph Hellwig ` (3 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0014-xfs-use-generic-posix-ACL-infrastructure.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/9a6a7104/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 15/18] jfs: use generic posix ACL infrastructure 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (13 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 14/18] xfs: " Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 16/18] gfs2: " Christoph Hellwig ` (2 subsequent siblings) 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0015-jfs-use-generic-posix-ACL-infrastructure.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/c6ddfc3b/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 16/18] gfs2: use generic posix ACL infrastructure 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (14 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 15/18] jfs: " Christoph Hellwig @ 2013-12-11 10:42 ` Christoph Hellwig 2013-12-11 10:52 ` Steven Whitehouse 2013-12-12 19:08 ` Andreas Gruenbacher 2013-12-11 10:43 ` [Cluster-devel] [PATCH 17/18] nfs: use generic posix ACL infrastructure for v3 Posix ACLs Christoph Hellwig 2013-12-11 10:43 ` [Cluster-devel] [PATCH 18/18] fs: remove generic_acl Christoph Hellwig 17 siblings, 2 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:42 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0016-gfs2-use-generic-posix-ACL-infrastructure.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/aafe34fb/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 16/18] gfs2: use generic posix ACL infrastructure 2013-12-11 10:42 ` [Cluster-devel] [PATCH 16/18] gfs2: " Christoph Hellwig @ 2013-12-11 10:52 ` Steven Whitehouse 2013-12-12 19:08 ` Andreas Gruenbacher 1 sibling, 0 replies; 29+ messages in thread From: Steven Whitehouse @ 2013-12-11 10:52 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, On Wed, 2013-12-11 at 02:42 -0800, Christoph Hellwig wrote: > plain text document attachment > (0016-gfs2-use-generic-posix-ACL-infrastructure.patch) > This contains some major refactoring for the create path so that > inodes are created with the right mode to start with instead of > fixing it up later. > > Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: Steven Whitehouse <swhiteho@redhat.com> A really nice clean up - this is a very useful step forward in simplifying the create path. Thanks for sorting this out, Steve. > --- > fs/gfs2/acl.c | 234 +++++++------------------------------------------------ > fs/gfs2/acl.h | 4 +- > fs/gfs2/inode.c | 33 ++++++-- > fs/gfs2/xattr.c | 4 +- > 4 files changed, 62 insertions(+), 213 deletions(-) > > diff --git a/fs/gfs2/acl.c b/fs/gfs2/acl.c > index e82e4ac..ba94566 100644 > --- a/fs/gfs2/acl.c > +++ b/fs/gfs2/acl.c > @@ -49,10 +49,6 @@ struct posix_acl *gfs2_get_acl(struct inode *inode, int type) > if (!ip->i_eattr) > return NULL; > > - acl = get_cached_acl(&ip->i_inode, type); > - if (acl != ACL_NOT_CACHED) > - return acl; > - > name = gfs2_acl_name(type); > if (name == NULL) > return ERR_PTR(-EINVAL); > @@ -80,7 +76,7 @@ static int gfs2_set_mode(struct inode *inode, umode_t mode) > return error; > } > > -static int gfs2_acl_set(struct inode *inode, int type, struct posix_acl *acl) > +int gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) > { > int error; > int len; > @@ -88,219 +84,49 @@ static int gfs2_acl_set(struct inode *inode, int type, struct posix_acl *acl) > const char *name = gfs2_acl_name(type); > > BUG_ON(name == NULL); > - len = posix_acl_to_xattr(&init_user_ns, acl, NULL, 0); > - if (len == 0) > - return 0; > - data = kmalloc(len, GFP_NOFS); > - if (data == NULL) > - return -ENOMEM; > - error = posix_acl_to_xattr(&init_user_ns, acl, data, len); > - if (error < 0) > - goto out; > - error = __gfs2_xattr_set(inode, name, data, len, 0, GFS2_EATYPE_SYS); > - if (!error) > - set_cached_acl(inode, type, acl); > -out: > - kfree(data); > - return error; > -} > - > -int gfs2_acl_create(struct gfs2_inode *dip, struct inode *inode) > -{ > - struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode); > - struct posix_acl *acl; > - umode_t mode = inode->i_mode; > - int error = 0; > - > - if (!sdp->sd_args.ar_posix_acl) > - return 0; > - if (S_ISLNK(inode->i_mode)) > - return 0; > - > - acl = gfs2_get_acl(&dip->i_inode, ACL_TYPE_DEFAULT); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - if (!acl) { > - mode &= ~current_umask(); > - return gfs2_set_mode(inode, mode); > - } > - > - if (S_ISDIR(inode->i_mode)) { > - error = gfs2_acl_set(inode, ACL_TYPE_DEFAULT, acl); > - if (error) > - goto out; > - } > - > - error = __posix_acl_create(&acl, GFP_NOFS, &mode); > - if (error < 0) > - return error; > > - if (error == 0) > - goto munge; > - > - error = gfs2_acl_set(inode, ACL_TYPE_ACCESS, acl); > - if (error) > - goto out; > -munge: > - error = gfs2_set_mode(inode, mode); > -out: > - posix_acl_release(acl); > - return error; > -} > - > -int gfs2_acl_chmod(struct gfs2_inode *ip, struct iattr *attr) > -{ > - struct inode *inode = &ip->i_inode; > - struct posix_acl *acl; > - char *data; > - unsigned int len; > - int error; > - > - acl = gfs2_get_acl(&ip->i_inode, ACL_TYPE_ACCESS); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - if (!acl) > - return gfs2_setattr_simple(inode, attr); > - > - error = __posix_acl_chmod(&acl, GFP_NOFS, attr->ia_mode); > - if (error) > - return error; > - > - len = posix_acl_to_xattr(&init_user_ns, acl, NULL, 0); > - data = kmalloc(len, GFP_NOFS); > - error = -ENOMEM; > - if (data == NULL) > - goto out; > - posix_acl_to_xattr(&init_user_ns, acl, data, len); > - error = gfs2_xattr_acl_chmod(ip, attr, data); > - kfree(data); > - set_cached_acl(&ip->i_inode, ACL_TYPE_ACCESS, acl); > - > -out: > - posix_acl_release(acl); > - return error; > -} > - > -static int gfs2_acl_type(const char *name) > -{ > - if (strcmp(name, GFS2_POSIX_ACL_ACCESS) == 0) > - return ACL_TYPE_ACCESS; > - if (strcmp(name, GFS2_POSIX_ACL_DEFAULT) == 0) > - return ACL_TYPE_DEFAULT; > - return -EINVAL; > -} > - > -static int gfs2_xattr_system_get(struct dentry *dentry, const char *name, > - void *buffer, size_t size, int xtype) > -{ > - struct inode *inode = dentry->d_inode; > - struct gfs2_sbd *sdp = GFS2_SB(inode); > - struct posix_acl *acl; > - int type; > - int error; > - > - if (!sdp->sd_args.ar_posix_acl) > - return -EOPNOTSUPP; > - > - type = gfs2_acl_type(name); > - if (type < 0) > - return type; > - > - acl = gfs2_get_acl(inode, type); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - if (acl == NULL) > - return -ENODATA; > - > - error = posix_acl_to_xattr(&init_user_ns, acl, buffer, size); > - posix_acl_release(acl); > - > - return error; > -} > - > -static int gfs2_xattr_system_set(struct dentry *dentry, const char *name, > - const void *value, size_t size, int flags, > - int xtype) > -{ > - struct inode *inode = dentry->d_inode; > - struct gfs2_sbd *sdp = GFS2_SB(inode); > - struct posix_acl *acl = NULL; > - int error = 0, type; > - > - if (!sdp->sd_args.ar_posix_acl) > - return -EOPNOTSUPP; > - > - type = gfs2_acl_type(name); > - if (type < 0) > - return type; > - if (flags & XATTR_CREATE) > - return -EINVAL; > - if (type == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode)) > - return value ? -EACCES : 0; > - if (!uid_eq(current_fsuid(), inode->i_uid) && !capable(CAP_FOWNER)) > - return -EPERM; > - if (S_ISLNK(inode->i_mode)) > - return -EOPNOTSUPP; > - > - if (!value) > - goto set_acl; > - > - acl = posix_acl_from_xattr(&init_user_ns, value, size); > - if (!acl) { > - /* > - * acl_set_file(3) may request that we set default ACLs with > - * zero length -- defend (gracefully) against that here. > - */ > - goto out; > - } > - if (IS_ERR(acl)) { > - error = PTR_ERR(acl); > - goto out; > - } > - > - error = posix_acl_valid(acl); > - if (error) > - goto out_release; > - > - error = -EINVAL; > if (acl->a_count > GFS2_ACL_MAX_ENTRIES) > - goto out_release; > + return -EINVAL; > > if (type == ACL_TYPE_ACCESS) { > umode_t mode = inode->i_mode; > + > error = posix_acl_equiv_mode(acl, &mode); > + if (error < 0) > + return error; > > - if (error <= 0) { > - posix_acl_release(acl); > + if (error == 0) > acl = NULL; > > - if (error < 0) > - return error; > - } > - > error = gfs2_set_mode(inode, mode); > if (error) > - goto out_release; > + return error; > } > > -set_acl: > - error = __gfs2_xattr_set(inode, name, value, size, 0, GFS2_EATYPE_SYS); > - if (!error) { > - if (acl) > - set_cached_acl(inode, type, acl); > - else > - forget_cached_acl(inode, type); > + if (acl) { > + len = posix_acl_to_xattr(&init_user_ns, acl, NULL, 0); > + if (len == 0) > + return 0; > + data = kmalloc(len, GFP_NOFS); > + if (data == NULL) > + return -ENOMEM; > + error = posix_acl_to_xattr(&init_user_ns, acl, data, len); > + if (error < 0) > + goto out; > + } else { > + data = NULL; > + len = 0; > } > -out_release: > - posix_acl_release(acl); > + > + error = __gfs2_xattr_set(inode, name, data, len, 0, GFS2_EATYPE_SYS); > + if (error) > + goto out; > + > + if (acl) > + set_cached_acl(inode, type, acl); > + else > + forget_cached_acl(inode, type); > out: > + kfree(data); > return error; > } > - > -const struct xattr_handler gfs2_xattr_system_handler = { > - .prefix = XATTR_SYSTEM_PREFIX, > - .flags = GFS2_EATYPE_SYS, > - .get = gfs2_xattr_system_get, > - .set = gfs2_xattr_system_set, > -}; > - > diff --git a/fs/gfs2/acl.h b/fs/gfs2/acl.h > index 0da38dc..301260c 100644 > --- a/fs/gfs2/acl.h > +++ b/fs/gfs2/acl.h > @@ -17,8 +17,6 @@ > #define GFS2_ACL_MAX_ENTRIES 25 > > extern struct posix_acl *gfs2_get_acl(struct inode *inode, int type); > -extern int gfs2_acl_create(struct gfs2_inode *dip, struct inode *inode); > -extern int gfs2_acl_chmod(struct gfs2_inode *ip, struct iattr *attr); > -extern const struct xattr_handler gfs2_xattr_system_handler; > +extern int gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type); > > #endif /* __ACL_DOT_H__ */ > diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c > index 7119504..92b8959 100644 > --- a/fs/gfs2/inode.c > +++ b/fs/gfs2/inode.c > @@ -552,6 +552,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, > unsigned int size, int excl, int *opened) > { > const struct qstr *name = &dentry->d_name; > + struct posix_acl *default_acl, *acl; > struct gfs2_holder ghs[2]; > struct inode *inode = NULL; > struct gfs2_inode *dip = GFS2_I(dir), *ip; > @@ -611,10 +612,14 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, > if (!inode) > goto fail_gunlock; > > + error = posix_acl_create(dir, &mode, &default_acl, &acl); > + if (error) > + goto fail_free_vfs_inode; > + > ip = GFS2_I(inode); > error = gfs2_rs_alloc(ip); > if (error) > - goto fail_free_inode; > + goto fail_free_acls; > > inode->i_mode = mode; > set_nlink(inode, S_ISDIR(mode) ? 2 : 1); > @@ -682,7 +687,16 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, > gfs2_set_iop(inode); > insert_inode_hash(inode); > > - error = gfs2_acl_create(dip, inode); > + if (default_acl) { > + error = gfs2_set_acl(inode, default_acl, ACL_TYPE_DEFAULT); > + posix_acl_release(default_acl); > + } > + if (acl) { > + if (!error) > + error = gfs2_set_acl(inode, acl, ACL_TYPE_ACCESS); > + posix_acl_release(acl); > + } > + > if (error) > goto fail_gunlock3; > > @@ -716,6 +730,12 @@ fail_free_inode: > if (ip->i_gl) > gfs2_glock_put(ip->i_gl); > gfs2_rs_delete(ip, NULL); > +fail_free_acls: > + if (default_acl) > + posix_acl_release(default_acl); > + if (acl) > + posix_acl_release(acl); > +fail_free_vfs_inode: > free_inode_nonrcu(inode); > inode = NULL; > fail_gunlock: > @@ -1678,10 +1698,11 @@ static int gfs2_setattr(struct dentry *dentry, struct iattr *attr) > error = gfs2_setattr_size(inode, attr->ia_size); > else if (attr->ia_valid & (ATTR_UID | ATTR_GID)) > error = setattr_chown(inode, attr); > - else if ((attr->ia_valid & ATTR_MODE) && IS_POSIXACL(inode)) > - error = gfs2_acl_chmod(ip, attr); > - else > + else { > error = gfs2_setattr_simple(inode, attr); > + if (!error && attr->ia_valid & ATTR_MODE) > + error = posix_acl_chmod(inode, inode->i_mode); > + } > > out: > if (!error) > @@ -1841,6 +1862,7 @@ const struct inode_operations gfs2_file_iops = { > .removexattr = gfs2_removexattr, > .fiemap = gfs2_fiemap, > .get_acl = gfs2_get_acl, > + .set_acl = gfs2_set_acl, > }; > > const struct inode_operations gfs2_dir_iops = { > @@ -1862,6 +1884,7 @@ const struct inode_operations gfs2_dir_iops = { > .removexattr = gfs2_removexattr, > .fiemap = gfs2_fiemap, > .get_acl = gfs2_get_acl, > + .set_acl = gfs2_set_acl, > .atomic_open = gfs2_atomic_open, > }; > > diff --git a/fs/gfs2/xattr.c b/fs/gfs2/xattr.c > index 8c6a6f6..0b81f78 100644 > --- a/fs/gfs2/xattr.c > +++ b/fs/gfs2/xattr.c > @@ -13,6 +13,7 @@ > #include <linux/buffer_head.h> > #include <linux/xattr.h> > #include <linux/gfs2_ondisk.h> > +#include <linux/posix_acl_xattr.h> > #include <asm/uaccess.h> > > #include "gfs2.h" > @@ -1500,7 +1501,8 @@ static const struct xattr_handler gfs2_xattr_security_handler = { > const struct xattr_handler *gfs2_xattr_handlers[] = { > &gfs2_xattr_user_handler, > &gfs2_xattr_security_handler, > - &gfs2_xattr_system_handler, > + &posix_acl_access_xattr_handler, > + &posix_acl_default_xattr_handler, > NULL, > }; > ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 16/18] gfs2: use generic posix ACL infrastructure 2013-12-11 10:42 ` [Cluster-devel] [PATCH 16/18] gfs2: " Christoph Hellwig 2013-12-11 10:52 ` Steven Whitehouse @ 2013-12-12 19:08 ` Andreas Gruenbacher 2013-12-12 21:05 ` Christoph Hellwig 1 sibling, 1 reply; 29+ messages in thread From: Andreas Gruenbacher @ 2013-12-12 19:08 UTC (permalink / raw) To: cluster-devel.redhat.com Christoph, gfs2 has a left-over get_acl callback in gfs2_symlink_iops in fs/gfs2/inode.c, from a long time ago, which should be removed as well. Andreas ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 16/18] gfs2: use generic posix ACL infrastructure 2013-12-12 19:08 ` Andreas Gruenbacher @ 2013-12-12 21:05 ` Christoph Hellwig 0 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-12 21:05 UTC (permalink / raw) To: cluster-devel.redhat.com On Thu, Dec 12, 2013 at 08:08:38PM +0100, Andreas Gruenbacher wrote: > Christoph, > > gfs2 has a left-over get_acl callback in gfs2_symlink_iops in > fs/gfs2/inode.c, from a long time ago, which should be removed > as well. Ok, will fix. ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 17/18] nfs: use generic posix ACL infrastructure for v3 Posix ACLs 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (15 preceding siblings ...) 2013-12-11 10:42 ` [Cluster-devel] [PATCH 16/18] gfs2: " Christoph Hellwig @ 2013-12-11 10:43 ` Christoph Hellwig 2013-12-11 10:43 ` [Cluster-devel] [PATCH 18/18] fs: remove generic_acl Christoph Hellwig 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:43 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0017-nfs-use-generic-posix-ACL-infrastructure-for-v3-Posi.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/ce18263a/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 18/18] fs: remove generic_acl 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig ` (16 preceding siblings ...) 2013-12-11 10:43 ` [Cluster-devel] [PATCH 17/18] nfs: use generic posix ACL infrastructure for v3 Posix ACLs Christoph Hellwig @ 2013-12-11 10:43 ` Christoph Hellwig 17 siblings, 0 replies; 29+ messages in thread From: Christoph Hellwig @ 2013-12-11 10:43 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0018-fs-remove-generic_acl.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131211/ff393c13/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation @ 2013-12-01 11:59 Christoph Hellwig 2013-12-01 11:59 ` [Cluster-devel] [PATCH 08/18] ext2/3/4: use generic posix ACL infrastructure Christoph Hellwig 0 siblings, 1 reply; 29+ messages in thread From: Christoph Hellwig @ 2013-12-01 11:59 UTC (permalink / raw) To: cluster-devel.redhat.com This series consolidates the various cut'n'pasted Posix ACL implementations into a single common one based on the ->get_acl method Linus added a while ago and a new ->set_acl counterpart. This 1600 lines of code and provides a single place to implement various nasty little gems of the semantics. Unfortunately the 9p code is still left out - it implements the ACLs in two very weird ways, one using the common code but on the client only, and one pasing things straight through to the server. We could easily convert it to the new code on the write side if ->set_acl took a dentry, but there's no cance to do that on the ->get_acl side. Ideas how to handle it welcome. After that we'd be ready to never go into the fs for the ACL attributes and branch straight to the ACL code below the syscall, repairing the old API braindamage of overloading ACLs onto the xattrs. Btw, I'd be almost tempted to do that for all system.* attrs. Besides Posix ACLs we only have CIFS and NFSv4 ACL variants, weird advice crap in f2fs, and the magic mushroom proto name on sockets. ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 08/18] ext2/3/4: use generic posix ACL infrastructure 2013-12-01 11:59 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation Christoph Hellwig @ 2013-12-01 11:59 ` Christoph Hellwig 2013-12-02 22:13 ` Jan Kara 0 siblings, 1 reply; 29+ messages in thread From: Christoph Hellwig @ 2013-12-01 11:59 UTC (permalink / raw) To: cluster-devel.redhat.com An embedded and charset-unspecified text was scrubbed... Name: 0008-ext2-3-4-use-generic-posix-ACL-infrastructure.patch URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20131201/dcf30da7/attachment.ksh> ^ permalink raw reply [flat|nested] 29+ messages in thread
* [Cluster-devel] [PATCH 08/18] ext2/3/4: use generic posix ACL infrastructure 2013-12-01 11:59 ` [Cluster-devel] [PATCH 08/18] ext2/3/4: use generic posix ACL infrastructure Christoph Hellwig @ 2013-12-02 22:13 ` Jan Kara 0 siblings, 0 replies; 29+ messages in thread From: Jan Kara @ 2013-12-02 22:13 UTC (permalink / raw) To: cluster-devel.redhat.com On Sun 01-12-13 03:59:11, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig <hch@lst.de> Looks good. You can add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/ext2/acl.c | 176 ++++----------------------------------------- > fs/ext2/acl.h | 8 +-- > fs/ext2/file.c | 1 + > fs/ext2/inode.c | 2 +- > fs/ext2/namei.c | 2 + > fs/ext2/xattr.c | 8 +-- > fs/ext2/xattr.h | 2 - > fs/ext3/acl.c | 213 ++++++++----------------------------------------------- > fs/ext3/acl.h | 9 +-- > fs/ext3/file.c | 1 + > fs/ext3/inode.c | 2 +- > fs/ext3/namei.c | 2 + > fs/ext3/xattr.c | 8 +-- > fs/ext3/xattr.h | 2 - > fs/ext4/acl.c | 213 ++++++++----------------------------------------------- > fs/ext4/acl.h | 9 +-- > fs/ext4/file.c | 1 + > fs/ext4/inode.c | 2 +- > fs/ext4/namei.c | 2 + > fs/ext4/xattr.c | 8 +-- > fs/ext4/xattr.h | 2 - > 21 files changed, 100 insertions(+), 573 deletions(-) > > diff --git a/fs/ext2/acl.c b/fs/ext2/acl.c > index 6e842a7..f04a295 100644 > --- a/fs/ext2/acl.c > +++ b/fs/ext2/acl.c > @@ -189,8 +189,8 @@ ext2_get_acl(struct inode *inode, int type) > /* > * inode->i_mutex: down > */ > -static int > -ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl) > +int > +ext2_set_acl(struct inode *inode, struct posix_acl *acl, int type) > { > int name_index; > void *value = NULL; > @@ -250,169 +250,21 @@ ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl) > int > ext2_init_acl(struct inode *inode, struct inode *dir) > { > - struct posix_acl *acl = NULL; > - int error = 0; > - > - if (!S_ISLNK(inode->i_mode)) { > - if (test_opt(dir->i_sb, POSIX_ACL)) { > - acl = ext2_get_acl(dir, ACL_TYPE_DEFAULT); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - } > - if (!acl) > - inode->i_mode &= ~current_umask(); > - } > - if (test_opt(inode->i_sb, POSIX_ACL) && acl) { > - if (S_ISDIR(inode->i_mode)) { > - error = ext2_set_acl(inode, ACL_TYPE_DEFAULT, acl); > - if (error) > - goto cleanup; > - } > - error = __posix_acl_create(&acl, GFP_KERNEL, &inode->i_mode); > - if (error < 0) > - return error; > - if (error > 0) { > - /* This is an extended ACL */ > - error = ext2_set_acl(inode, ACL_TYPE_ACCESS, acl); > - } > - } > -cleanup: > - posix_acl_release(acl); > - return error; > -} > - > -/* > - * Does chmod for an inode that may have an Access Control List. The > - * inode->i_mode field must be updated to the desired value by the caller > - * before calling this function. > - * Returns 0 on success, or a negative error number. > - * > - * We change the ACL rather than storing some ACL entries in the file > - * mode permission bits (which would be more efficient), because that > - * would break once additional permissions (like ACL_APPEND, ACL_DELETE > - * for directories) are added. There are no more bits available in the > - * file mode. > - * > - * inode->i_mutex: down > - */ > -int > -ext2_acl_chmod(struct inode *inode) > -{ > - struct posix_acl *acl; > - int error; > + struct posix_acl *default_acl, *acl; > + int error; > > - if (!test_opt(inode->i_sb, POSIX_ACL)) > - return 0; > - if (S_ISLNK(inode->i_mode)) > - return -EOPNOTSUPP; > - acl = ext2_get_acl(inode, ACL_TYPE_ACCESS); > - if (IS_ERR(acl) || !acl) > - return PTR_ERR(acl); > - error = __posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); > + error = posix_acl_create(dir, &inode->i_mode, &default_acl, &acl); > if (error) > return error; > - error = ext2_set_acl(inode, ACL_TYPE_ACCESS, acl); > - posix_acl_release(acl); > - return error; > -} > - > -/* > - * Extended attribut handlers > - */ > -static size_t > -ext2_xattr_list_acl_access(struct dentry *dentry, char *list, size_t list_size, > - const char *name, size_t name_len, int type) > -{ > - const size_t size = sizeof(POSIX_ACL_XATTR_ACCESS); > - > - if (!test_opt(dentry->d_sb, POSIX_ACL)) > - return 0; > - if (list && size <= list_size) > - memcpy(list, POSIX_ACL_XATTR_ACCESS, size); > - return size; > -} > > -static size_t > -ext2_xattr_list_acl_default(struct dentry *dentry, char *list, size_t list_size, > - const char *name, size_t name_len, int type) > -{ > - const size_t size = sizeof(POSIX_ACL_XATTR_DEFAULT); > - > - if (!test_opt(dentry->d_sb, POSIX_ACL)) > - return 0; > - if (list && size <= list_size) > - memcpy(list, POSIX_ACL_XATTR_DEFAULT, size); > - return size; > -} > - > -static int > -ext2_xattr_get_acl(struct dentry *dentry, const char *name, void *buffer, > - size_t size, int type) > -{ > - struct posix_acl *acl; > - int error; > - > - if (strcmp(name, "") != 0) > - return -EINVAL; > - if (!test_opt(dentry->d_sb, POSIX_ACL)) > - return -EOPNOTSUPP; > - > - acl = ext2_get_acl(dentry->d_inode, type); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - if (acl == NULL) > - return -ENODATA; > - error = posix_acl_to_xattr(&init_user_ns, acl, buffer, size); > - posix_acl_release(acl); > - > - return error; > -} > - > -static int > -ext2_xattr_set_acl(struct dentry *dentry, const char *name, const void *value, > - size_t size, int flags, int type) > -{ > - struct posix_acl *acl; > - int error; > - > - if (strcmp(name, "") != 0) > - return -EINVAL; > - if (!test_opt(dentry->d_sb, POSIX_ACL)) > - return -EOPNOTSUPP; > - if (!inode_owner_or_capable(dentry->d_inode)) > - return -EPERM; > - > - if (value) { > - acl = posix_acl_from_xattr(&init_user_ns, value, size); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - else if (acl) { > - error = posix_acl_valid(acl); > - if (error) > - goto release_and_out; > - } > - } else > - acl = NULL; > - > - error = ext2_set_acl(dentry->d_inode, type, acl); > - > -release_and_out: > - posix_acl_release(acl); > + if (default_acl) { > + error = ext2_set_acl(inode, default_acl, ACL_TYPE_DEFAULT); > + posix_acl_release(default_acl); > + } > + if (acl) { > + if (!error) > + error = ext2_set_acl(inode, acl, ACL_TYPE_ACCESS); > + posix_acl_release(acl); > + } > return error; > } > - > -const struct xattr_handler ext2_xattr_acl_access_handler = { > - .prefix = POSIX_ACL_XATTR_ACCESS, > - .flags = ACL_TYPE_ACCESS, > - .list = ext2_xattr_list_acl_access, > - .get = ext2_xattr_get_acl, > - .set = ext2_xattr_set_acl, > -}; > - > -const struct xattr_handler ext2_xattr_acl_default_handler = { > - .prefix = POSIX_ACL_XATTR_DEFAULT, > - .flags = ACL_TYPE_DEFAULT, > - .list = ext2_xattr_list_acl_default, > - .get = ext2_xattr_get_acl, > - .set = ext2_xattr_set_acl, > -}; > diff --git a/fs/ext2/acl.h b/fs/ext2/acl.h > index 503bfb0..44937f9 100644 > --- a/fs/ext2/acl.h > +++ b/fs/ext2/acl.h > @@ -55,7 +55,7 @@ static inline int ext2_acl_count(size_t size) > > /* acl.c */ > extern struct posix_acl *ext2_get_acl(struct inode *inode, int type); > -extern int ext2_acl_chmod (struct inode *); > +extern int ext2_set_acl(struct inode *inode, struct posix_acl *acl, int type); > extern int ext2_init_acl (struct inode *, struct inode *); > > #else > @@ -63,12 +63,6 @@ extern int ext2_init_acl (struct inode *, struct inode *); > #define ext2_get_acl NULL > #define ext2_set_acl NULL > > -static inline int > -ext2_acl_chmod (struct inode *inode) > -{ > - return 0; > -} > - > static inline int ext2_init_acl (struct inode *inode, struct inode *dir) > { > return 0; > diff --git a/fs/ext2/file.c b/fs/ext2/file.c > index a5b3a5d..44c36e5 100644 > --- a/fs/ext2/file.c > +++ b/fs/ext2/file.c > @@ -103,5 +103,6 @@ const struct inode_operations ext2_file_inode_operations = { > #endif > .setattr = ext2_setattr, > .get_acl = ext2_get_acl, > + .set_acl = ext2_set_acl, > .fiemap = ext2_fiemap, > }; > diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c > index 8a33764..1be8866 100644 > --- a/fs/ext2/inode.c > +++ b/fs/ext2/inode.c > @@ -1566,7 +1566,7 @@ int ext2_setattr(struct dentry *dentry, struct iattr *iattr) > } > setattr_copy(inode, iattr); > if (iattr->ia_valid & ATTR_MODE) > - error = ext2_acl_chmod(inode); > + error = posix_acl_chmod(inode); > mark_inode_dirty(inode); > > return error; > diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c > index 256dd5f..c268d0a 100644 > --- a/fs/ext2/namei.c > +++ b/fs/ext2/namei.c > @@ -421,6 +421,7 @@ const struct inode_operations ext2_dir_inode_operations = { > #endif > .setattr = ext2_setattr, > .get_acl = ext2_get_acl, > + .set_acl = ext2_set_acl, > .tmpfile = ext2_tmpfile, > }; > > @@ -433,4 +434,5 @@ const struct inode_operations ext2_special_inode_operations = { > #endif > .setattr = ext2_setattr, > .get_acl = ext2_get_acl, > + .set_acl = ext2_set_acl, > }; > diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c > index 2d7557d..9142614 100644 > --- a/fs/ext2/xattr.c > +++ b/fs/ext2/xattr.c > @@ -103,8 +103,8 @@ static struct mb_cache *ext2_xattr_cache; > static const struct xattr_handler *ext2_xattr_handler_map[] = { > [EXT2_XATTR_INDEX_USER] = &ext2_xattr_user_handler, > #ifdef CONFIG_EXT2_FS_POSIX_ACL > - [EXT2_XATTR_INDEX_POSIX_ACL_ACCESS] = &ext2_xattr_acl_access_handler, > - [EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT] = &ext2_xattr_acl_default_handler, > + [EXT2_XATTR_INDEX_POSIX_ACL_ACCESS] = &posix_acl_access_xattr_handler, > + [EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT] = &posix_acl_default_xattr_handler, > #endif > [EXT2_XATTR_INDEX_TRUSTED] = &ext2_xattr_trusted_handler, > #ifdef CONFIG_EXT2_FS_SECURITY > @@ -116,8 +116,8 @@ const struct xattr_handler *ext2_xattr_handlers[] = { > &ext2_xattr_user_handler, > &ext2_xattr_trusted_handler, > #ifdef CONFIG_EXT2_FS_POSIX_ACL > - &ext2_xattr_acl_access_handler, > - &ext2_xattr_acl_default_handler, > + &posix_acl_access_xattr_handler, > + &posix_acl_default_xattr_handler, > #endif > #ifdef CONFIG_EXT2_FS_SECURITY > &ext2_xattr_security_handler, > diff --git a/fs/ext2/xattr.h b/fs/ext2/xattr.h > index 5e41ccc..60edf29 100644 > --- a/fs/ext2/xattr.h > +++ b/fs/ext2/xattr.h > @@ -57,8 +57,6 @@ struct ext2_xattr_entry { > > extern const struct xattr_handler ext2_xattr_user_handler; > extern const struct xattr_handler ext2_xattr_trusted_handler; > -extern const struct xattr_handler ext2_xattr_acl_access_handler; > -extern const struct xattr_handler ext2_xattr_acl_default_handler; > extern const struct xattr_handler ext2_xattr_security_handler; > > extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); > diff --git a/fs/ext3/acl.c b/fs/ext3/acl.c > index 4f3d8fa..e9cb33f 100644 > --- a/fs/ext3/acl.c > +++ b/fs/ext3/acl.c > @@ -190,7 +190,7 @@ ext3_get_acl(struct inode *inode, int type) > * inode->i_mutex: down unless called from ext3_new_inode > */ > static int > -ext3_set_acl(handle_t *handle, struct inode *inode, int type, > +__ext3_set_acl(handle_t *handle, struct inode *inode, int type, > struct posix_acl *acl) > { > int name_index; > @@ -243,204 +243,49 @@ ext3_set_acl(handle_t *handle, struct inode *inode, int type, > return error; > } > > -/* > - * Initialize the ACLs of a new inode. Called from ext3_new_inode. > - * > - * dir->i_mutex: down > - * inode->i_mutex: up (access to inode is still exclusive) > - */ > -int > -ext3_init_acl(handle_t *handle, struct inode *inode, struct inode *dir) > -{ > - struct posix_acl *acl = NULL; > - int error = 0; > - > - if (!S_ISLNK(inode->i_mode)) { > - if (test_opt(dir->i_sb, POSIX_ACL)) { > - acl = ext3_get_acl(dir, ACL_TYPE_DEFAULT); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - } > - if (!acl) > - inode->i_mode &= ~current_umask(); > - } > - if (test_opt(inode->i_sb, POSIX_ACL) && acl) { > - if (S_ISDIR(inode->i_mode)) { > - error = ext3_set_acl(handle, inode, > - ACL_TYPE_DEFAULT, acl); > - if (error) > - goto cleanup; > - } > - error = __posix_acl_create(&acl, GFP_NOFS, &inode->i_mode); > - if (error < 0) > - return error; > - > - if (error > 0) { > - /* This is an extended ACL */ > - error = ext3_set_acl(handle, inode, ACL_TYPE_ACCESS, acl); > - } > - } > -cleanup: > - posix_acl_release(acl); > - return error; > -} > - > -/* > - * Does chmod for an inode that may have an Access Control List. The > - * inode->i_mode field must be updated to the desired value by the caller > - * before calling this function. > - * Returns 0 on success, or a negative error number. > - * > - * We change the ACL rather than storing some ACL entries in the file > - * mode permission bits (which would be more efficient), because that > - * would break once additional permissions (like ACL_APPEND, ACL_DELETE > - * for directories) are added. There are no more bits available in the > - * file mode. > - * > - * inode->i_mutex: down > - */ > int > -ext3_acl_chmod(struct inode *inode) > +ext3_set_acl(struct inode *inode, struct posix_acl *acl, int type) > { > - struct posix_acl *acl; > handle_t *handle; > - int retries = 0; > - int error; > + int error, retries = 0; > > - if (S_ISLNK(inode->i_mode)) > - return -EOPNOTSUPP; > - if (!test_opt(inode->i_sb, POSIX_ACL)) > - return 0; > - acl = ext3_get_acl(inode, ACL_TYPE_ACCESS); > - if (IS_ERR(acl) || !acl) > - return PTR_ERR(acl); > - error = __posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); > - if (error) > - return error; > retry: > - handle = ext3_journal_start(inode, > - EXT3_DATA_TRANS_BLOCKS(inode->i_sb)); > - if (IS_ERR(handle)) { > - error = PTR_ERR(handle); > - ext3_std_error(inode->i_sb, error); > - goto out; > - } > - error = ext3_set_acl(handle, inode, ACL_TYPE_ACCESS, acl); > + handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS(inode->i_sb)); > + if (IS_ERR(handle)) > + return PTR_ERR(handle); > + error = __ext3_set_acl(handle, inode, type, acl); > ext3_journal_stop(handle); > - if (error == -ENOSPC && > - ext3_should_retry_alloc(inode->i_sb, &retries)) > + if (error == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries)) > goto retry; > -out: > - posix_acl_release(acl); > return error; > } > > /* > - * Extended attribute handlers > + * Initialize the ACLs of a new inode. Called from ext3_new_inode. > + * > + * dir->i_mutex: down > + * inode->i_mutex: up (access to inode is still exclusive) > */ > -static size_t > -ext3_xattr_list_acl_access(struct dentry *dentry, char *list, size_t list_len, > - const char *name, size_t name_len, int type) > -{ > - const size_t size = sizeof(POSIX_ACL_XATTR_ACCESS); > - > - if (!test_opt(dentry->d_sb, POSIX_ACL)) > - return 0; > - if (list && size <= list_len) > - memcpy(list, POSIX_ACL_XATTR_ACCESS, size); > - return size; > -} > - > -static size_t > -ext3_xattr_list_acl_default(struct dentry *dentry, char *list, size_t list_len, > - const char *name, size_t name_len, int type) > -{ > - const size_t size = sizeof(POSIX_ACL_XATTR_DEFAULT); > - > - if (!test_opt(dentry->d_sb, POSIX_ACL)) > - return 0; > - if (list && size <= list_len) > - memcpy(list, POSIX_ACL_XATTR_DEFAULT, size); > - return size; > -} > - > -static int > -ext3_xattr_get_acl(struct dentry *dentry, const char *name, void *buffer, > - size_t size, int type) > +int > +ext3_init_acl(handle_t *handle, struct inode *inode, struct inode *dir) > { > - struct posix_acl *acl; > + struct posix_acl *default_acl, *acl; > int error; > > - if (strcmp(name, "") != 0) > - return -EINVAL; > - if (!test_opt(dentry->d_sb, POSIX_ACL)) > - return -EOPNOTSUPP; > - > - acl = ext3_get_acl(dentry->d_inode, type); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - if (acl == NULL) > - return -ENODATA; > - error = posix_acl_to_xattr(&init_user_ns, acl, buffer, size); > - posix_acl_release(acl); > - > - return error; > -} > - > -static int > -ext3_xattr_set_acl(struct dentry *dentry, const char *name, const void *value, > - size_t size, int flags, int type) > -{ > - struct inode *inode = dentry->d_inode; > - handle_t *handle; > - struct posix_acl *acl; > - int error, retries = 0; > - > - if (strcmp(name, "") != 0) > - return -EINVAL; > - if (!test_opt(inode->i_sb, POSIX_ACL)) > - return -EOPNOTSUPP; > - if (!inode_owner_or_capable(inode)) > - return -EPERM; > - > - if (value) { > - acl = posix_acl_from_xattr(&init_user_ns, value, size); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - else if (acl) { > - error = posix_acl_valid(acl); > - if (error) > - goto release_and_out; > - } > - } else > - acl = NULL; > - > -retry: > - handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS(inode->i_sb)); > - if (IS_ERR(handle)) > - return PTR_ERR(handle); > - error = ext3_set_acl(handle, inode, type, acl); > - ext3_journal_stop(handle); > - if (error == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries)) > - goto retry; > + error = posix_acl_create(dir, &inode->i_mode, &default_acl, &acl); > + if (error) > + return error; > > -release_and_out: > - posix_acl_release(acl); > + if (default_acl) { > + error = __ext3_set_acl(handle, inode, ACL_TYPE_DEFAULT, > + default_acl); > + posix_acl_release(default_acl); > + } > + if (acl) { > + if (!error) > + error = __ext3_set_acl(handle, inode, ACL_TYPE_ACCESS, > + acl); > + posix_acl_release(acl); > + } > return error; > } > - > -const struct xattr_handler ext3_xattr_acl_access_handler = { > - .prefix = POSIX_ACL_XATTR_ACCESS, > - .flags = ACL_TYPE_ACCESS, > - .list = ext3_xattr_list_acl_access, > - .get = ext3_xattr_get_acl, > - .set = ext3_xattr_set_acl, > -}; > - > -const struct xattr_handler ext3_xattr_acl_default_handler = { > - .prefix = POSIX_ACL_XATTR_DEFAULT, > - .flags = ACL_TYPE_DEFAULT, > - .list = ext3_xattr_list_acl_default, > - .get = ext3_xattr_get_acl, > - .set = ext3_xattr_set_acl, > -}; > diff --git a/fs/ext3/acl.h b/fs/ext3/acl.h > index dbc921e..ea1c69e 100644 > --- a/fs/ext3/acl.h > +++ b/fs/ext3/acl.h > @@ -55,18 +55,13 @@ static inline int ext3_acl_count(size_t size) > > /* acl.c */ > extern struct posix_acl *ext3_get_acl(struct inode *inode, int type); > -extern int ext3_acl_chmod (struct inode *); > +extern int ext3_set_acl(struct inode *inode, struct posix_acl *acl, int type); > extern int ext3_init_acl (handle_t *, struct inode *, struct inode *); > > #else /* CONFIG_EXT3_FS_POSIX_ACL */ > #include <linux/sched.h> > #define ext3_get_acl NULL > - > -static inline int > -ext3_acl_chmod(struct inode *inode) > -{ > - return 0; > -} > +#define ext3_set_acl NULL > > static inline int > ext3_init_acl(handle_t *handle, struct inode *inode, struct inode *dir) > diff --git a/fs/ext3/file.c b/fs/ext3/file.c > index 25cb413..aad0531 100644 > --- a/fs/ext3/file.c > +++ b/fs/ext3/file.c > @@ -75,6 +75,7 @@ const struct inode_operations ext3_file_inode_operations = { > .removexattr = generic_removexattr, > #endif > .get_acl = ext3_get_acl, > + .set_acl = ext3_set_acl, > .fiemap = ext3_fiemap, > }; > > diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c > index 2bd8548..150b6c1 100644 > --- a/fs/ext3/inode.c > +++ b/fs/ext3/inode.c > @@ -3365,7 +3365,7 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr) > mark_inode_dirty(inode); > > if (ia_valid & ATTR_MODE) > - rc = ext3_acl_chmod(inode); > + rc = posix_acl_chmod(inode); > > err_out: > ext3_std_error(inode->i_sb, error); > diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c > index f8cde46..f197736 100644 > --- a/fs/ext3/namei.c > +++ b/fs/ext3/namei.c > @@ -2569,6 +2569,7 @@ const struct inode_operations ext3_dir_inode_operations = { > .removexattr = generic_removexattr, > #endif > .get_acl = ext3_get_acl, > + .set_acl = ext3_set_acl, > }; > > const struct inode_operations ext3_special_inode_operations = { > @@ -2580,4 +2581,5 @@ const struct inode_operations ext3_special_inode_operations = { > .removexattr = generic_removexattr, > #endif > .get_acl = ext3_get_acl, > + .set_acl = ext3_set_acl, > }; > diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c > index b1fc963..c6874be 100644 > --- a/fs/ext3/xattr.c > +++ b/fs/ext3/xattr.c > @@ -102,8 +102,8 @@ static struct mb_cache *ext3_xattr_cache; > static const struct xattr_handler *ext3_xattr_handler_map[] = { > [EXT3_XATTR_INDEX_USER] = &ext3_xattr_user_handler, > #ifdef CONFIG_EXT3_FS_POSIX_ACL > - [EXT3_XATTR_INDEX_POSIX_ACL_ACCESS] = &ext3_xattr_acl_access_handler, > - [EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT] = &ext3_xattr_acl_default_handler, > + [EXT3_XATTR_INDEX_POSIX_ACL_ACCESS] = &posix_acl_access_xattr_handler, > + [EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT] = &posix_acl_default_xattr_handler, > #endif > [EXT3_XATTR_INDEX_TRUSTED] = &ext3_xattr_trusted_handler, > #ifdef CONFIG_EXT3_FS_SECURITY > @@ -115,8 +115,8 @@ const struct xattr_handler *ext3_xattr_handlers[] = { > &ext3_xattr_user_handler, > &ext3_xattr_trusted_handler, > #ifdef CONFIG_EXT3_FS_POSIX_ACL > - &ext3_xattr_acl_access_handler, > - &ext3_xattr_acl_default_handler, > + &posix_acl_access_xattr_handler, > + &posix_acl_default_xattr_handler, > #endif > #ifdef CONFIG_EXT3_FS_SECURITY > &ext3_xattr_security_handler, > diff --git a/fs/ext3/xattr.h b/fs/ext3/xattr.h > index 2be4f69..32e93eb 100644 > --- a/fs/ext3/xattr.h > +++ b/fs/ext3/xattr.h > @@ -60,8 +60,6 @@ struct ext3_xattr_entry { > > extern const struct xattr_handler ext3_xattr_user_handler; > extern const struct xattr_handler ext3_xattr_trusted_handler; > -extern const struct xattr_handler ext3_xattr_acl_access_handler; > -extern const struct xattr_handler ext3_xattr_acl_default_handler; > extern const struct xattr_handler ext3_xattr_security_handler; > > extern ssize_t ext3_listxattr(struct dentry *, char *, size_t); > diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c > index f827f3b..acaba0f 100644 > --- a/fs/ext4/acl.c > +++ b/fs/ext4/acl.c > @@ -196,7 +196,7 @@ ext4_get_acl(struct inode *inode, int type) > * inode->i_mutex: down unless called from ext4_new_inode > */ > static int > -ext4_set_acl(handle_t *handle, struct inode *inode, int type, > +__ext4_set_acl(handle_t *handle, struct inode *inode, int type, > struct posix_acl *acl) > { > int name_index; > @@ -248,208 +248,51 @@ ext4_set_acl(handle_t *handle, struct inode *inode, int type, > return error; > } > > -/* > - * Initialize the ACLs of a new inode. Called from ext4_new_inode. > - * > - * dir->i_mutex: down > - * inode->i_mutex: up (access to inode is still exclusive) > - */ > -int > -ext4_init_acl(handle_t *handle, struct inode *inode, struct inode *dir) > -{ > - struct posix_acl *acl = NULL; > - int error = 0; > - > - if (!S_ISLNK(inode->i_mode)) { > - if (test_opt(dir->i_sb, POSIX_ACL)) { > - acl = ext4_get_acl(dir, ACL_TYPE_DEFAULT); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - } > - if (!acl) > - inode->i_mode &= ~current_umask(); > - } > - if (test_opt(inode->i_sb, POSIX_ACL) && acl) { > - if (S_ISDIR(inode->i_mode)) { > - error = ext4_set_acl(handle, inode, > - ACL_TYPE_DEFAULT, acl); > - if (error) > - goto cleanup; > - } > - error = __posix_acl_create(&acl, GFP_NOFS, &inode->i_mode); > - if (error < 0) > - return error; > - > - if (error > 0) { > - /* This is an extended ACL */ > - error = ext4_set_acl(handle, inode, ACL_TYPE_ACCESS, acl); > - } > - } > -cleanup: > - posix_acl_release(acl); > - return error; > -} > - > -/* > - * Does chmod for an inode that may have an Access Control List. The > - * inode->i_mode field must be updated to the desired value by the caller > - * before calling this function. > - * Returns 0 on success, or a negative error number. > - * > - * We change the ACL rather than storing some ACL entries in the file > - * mode permission bits (which would be more efficient), because that > - * would break once additional permissions (like ACL_APPEND, ACL_DELETE > - * for directories) are added. There are no more bits available in the > - * file mode. > - * > - * inode->i_mutex: down > - */ > int > -ext4_acl_chmod(struct inode *inode) > +ext4_set_acl(struct inode *inode, struct posix_acl *acl, int type) > { > - struct posix_acl *acl; > handle_t *handle; > - int retries = 0; > - int error; > - > + int error, retries = 0; > > - if (S_ISLNK(inode->i_mode)) > - return -EOPNOTSUPP; > - if (!test_opt(inode->i_sb, POSIX_ACL)) > - return 0; > - acl = ext4_get_acl(inode, ACL_TYPE_ACCESS); > - if (IS_ERR(acl) || !acl) > - return PTR_ERR(acl); > - error = __posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); > - if (error) > - return error; > retry: > handle = ext4_journal_start(inode, EXT4_HT_XATTR, > ext4_jbd2_credits_xattr(inode)); > - if (IS_ERR(handle)) { > - error = PTR_ERR(handle); > - ext4_std_error(inode->i_sb, error); > - goto out; > - } > - error = ext4_set_acl(handle, inode, ACL_TYPE_ACCESS, acl); > + if (IS_ERR(handle)) > + return PTR_ERR(handle); > + > + error = __ext4_set_acl(handle, inode, type, acl); > ext4_journal_stop(handle); > - if (error == -ENOSPC && > - ext4_should_retry_alloc(inode->i_sb, &retries)) > + if (error == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) > goto retry; > -out: > - posix_acl_release(acl); > return error; > } > > /* > - * Extended attribute handlers > + * Initialize the ACLs of a new inode. Called from ext4_new_inode. > + * > + * dir->i_mutex: down > + * inode->i_mutex: up (access to inode is still exclusive) > */ > -static size_t > -ext4_xattr_list_acl_access(struct dentry *dentry, char *list, size_t list_len, > - const char *name, size_t name_len, int type) > -{ > - const size_t size = sizeof(POSIX_ACL_XATTR_ACCESS); > - > - if (!test_opt(dentry->d_sb, POSIX_ACL)) > - return 0; > - if (list && size <= list_len) > - memcpy(list, POSIX_ACL_XATTR_ACCESS, size); > - return size; > -} > - > -static size_t > -ext4_xattr_list_acl_default(struct dentry *dentry, char *list, size_t list_len, > - const char *name, size_t name_len, int type) > -{ > - const size_t size = sizeof(POSIX_ACL_XATTR_DEFAULT); > - > - if (!test_opt(dentry->d_sb, POSIX_ACL)) > - return 0; > - if (list && size <= list_len) > - memcpy(list, POSIX_ACL_XATTR_DEFAULT, size); > - return size; > -} > - > -static int > -ext4_xattr_get_acl(struct dentry *dentry, const char *name, void *buffer, > - size_t size, int type) > +int > +ext4_init_acl(handle_t *handle, struct inode *inode, struct inode *dir) > { > - struct posix_acl *acl; > + struct posix_acl *default_acl, *acl; > int error; > > - if (strcmp(name, "") != 0) > - return -EINVAL; > - if (!test_opt(dentry->d_sb, POSIX_ACL)) > - return -EOPNOTSUPP; > - > - acl = ext4_get_acl(dentry->d_inode, type); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - if (acl == NULL) > - return -ENODATA; > - error = posix_acl_to_xattr(&init_user_ns, acl, buffer, size); > - posix_acl_release(acl); > - > - return error; > -} > - > -static int > -ext4_xattr_set_acl(struct dentry *dentry, const char *name, const void *value, > - size_t size, int flags, int type) > -{ > - struct inode *inode = dentry->d_inode; > - handle_t *handle; > - struct posix_acl *acl; > - int error, retries = 0; > - > - if (strcmp(name, "") != 0) > - return -EINVAL; > - if (!test_opt(inode->i_sb, POSIX_ACL)) > - return -EOPNOTSUPP; > - if (!inode_owner_or_capable(inode)) > - return -EPERM; > - > - if (value) { > - acl = posix_acl_from_xattr(&init_user_ns, value, size); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - else if (acl) { > - error = posix_acl_valid(acl); > - if (error) > - goto release_and_out; > - } > - } else > - acl = NULL; > + error = posix_acl_create(dir, &inode->i_mode, &default_acl, &acl); > + if (error) > + return error; > > -retry: > - handle = ext4_journal_start(inode, EXT4_HT_XATTR, > - ext4_jbd2_credits_xattr(inode)); > - if (IS_ERR(handle)) { > - error = PTR_ERR(handle); > - goto release_and_out; > + if (default_acl) { > + error = __ext4_set_acl(handle, inode, ACL_TYPE_DEFAULT, > + default_acl); > + posix_acl_release(default_acl); > + } > + if (acl) { > + if (!error) > + error = __ext4_set_acl(handle, inode, ACL_TYPE_ACCESS, > + acl); > + posix_acl_release(acl); > } > - error = ext4_set_acl(handle, inode, type, acl); > - ext4_journal_stop(handle); > - if (error == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) > - goto retry; > - > -release_and_out: > - posix_acl_release(acl); > return error; > } > - > -const struct xattr_handler ext4_xattr_acl_access_handler = { > - .prefix = POSIX_ACL_XATTR_ACCESS, > - .flags = ACL_TYPE_ACCESS, > - .list = ext4_xattr_list_acl_access, > - .get = ext4_xattr_get_acl, > - .set = ext4_xattr_set_acl, > -}; > - > -const struct xattr_handler ext4_xattr_acl_default_handler = { > - .prefix = POSIX_ACL_XATTR_DEFAULT, > - .flags = ACL_TYPE_DEFAULT, > - .list = ext4_xattr_list_acl_default, > - .get = ext4_xattr_get_acl, > - .set = ext4_xattr_set_acl, > -}; > diff --git a/fs/ext4/acl.h b/fs/ext4/acl.h > index 18cb39e..da2c795 100644 > --- a/fs/ext4/acl.h > +++ b/fs/ext4/acl.h > @@ -55,18 +55,13 @@ static inline int ext4_acl_count(size_t size) > > /* acl.c */ > struct posix_acl *ext4_get_acl(struct inode *inode, int type); > -extern int ext4_acl_chmod(struct inode *); > +int ext4_set_acl(struct inode *inode, struct posix_acl *acl, int type); > extern int ext4_init_acl(handle_t *, struct inode *, struct inode *); > > #else /* CONFIG_EXT4_FS_POSIX_ACL */ > #include <linux/sched.h> > #define ext4_get_acl NULL > - > -static inline int > -ext4_acl_chmod(struct inode *inode) > -{ > - return 0; > -} > +#define ext4_set_acl NULL > > static inline int > ext4_init_acl(handle_t *handle, struct inode *inode, struct inode *dir) > diff --git a/fs/ext4/file.c b/fs/ext4/file.c > index 3da2194..43e64f6 100644 > --- a/fs/ext4/file.c > +++ b/fs/ext4/file.c > @@ -617,6 +617,7 @@ const struct inode_operations ext4_file_inode_operations = { > .listxattr = ext4_listxattr, > .removexattr = generic_removexattr, > .get_acl = ext4_get_acl, > + .set_acl = ext4_set_acl, > .fiemap = ext4_fiemap, > }; > > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index 0757634..6f69f96 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -4675,7 +4675,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) > ext4_orphan_del(NULL, inode); > > if (!rc && (ia_valid & ATTR_MODE)) > - rc = ext4_acl_chmod(inode); > + rc = posix_acl_chmod(inode); > > err_out: > ext4_std_error(inode->i_sb, error); > diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c > index 5a0408d..e77c1ba 100644 > --- a/fs/ext4/namei.c > +++ b/fs/ext4/namei.c > @@ -3225,6 +3225,7 @@ const struct inode_operations ext4_dir_inode_operations = { > .listxattr = ext4_listxattr, > .removexattr = generic_removexattr, > .get_acl = ext4_get_acl, > + .set_acl = ext4_set_acl, > .fiemap = ext4_fiemap, > }; > > @@ -3235,4 +3236,5 @@ const struct inode_operations ext4_special_inode_operations = { > .listxattr = ext4_listxattr, > .removexattr = generic_removexattr, > .get_acl = ext4_get_acl, > + .set_acl = ext4_set_acl, > }; > diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c > index 1423c48..e175e94 100644 > --- a/fs/ext4/xattr.c > +++ b/fs/ext4/xattr.c > @@ -95,8 +95,8 @@ static struct mb_cache *ext4_xattr_cache; > static const struct xattr_handler *ext4_xattr_handler_map[] = { > [EXT4_XATTR_INDEX_USER] = &ext4_xattr_user_handler, > #ifdef CONFIG_EXT4_FS_POSIX_ACL > - [EXT4_XATTR_INDEX_POSIX_ACL_ACCESS] = &ext4_xattr_acl_access_handler, > - [EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT] = &ext4_xattr_acl_default_handler, > + [EXT4_XATTR_INDEX_POSIX_ACL_ACCESS] = &posix_acl_access_xattr_handler, > + [EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT] = &posix_acl_default_xattr_handler, > #endif > [EXT4_XATTR_INDEX_TRUSTED] = &ext4_xattr_trusted_handler, > #ifdef CONFIG_EXT4_FS_SECURITY > @@ -108,8 +108,8 @@ const struct xattr_handler *ext4_xattr_handlers[] = { > &ext4_xattr_user_handler, > &ext4_xattr_trusted_handler, > #ifdef CONFIG_EXT4_FS_POSIX_ACL > - &ext4_xattr_acl_access_handler, > - &ext4_xattr_acl_default_handler, > + &posix_acl_access_xattr_handler, > + &posix_acl_default_xattr_handler, > #endif > #ifdef CONFIG_EXT4_FS_SECURITY > &ext4_xattr_security_handler, > diff --git a/fs/ext4/xattr.h b/fs/ext4/xattr.h > index c767dbd..819d639 100644 > --- a/fs/ext4/xattr.h > +++ b/fs/ext4/xattr.h > @@ -96,8 +96,6 @@ struct ext4_xattr_ibody_find { > > extern const struct xattr_handler ext4_xattr_user_handler; > extern const struct xattr_handler ext4_xattr_trusted_handler; > -extern const struct xattr_handler ext4_xattr_acl_access_handler; > -extern const struct xattr_handler ext4_xattr_acl_default_handler; > extern const struct xattr_handler ext4_xattr_security_handler; > > extern ssize_t ext4_listxattr(struct dentry *, char *, size_t); > -- > 1.7.10.4 > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo at vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Jan Kara <jack@suse.cz> SUSE Labs, CR ^ permalink raw reply [flat|nested] 29+ messages in thread
end of thread, other threads:[~2013-12-12 21:05 UTC | newest] Thread overview: 29+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-12-11 10:42 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation V2 Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 01/18] reiserfs: prefix ACL symbols with reiserfs_ Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 02/18] fs: add get_acl helper Christoph Hellwig 2013-12-12 19:06 ` Andreas Gruenbacher 2013-12-12 21:04 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 03/18] fs: add a set_acl inode operation Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 04/18] fs: add generic xattr_acl handlers Christoph Hellwig 2013-12-12 19:07 ` Andreas Gruenbacher 2013-12-11 10:42 ` [Cluster-devel] [PATCH 05/18] fs: make posix_acl_chmod more useful Christoph Hellwig 2013-12-12 19:07 ` Andreas Gruenbacher 2013-12-12 21:05 ` Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 06/18] fs: make posix_acl_create " Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 07/18] btrfs: use generic posix ACL infrastructure Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 08/18] ext2/3/4: " Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 09/18] f2fs: " Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 10/18] hfsplus: " Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 11/18] jffs2: " Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 12/18] ocfs2: " Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 13/18] reiserfs: " Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 14/18] xfs: " Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 15/18] jfs: " Christoph Hellwig 2013-12-11 10:42 ` [Cluster-devel] [PATCH 16/18] gfs2: " Christoph Hellwig 2013-12-11 10:52 ` Steven Whitehouse 2013-12-12 19:08 ` Andreas Gruenbacher 2013-12-12 21:05 ` Christoph Hellwig 2013-12-11 10:43 ` [Cluster-devel] [PATCH 17/18] nfs: use generic posix ACL infrastructure for v3 Posix ACLs Christoph Hellwig 2013-12-11 10:43 ` [Cluster-devel] [PATCH 18/18] fs: remove generic_acl Christoph Hellwig -- strict thread matches above, loose matches on Subject: below -- 2013-12-01 11:59 [Cluster-devel] [PATCH 00/18] Consolidate Posix ACL implementation Christoph Hellwig 2013-12-01 11:59 ` [Cluster-devel] [PATCH 08/18] ext2/3/4: use generic posix ACL infrastructure Christoph Hellwig 2013-12-02 22:13 ` Jan Kara
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).