From: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
To: Sheng Yong <shengyong1@huawei.com>, <dedekind1@gmail.com>,
<richard.weinberger@gmail.com>, <andreas.gruenbacher@gmail.com>
Cc: <linux-mtd@lists.infradead.org>, <linux-fsdevel@vger.kernel.org>
Subject: Re: [RFC PATCH v3 1/5] UBIFS: ACL: introduce init/set/get functions for ACL
Date: Fri, 11 Sep 2015 14:21:05 +0800 [thread overview]
Message-ID: <55F272D1.7000805@cn.fujitsu.com> (raw)
In-Reply-To: <55F270EE.9060801@huawei.com>
On 09/11/2015 02:13 PM, Sheng Yong wrote:
> Hi, Dongsheng
>
> On 9/11/2015 1:01 PM, Dongsheng Yang wrote:
>> On 09/11/2015 05:09 PM, Sheng Yong wrote:
>>> This patch introduce a new file `acl.c', which implements:
>>> * initializing ACL for new file according to the directory's default ACL,
>>> * getting ACL which finds the ACL releated xattr and converts it to ACL,
>>> * setting ACL function which converts ACL to xattr and creates/changes/
>>> removes the xattr.
>>>
>>> On flash ACL format is based on POSIX ACL structures, and POSIX generic
>>> functions, posix_acl_[to|from]_xattr, are called to do the ACL conversion
>>> between in-memory and on-flash ACL.
>>>
>>> The ACL xattr handler is not implemented, because UBIFS does not use it.
>>
>> Why not, I think we can use it.
> First of all, thanks for your review :)
>
> It seems xattr handler will be removed because of dead code of security xattr.
> And if we do so, I think it's better to do that for all xattr, but not just
> security and ACL, and generic_[set|get]xattr should be set in inode_operations
> instead of ubifs_[get|set]xattr.
Security handler is different with acl handler. Please read the
security_getxattr(), it just return ubifs_getxattr(). That means
we can use ubifs_getxattr() immediately. So we can remove the
security_handler for ubifs.
But acl is different, we need to call a special ubifs_get_acl()
here. Then I found you get the handler by youself in the
ubifs_get|set_xattr() and call handler->set() by youself.
That's not good idea. Please Just set the handler and call
generic_setxattr().
Yang
>
> thanks,
> Sheng
>>
>> Yang
>>>
>>> Signed-off-by: Sheng Yong <shengyong1@huawei.com>
>>> ---
>>> fs/ubifs/acl.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>> fs/ubifs/ubifs.h | 14 ++++++
>>> 2 files changed, 155 insertions(+)
>>> create mode 100644 fs/ubifs/acl.c
>>>
>>> diff --git a/fs/ubifs/acl.c b/fs/ubifs/acl.c
>>> new file mode 100644
>>> index 0000000..bf37875
>>> --- /dev/null
>>> +++ b/fs/ubifs/acl.c
>>> @@ -0,0 +1,141 @@
>>> +/*
>>> + * This file is part of UBIFS.
>>> + *
>>> + * This program is free software; you can redistribute it and/or modify it
>>> + * under the terms of the GNU General Public License version 2 as published by
>>> + * the Free Software Foundation.
>>> + *
>>> + * 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/fs.h>
>>> +#include <linux/xattr.h>
>>> +#include <linux/posix_acl_xattr.h>
>>> +
>>> +#include "ubifs.h"
>>> +
>>> +struct posix_acl *ubifs_get_acl(struct inode *inode, int type)
>>> +{
>>> + struct posix_acl *acl;
>>> + char *name, *value = NULL;
>>> + int size = 0;
>>> +
>>> + switch (type) {
>>> + case ACL_TYPE_ACCESS:
>>> + name = XATTR_NAME_POSIX_ACL_ACCESS;
>>> + break;
>>> + case ACL_TYPE_DEFAULT:
>>> + name = XATTR_NAME_POSIX_ACL_DEFAULT;
>>> + break;
>>> + default:
>>> + BUG();
>>> + }
>>> +
>>> + size = ubifs_do_getxattr(inode, name, NULL, 0);
>>> + if (size > 0) {
>>> + value = kmalloc(size, GFP_KERNEL);
>>> + if (!value)
>>> + return ERR_PTR(-ENOMEM);
>>> + size = ubifs_do_getxattr(inode, name, value, size);
>>> + }
>>> + if (size > 0)
>>> + acl = posix_acl_from_xattr(&init_user_ns, value, size);
>>> + else if (size == -ENODATA)
>>> + acl = NULL;
>>> + else
>>> + acl = ERR_PTR(size);
>>> +
>>> + kfree(value);
>>> + if (!IS_ERR(acl))
>>> + set_cached_acl(inode, type, acl);
>>> +
>>> + return acl;
>>> +}
>>> +
>>> +int ubifs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
>>> +{
>>> + char *name;
>>> + void *value = NULL;
>>> + size_t size = 0;
>>> + int flag = 0, err;
>>> +
>>> + switch (type) {
>>> + case ACL_TYPE_ACCESS:
>>> + name = XATTR_NAME_POSIX_ACL_ACCESS;
>>> + if (acl) {
>>> + err = posix_acl_equiv_mode(acl, &inode->i_mode);
>>> + if (err < 0)
>>> + return err;
>>> + if (err == 0)
>>> + acl = NULL;
>>> + }
>>> + break;
>>> +
>>> + case ACL_TYPE_DEFAULT:
>>> + name = XATTR_NAME_POSIX_ACL_DEFAULT;
>>> + if (!S_ISDIR(inode->i_mode))
>>> + return acl ? -EACCES : 0;
>>> + break;
>>> +
>>> + default:
>>> + BUG();
>>> + }
>>> +
>>> + if (acl) {
>>> + size = posix_acl_xattr_size(acl->a_count);
>>> + value = kmalloc(size, GFP_NOFS);
>>> + if (!value)
>>> + return -ENOMEM;
>>> +
>>> + err = posix_acl_to_xattr(&init_user_ns, acl, value, size);
>>> + if (err < 0) {
>>> + kfree(value);
>>> + return err;
>>> + }
>>> + }
>>> +
>>> + if (size == 0)
>>> + flag = XATTR_REPLACE;
>>> + err = ubifs_do_setxattr(inode, name, value, size, flag);
>>> +
>>> + kfree(value);
>>> + if (!err)
>>> + set_cached_acl(inode, type, acl);
>>> +
>>> + return err;
>>> +}
>>> +
>>> +/*
>>> + * Initialize the ACLs of a new inode.
>>> + */
>>> +int ubifs_init_acl(struct inode *dir, struct inode *inode)
>>> +{
>>> + struct posix_acl *default_acl, *acl;
>>> + int err;
>>> +
>>> + err = posix_acl_create(dir, &inode->i_mode, &default_acl, &acl);
>>> + if (err)
>>> + return err;
>>> +
>>> + if (default_acl) {
>>> + mutex_lock(&inode->i_mutex);
>>> + err = ubifs_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
>>> + mutex_unlock(&inode->i_mutex);
>>> + posix_acl_release(default_acl);
>>> + }
>>> +
>>> + if (acl) {
>>> + if (!err) {
>>> + mutex_lock(&inode->i_mutex);
>>> + err = ubifs_set_acl(inode, acl, ACL_TYPE_ACCESS);
>>> + mutex_unlock(&inode->i_mutex);
>>> + }
>>> + posix_acl_release(acl);
>>> + }
>>> +
>>> + return err;
>>> +}
>>> diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h
>>> index 62aa1a5..b9ddc8d 100644
>>> --- a/fs/ubifs/ubifs.h
>>> +++ b/fs/ubifs/ubifs.h
>>> @@ -1767,6 +1767,20 @@ int ubifs_removexattr(struct dentry *dentry, const char *name);
>>> int ubifs_init_security(struct inode *dentry, struct inode *inode,
>>> const struct qstr *qstr);
>>>
>>> +/* acl.c */
>>> +#ifdef CONFIG_UBIFS_FS_POSIX_ACL
>>> +int ubifs_init_acl(struct inode *dir, struct inode *inode);
>>> +int ubifs_set_acl(struct inode *inode, struct posix_acl *acl, int type);
>>> +struct posix_acl *ubifs_get_acl(struct inode *inode, int type);
>>> +#else
>>> +static inline int ubifs_init_acl(struct inode *inode, struct inode *dir)
>>> +{
>>> + return 0;
>>> +}
>>> +#define ubifs_get_acl NULL
>>> +#define ubifs_set_acl NULL
>>> +#endif
>>> +
>>> /* super.c */
>>> struct inode *ubifs_iget(struct super_block *sb, unsigned long inum);
>>>
>>>
>>
>>
>> .
>>
>
> .
>
next prev parent reply other threads:[~2015-09-11 6:27 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-11 9:09 [RFC PATCH v3 0/5] UBIFS: add ACL support Sheng Yong
2015-09-11 9:09 ` [RFC PATCH v3 1/5] UBIFS: ACL: introduce init/set/get functions for ACL Sheng Yong
2015-09-11 5:01 ` Dongsheng Yang
2015-09-11 6:13 ` Sheng Yong
2015-09-11 6:21 ` Dongsheng Yang [this message]
2015-09-11 20:05 ` Andreas Grünbacher
2015-09-11 9:09 ` [RFC PATCH v3 2/5] UBIFS: ACL: set ACL interfaces in inode_operations Sheng Yong
2015-09-11 9:09 ` [RFC PATCH v3 3/5] UBIFS: ACL: handle ACL through xattr Sheng Yong
2015-09-11 5:01 ` Dongsheng Yang
2015-09-11 6:18 ` Sheng Yong
2015-09-11 6:25 ` Dongsheng Yang
2015-09-12 1:15 ` Sheng Yong
2015-09-12 1:15 ` Sheng Yong
2015-09-14 0:39 ` Dongsheng Yang
2015-09-11 9:09 ` [RFC PATCH v3 4/5] UBIFS: ACL: introduce ACL mount options Sheng Yong
2015-09-11 5:03 ` Dongsheng Yang
2015-09-11 8:25 ` Sheng Yong
2015-09-11 8:25 ` Dongsheng Yang
2015-09-11 9:09 ` [RFC PATCH v3 5/5] UBIFS: ACL: add ACL config option Sheng Yong
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=55F272D1.7000805@cn.fujitsu.com \
--to=yangds.fnst@cn.fujitsu.com \
--cc=andreas.gruenbacher@gmail.com \
--cc=dedekind1@gmail.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=richard.weinberger@gmail.com \
--cc=shengyong1@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is 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.