Merge tag 'x86_cleanups_for_v6.4_rc1' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / fs / posix_acl.c
index 5a76fb3..7fa1b73 100644 (file)
@@ -957,25 +957,62 @@ set_posix_acl(struct mnt_idmap *idmap, struct dentry *dentry,
 }
 EXPORT_SYMBOL(set_posix_acl);
 
+int posix_acl_listxattr(struct inode *inode, char **buffer,
+                       ssize_t *remaining_size)
+{
+       int err;
+
+       if (!IS_POSIXACL(inode))
+               return 0;
+
+       if (inode->i_acl) {
+               err = xattr_list_one(buffer, remaining_size,
+                                    XATTR_NAME_POSIX_ACL_ACCESS);
+               if (err)
+                       return err;
+       }
+
+       if (inode->i_default_acl) {
+               err = xattr_list_one(buffer, remaining_size,
+                                    XATTR_NAME_POSIX_ACL_DEFAULT);
+               if (err)
+                       return err;
+       }
+
+       return 0;
+}
+
 static bool
 posix_acl_xattr_list(struct dentry *dentry)
 {
        return IS_POSIXACL(d_backing_inode(dentry));
 }
 
-const struct xattr_handler posix_acl_access_xattr_handler = {
+/*
+ * nop_posix_acl_access - legacy xattr handler for access POSIX ACLs
+ *
+ * This is the legacy POSIX ACL access xattr handler. It is used by some
+ * filesystems to implement their ->listxattr() inode operation. New code
+ * should never use them.
+ */
+const struct xattr_handler nop_posix_acl_access = {
        .name = XATTR_NAME_POSIX_ACL_ACCESS,
-       .flags = ACL_TYPE_ACCESS,
        .list = posix_acl_xattr_list,
 };
-EXPORT_SYMBOL_GPL(posix_acl_access_xattr_handler);
+EXPORT_SYMBOL_GPL(nop_posix_acl_access);
 
-const struct xattr_handler posix_acl_default_xattr_handler = {
+/*
+ * nop_posix_acl_default - legacy xattr handler for default POSIX ACLs
+ *
+ * This is the legacy POSIX ACL default xattr handler. It is used by some
+ * filesystems to implement their ->listxattr() inode operation. New code
+ * should never use them.
+ */
+const struct xattr_handler nop_posix_acl_default = {
        .name = XATTR_NAME_POSIX_ACL_DEFAULT,
-       .flags = ACL_TYPE_DEFAULT,
        .list = posix_acl_xattr_list,
 };
-EXPORT_SYMBOL_GPL(posix_acl_default_xattr_handler);
+EXPORT_SYMBOL_GPL(nop_posix_acl_default);
 
 int simple_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
                   struct posix_acl *acl, int type)
@@ -1094,12 +1131,10 @@ retry_deleg:
        if (error)
                goto out_inode_unlock;
 
-       if (inode->i_opflags & IOP_XATTR)
+       if (likely(!is_bad_inode(inode)))
                error = set_posix_acl(idmap, dentry, acl_type, kacl);
-       else if (unlikely(is_bad_inode(inode)))
-               error = -EIO;
        else
-               error = -EOPNOTSUPP;
+               error = -EIO;
        if (!error) {
                fsnotify_xattr(dentry);
                evm_inode_post_set_acl(dentry, acl_name, kacl);
@@ -1204,12 +1239,10 @@ retry_deleg:
        if (error)
                goto out_inode_unlock;
 
-       if (inode->i_opflags & IOP_XATTR)
+       if (likely(!is_bad_inode(inode)))
                error = set_posix_acl(idmap, dentry, acl_type, NULL);
-       else if (unlikely(is_bad_inode(inode)))
-               error = -EIO;
        else
-               error = -EOPNOTSUPP;
+               error = -EIO;
        if (!error) {
                fsnotify_xattr(dentry);
                evm_inode_post_remove_acl(idmap, dentry, acl_name);