btrfs: Don't clear SGID when inheriting ACLs
[pandora-kernel.git] / fs / btrfs / acl.c
index 9f55b54..1161286 100644 (file)
@@ -117,12 +117,6 @@ static int btrfs_set_acl(struct btrfs_trans_handle *trans,
        switch (type) {
        case ACL_TYPE_ACCESS:
                name = POSIX_ACL_XATTR_ACCESS;
-               if (acl) {
-                       ret = posix_acl_update_mode(inode, &inode->i_mode, &acl);
-                       if (ret)
-                               return ret;
-               }
-               ret = 0;
                break;
        case ACL_TYPE_DEFAULT:
                if (!S_ISDIR(inode->i_mode))
@@ -161,11 +155,12 @@ static int btrfs_xattr_acl_set(struct dentry *dentry, const char *name,
 {
        int ret;
        struct posix_acl *acl = NULL;
+       struct inode *inode = dentry->d_inode;
 
-       if (!inode_owner_or_capable(dentry->d_inode))
+       if (!inode_owner_or_capable(inode))
                return -EPERM;
 
-       if (!IS_POSIXACL(dentry->d_inode))
+       if (!IS_POSIXACL(inode))
                return -EOPNOTSUPP;
 
        if (value) {
@@ -180,7 +175,12 @@ static int btrfs_xattr_acl_set(struct dentry *dentry, const char *name,
                }
        }
 
-       ret = btrfs_set_acl(NULL, dentry->d_inode, acl, type);
+       if (type == ACL_TYPE_ACCESS && acl) {
+               ret = posix_acl_update_mode(inode, &inode->i_mode, &acl);
+               if (ret)
+                       goto out;
+       }
+       ret = btrfs_set_acl(NULL, inode, acl, type);
 out:
        posix_acl_release(acl);