From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
To: agruen@kernel.org, bfields@fieldses.org,
akpm@linux-foundation.org, viro@zeniv.linux.org.uk,
dhowells@redhat.com
Cc: aneesh.kumar@linux.vnet.ibm.com, linux-fsdevel@vger.kernel.org,
linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH -V1 15/22] richacl: Create-time inheritance
Date: Sun, 27 Apr 2014 21:44:46 +0530 [thread overview]
Message-ID: <1398615293-22931-16-git-send-email-aneesh.kumar@linux.vnet.ibm.com> (raw)
In-Reply-To: <1398615293-22931-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>
From: Andreas Gruenbacher <agruen@kernel.org>
When a new file is created, it can inherit an acl from its parent
directory; this is similar to how default acls work in POSIX (draft)
ACLs.
As with POSIX ACLs, if a file inherits an acl from its parent directory,
the intersection between the create mode and the permissions granted by
the inherited acl determines the file masks and file permission bits,
and the umask is ignored.
Signed-off-by: Andreas Gruenbacher <agruen@kernel.org>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
fs/Makefile | 2 +-
fs/richacl_base.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++
fs/richacl_inode.c | 59 ++++++++++++++++++++++++++++++++++++++++++
include/linux/richacl.h | 4 +++
4 files changed, 133 insertions(+), 1 deletion(-)
create mode 100644 fs/richacl_inode.c
diff --git a/fs/Makefile b/fs/Makefile
index 5b7ed5d022ec..bed5b8a623ba 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -49,7 +49,7 @@ obj-$(CONFIG_SYSCTL) += drop_caches.o
obj-$(CONFIG_FHANDLE) += fhandle.o
obj-$(CONFIG_FS_RICHACL) += richacl.o
-richacl-y := richacl_base.o
+richacl-y := richacl_base.o richacl_inode.o
obj-y += quota/
diff --git a/fs/richacl_base.c b/fs/richacl_base.c
index baa61da691a4..29ffea8e56d7 100644
--- a/fs/richacl_base.c
+++ b/fs/richacl_base.c
@@ -454,3 +454,72 @@ is_everyone:
return denied ? -EACCES : 0;
}
EXPORT_SYMBOL_GPL(richacl_permission);
+
+/**
+ * richacl_inherit - compute the inherited acl of a new file
+ * @dir_acl: acl of the containing directory
+ * @isdir: inherit by a directory or non-directory?
+ *
+ * A directory can have acl entries which files and/or directories created
+ * inside the directory will inherit. This function computes the acl for such
+ * a new file. If there is no inheritable acl, it will return %NULL.
+ */
+struct richacl *
+richacl_inherit(const struct richacl *dir_acl, int isdir)
+{
+ const struct richace *dir_ace;
+ struct richacl *acl = NULL;
+ struct richace *ace;
+ int count = 0;
+
+ if (isdir) {
+ richacl_for_each_entry(dir_ace, dir_acl) {
+ if (!richace_is_inheritable(dir_ace))
+ continue;
+ count++;
+ }
+ if (!count)
+ return NULL;
+ acl = richacl_alloc(count);
+ if (!acl)
+ return ERR_PTR(-ENOMEM);
+ ace = acl->a_entries;
+ richacl_for_each_entry(dir_ace, dir_acl) {
+ if (!richace_is_inheritable(dir_ace))
+ continue;
+ memcpy(ace, dir_ace, sizeof(struct richace));
+ if (dir_ace->e_flags & ACE4_NO_PROPAGATE_INHERIT_ACE)
+ richace_clear_inheritance_flags(ace);
+ if ((dir_ace->e_flags & ACE4_FILE_INHERIT_ACE) &&
+ !(dir_ace->e_flags & ACE4_DIRECTORY_INHERIT_ACE))
+ ace->e_flags |= ACE4_INHERIT_ONLY_ACE;
+ ace++;
+ }
+ } else {
+ richacl_for_each_entry(dir_ace, dir_acl) {
+ if (!(dir_ace->e_flags & ACE4_FILE_INHERIT_ACE))
+ continue;
+ count++;
+ }
+ if (!count)
+ return NULL;
+ acl = richacl_alloc(count);
+ if (!acl)
+ return ERR_PTR(-ENOMEM);
+ ace = acl->a_entries;
+ richacl_for_each_entry(dir_ace, dir_acl) {
+ if (!(dir_ace->e_flags & ACE4_FILE_INHERIT_ACE))
+ continue;
+ memcpy(ace, dir_ace, sizeof(struct richace));
+ richace_clear_inheritance_flags(ace);
+ /*
+ * ACE4_DELETE_CHILD is meaningless for
+ * non-directories, so clear it.
+ */
+ ace->e_mask &= ~ACE4_DELETE_CHILD;
+ ace++;
+ }
+ }
+
+ return acl;
+}
diff --git a/fs/richacl_inode.c b/fs/richacl_inode.c
new file mode 100644
index 000000000000..f590fb526812
--- /dev/null
+++ b/fs/richacl_inode.c
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2010 Novell, Inc.
+ * Written by Andreas Gruenbacher <agruen@kernel.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ */
+
+#include <linux/sched.h>
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/richacl.h>
+
+/**
+ * richacl_inherit_inode - compute inherited acl and file mode
+ * @dir_acl: acl of the containing directory
+ * @inode: inode of the new file (create mode in i_mode)
+ *
+ * The file permission bits in inode->i_mode must be set to the create mode.
+ * If there is an inheritable acl, the maximum permissions that the acl grants
+ * will be computed and permissions not granted by the acl will be removed from
+ * inode->i_mode. If there is no inheritable acl, the umask will be applied
+ * instead.
+ */
+struct richacl *
+richacl_inherit_inode(const struct richacl *dir_acl, struct inode *inode)
+{
+ struct richacl *acl;
+ mode_t mask;
+
+ acl = richacl_inherit(dir_acl, S_ISDIR(inode->i_mode));
+ if (acl) {
+
+ richacl_compute_max_masks(acl);
+
+ /*
+ * Ensure that the acl will not grant any permissions beyond
+ * the create mode.
+ */
+ acl->a_flags |= ACL4_MASKED;
+ acl->a_owner_mask &= richacl_mode_to_mask(inode->i_mode >> 6) |
+ ACE4_POSIX_OWNER_ALLOWED;
+ acl->a_group_mask &= richacl_mode_to_mask(inode->i_mode >> 3);
+ acl->a_other_mask &= richacl_mode_to_mask(inode->i_mode);
+ mask = ~S_IRWXUGO | richacl_masks_to_mode(acl);
+ } else
+ mask = ~current_umask();
+
+ inode->i_mode &= mask;
+ return acl;
+}
+EXPORT_SYMBOL_GPL(richacl_inherit_inode);
diff --git a/include/linux/richacl.h b/include/linux/richacl.h
index d43700a179d3..47855ec8db4d 100644
--- a/include/linux/richacl.h
+++ b/include/linux/richacl.h
@@ -284,5 +284,9 @@ extern void richacl_compute_max_masks(struct richacl *);
extern struct richacl *richacl_chmod(struct richacl *, mode_t);
extern int richacl_permission(struct inode *, const struct richacl *,
unsigned int);
+extern struct richacl *richacl_inherit(const struct richacl *, int);
+/* richacl_inode.c */
+extern struct richacl *richacl_inherit_inode(const struct richacl *,
+ struct inode *);
#endif /* __RICHACL_H */
--
1.9.1
next prev parent reply other threads:[~2014-04-27 16:14 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-27 16:14 [PATCH -V1 00/22] New ACL format for better NFSv4 acl interoperability Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 01/22] vfs: Add generic IS_ACL() test for acl support Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 03/22] vfs: Optimize out IS_RICHACL() if CONFIG_FS_RICHACL is not defined Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 04/22] vfs: check for directory early Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 05/22] vfs: Add new file and directory create permission flags Aneesh Kumar K.V
2014-04-28 11:23 ` Jeff Layton
[not found] ` <20140428072301.123674d4-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2014-04-29 0:04 ` Dave Chinner
2014-05-01 15:16 ` Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 06/22] vfs: Add delete child and delete self " Aneesh Kumar K.V
2014-04-29 0:07 ` Dave Chinner
2014-05-01 15:18 ` Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 07/22] vfs: Make the inode passed to inode_change_ok non-const Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 08/22] vfs: Add permission flags for setting file attributes Aneesh Kumar K.V
2014-04-29 0:17 ` Dave Chinner
2014-05-01 15:20 ` Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 09/22] vfs: Make acl_permission_check() work for richacls Aneesh Kumar K.V
2014-04-29 0:20 ` Dave Chinner
2014-05-01 15:39 ` Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 10/22] richacl: In-memory representation and helper functions Aneesh Kumar K.V
2014-04-29 0:24 ` Dave Chinner
2014-05-01 15:42 ` Aneesh Kumar K.V
[not found] ` <1398615293-22931-11-git-send-email-aneesh.kumar-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2014-05-06 9:35 ` Kinglong Mee
2014-04-27 16:14 ` [PATCH -V1 11/22] richacl: Permission mapping functions Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 12/22] richacl: Compute maximum file masks from an acl Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 14/22] richacl: Permission check algorithm Aneesh Kumar K.V
2014-04-27 16:14 ` Aneesh Kumar K.V [this message]
2014-04-27 16:14 ` [PATCH -V1 16/22] richacl: Check if an acl is equivalent to a file mode Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 17/22] richacl: Automatic Inheritance Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 18/22] richacl: xattr mapping functions Aneesh Kumar K.V
[not found] ` <1398615293-22931-1-git-send-email-aneesh.kumar-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2014-04-27 16:14 ` [PATCH -V1 02/22] vfs: Add IS_RICHACL() test for richacl support Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 13/22] richacl: Update the file masks in chmod() Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 19/22] vfs: Cache richacl in struct inode Aneesh Kumar K.V
[not found] ` <1398615293-22931-20-git-send-email-aneesh.kumar-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2014-04-29 0:52 ` Dave Chinner
2014-04-29 12:16 ` Matthew Wilcox
2014-05-01 15:45 ` Aneesh Kumar K.V
2014-04-27 22:20 ` [PATCH -V1 00/22] New ACL format for better NFSv4 acl interoperability Dave Chinner
2014-04-28 5:24 ` Aneesh Kumar K.V
2014-04-28 23:58 ` Dave Chinner
2014-05-01 15:49 ` Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 20/22] vfs: Add richacl permission check Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 21/22] ext4: Implement rich acl for ext4 Aneesh Kumar K.V
2014-04-27 16:14 ` [PATCH -V1 22/22] ext4: Add Ext4 compat richacl feature flag Aneesh Kumar K.V
[not found] ` <1398615293-22931-23-git-send-email-aneesh.kumar-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2014-04-28 21:31 ` Andreas Dilger
[not found] ` <88FB2DB7-126A-400E-9B44-19E99A553B2B-m1MBpc4rdrD3fQ9qLvQP4Q@public.gmane.org>
2014-05-01 15:48 ` Aneesh Kumar K.V
2014-05-01 17:52 ` Andreas Dilger
2014-04-28 4:39 ` [PATCH -V1 00/22] New ACL format for better NFSv4 acl interoperability Christoph Hellwig
[not found] ` <20140428043909.GA26778-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2014-04-28 5:54 ` Aneesh Kumar K.V
[not found] ` <87wqeaatj3.fsf-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2014-04-28 9:03 ` Christoph Hellwig
2014-05-06 20:15 ` J. Bruce Fields
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=1398615293-22931-16-git-send-email-aneesh.kumar@linux.vnet.ibm.com \
--to=aneesh.kumar@linux.vnet.ibm.com \
--cc=agruen@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=bfields@fieldses.org \
--cc=dhowells@redhat.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--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 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).