lkml.org 
[lkml]   [2014]   [Jan]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [GIT PULL] Ceph updates for -rc1
    On Wed, Jan 29, 2014 at 06:30:00AM -0800, Sage Weil wrote:
    > The set_acl inode_operation wasn't getting set, and the prototype needed
    > to be adjusted a bit (it doesn't take a dentry anymore). All seems to be
    > well with the below patch.

    Btw, there's a few minor bits that should go on top of yours:

    - ->get_acl only gets called after we checked for a cached ACL, so no
    need to call get_cached_acl again.
    - no need to check IS_POSIXACL in ->get_acl, without that it should
    never get set as all the callers that set it already have the check.
    - you should be able to use the full posix_acl_create in CEPH

    Untested patch below:

    diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
    index 66d377a..9ab312e 100644
    --- a/fs/ceph/acl.c
    +++ b/fs/ceph/acl.c
    @@ -66,13 +66,6 @@ struct posix_acl *ceph_get_acl(struct inode *inode, int type)
    char *value = NULL;
    struct posix_acl *acl;

    - if (!IS_POSIXACL(inode))
    - return NULL;
    -
    - acl = ceph_get_cached_acl(inode, type);
    - if (acl != ACL_NOT_CACHED)
    - return acl;
    -
    switch (type) {
    case ACL_TYPE_ACCESS:
    name = POSIX_ACL_XATTR_ACCESS;
    @@ -190,41 +183,24 @@ out:

    int ceph_init_acl(struct dentry *dentry, struct inode *inode, struct inode *dir)
    {
    - struct posix_acl *acl = NULL;
    - int ret = 0;
    -
    - if (!S_ISLNK(inode->i_mode)) {
    - if (IS_POSIXACL(dir)) {
    - acl = ceph_get_acl(dir, ACL_TYPE_DEFAULT);
    - if (IS_ERR(acl)) {
    - ret = PTR_ERR(acl);
    - goto out;
    - }
    - }
    + struct posix_acl *default_acl, *acl;
    + int error;

    - if (!acl)
    - inode->i_mode &= ~current_umask();
    - }
    + error = posix_acl_create(dir, &inode->i_mode, &default_acl, &acl);
    + if (error)
    + return error;

    - if (IS_POSIXACL(dir) && acl) {
    - if (S_ISDIR(inode->i_mode)) {
    - ret = ceph_set_acl(inode, acl, ACL_TYPE_DEFAULT);
    - if (ret)
    - goto out_release;
    - }
    - ret = __posix_acl_create(&acl, GFP_NOFS, &inode->i_mode);
    - if (ret < 0)
    - goto out;
    - else if (ret > 0)
    - ret = ceph_set_acl(inode, acl, ACL_TYPE_ACCESS);
    - else
    - cache_no_acl(inode);
    - } else {
    + if (!default_acl && !acl)
    cache_no_acl(inode);
    - }

    -out_release:
    - posix_acl_release(acl);
    -out:
    - return ret;
    + if (default_acl) {
    + error = ceph_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
    + posix_acl_release(default_acl);
    + }
    + if (acl) {
    + if (!error)
    + error = ceph_set_acl(inode, acl, ACL_TYPE_ACCESS);
    + posix_acl_release(acl);
    + }
    + return error;
    }

    \
     
     \ /
      Last update: 2014-01-30 12:21    [W:4.058 / U:0.668 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site