lkml.org 
[lkml]   [2013]   [Dec]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 110/118] Btrfs: fix incorrect inode acl reset
    Date
    3.12-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Filipe David Borba Manana <fdmanana@gmail.com>

    commit 8185554d3eb09d23a805456b6fa98dcbb34aa518 upstream.

    When a directory has a default ACL and a subdirectory is created
    under that directory, btrfs_init_acl() is called when the
    subdirectory's inode is created to initialize the inode's ACL
    (inherited from the parent directory) but it was clearing the ACL
    from the inode after setting it if posix_acl_create() returned
    success, instead of clearing it only if it returned an error.

    To reproduce this issue:

    $ mkfs.btrfs -f /dev/loop0
    $ mount /dev/loop0 /mnt
    $ mkdir /mnt/acl
    $ setfacl -d --set u::rwx,g::rwx,o::- /mnt/acl
    $ getfacl /mnt/acl
    user::rwx
    group::rwx
    other::r-x
    default:user::rwx
    default:group::rwx
    default:other::---

    $ mkdir /mnt/acl/dir1
    $ getfacl /mnt/acl/dir1
    user::rwx
    group::rwx
    other::---

    After unmounting and mounting again the filesystem, fgetacl returned the
    expected ACL:

    $ umount /mnt/acl
    $ mount /dev/loop0 /mnt
    $ getfacl /mnt/acl/dir1
    user::rwx
    group::rwx
    other::---
    default:user::rwx
    default:group::rwx
    default:other::---

    Meaning that the underlying xattr was persisted.

    Reported-by: Giuseppe Fierro <giuseppe@fierro.org>
    Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com>
    Signed-off-by: Josef Bacik <jbacik@fusionio.com>
    Signed-off-by: Chris Mason <chris.mason@fusionio.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/btrfs/acl.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/fs/btrfs/acl.c
    +++ b/fs/btrfs/acl.c
    @@ -229,7 +229,7 @@ int btrfs_init_acl(struct btrfs_trans_ha
    if (ret > 0) {
    /* we need an acl */
    ret = btrfs_set_acl(trans, inode, acl, ACL_TYPE_ACCESS);
    - } else {
    + } else if (ret < 0) {
    cache_no_acl(inode);
    }
    } else {



    \
     
     \ /
      Last update: 2013-12-19 00:41    [W:3.414 / U:0.748 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site