Merge tag 'v6.4/vfs.acl' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[linux-block.git] / fs / ocfs2 / xattr.c
index 83881bb4eace9d1aa76d23d678b501141d8a94cd..4ac77ff6e676aeeae585ea8806f488a7c964e10c 100644 (file)
@@ -7255,9 +7255,21 @@ static int ocfs2_xattr_security_set(const struct xattr_handler *handler,
 static int ocfs2_initxattrs(struct inode *inode, const struct xattr *xattr_array,
                     void *fs_info)
 {
+       struct ocfs2_security_xattr_info *si = fs_info;
        const struct xattr *xattr;
        int err = 0;
 
+       if (si) {
+               si->value = kmemdup(xattr_array->value, xattr_array->value_len,
+                                   GFP_KERNEL);
+               if (!si->value)
+                       return -ENOMEM;
+
+               si->name = xattr_array->name;
+               si->value_len = xattr_array->value_len;
+               return 0;
+       }
+
        for (xattr = xattr_array; xattr->name != NULL; xattr++) {
                err = ocfs2_xattr_set(inode, OCFS2_XATTR_INDEX_SECURITY,
                                      xattr->name, xattr->value,
@@ -7273,13 +7285,23 @@ int ocfs2_init_security_get(struct inode *inode,
                            const struct qstr *qstr,
                            struct ocfs2_security_xattr_info *si)
 {
+       int ret;
+
        /* check whether ocfs2 support feature xattr */
        if (!ocfs2_supports_xattr(OCFS2_SB(dir->i_sb)))
                return -EOPNOTSUPP;
-       if (si)
-               return security_old_inode_init_security(inode, dir, qstr,
-                                                       &si->name, &si->value,
-                                                       &si->value_len);
+       if (si) {
+               ret = security_inode_init_security(inode, dir, qstr,
+                                                  &ocfs2_initxattrs, si);
+               /*
+                * security_inode_init_security() does not return -EOPNOTSUPP,
+                * we have to check the xattr ourselves.
+                */
+               if (!ret && !si->name)
+                       si->enable = 0;
+
+               return ret;
+       }
 
        return security_inode_init_security(inode, dir, qstr,
                                            &ocfs2_initxattrs, NULL);