Merge tag 'Smack-for-v5.12' of git://github.com/cschaufler/smack-next
[linux-2.6-microblaze.git] / fs / f2fs / acl.c
index 1e5e9b1..732ec10 100644 (file)
@@ -200,6 +200,27 @@ struct posix_acl *f2fs_get_acl(struct inode *inode, int type)
        return __f2fs_get_acl(inode, type, NULL);
 }
 
+static int f2fs_acl_update_mode(struct inode *inode, umode_t *mode_p,
+                         struct posix_acl **acl)
+{
+       umode_t mode = inode->i_mode;
+       int error;
+
+       if (is_inode_flag_set(inode, FI_ACL_MODE))
+               mode = F2FS_I(inode)->i_acl_mode;
+
+       error = posix_acl_equiv_mode(*acl, &mode);
+       if (error < 0)
+               return error;
+       if (error == 0)
+               *acl = NULL;
+       if (!in_group_p(inode->i_gid) &&
+           !capable_wrt_inode_uidgid(inode, CAP_FSETID))
+               mode &= ~S_ISGID;
+       *mode_p = mode;
+       return 0;
+}
+
 static int __f2fs_set_acl(struct inode *inode, int type,
                        struct posix_acl *acl, struct page *ipage)
 {
@@ -213,7 +234,7 @@ static int __f2fs_set_acl(struct inode *inode, int type,
        case ACL_TYPE_ACCESS:
                name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS;
                if (acl && !ipage) {
-                       error = posix_acl_update_mode(inode, &mode, &acl);
+                       error = f2fs_acl_update_mode(inode, &mode, &acl);
                        if (error)
                                return error;
                        set_acl_inode(inode, mode);