]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - fs/ext2/xattr.c
fs: simplify ->listxattr() implementation
[thirdparty/linux.git] / fs / ext2 / xattr.c
index 262951ffe8d01e81ce4c9d27e991f14dbdbe3e4a..958976f809f5a63523f75c2a9547516891cc0724 100644 (file)
@@ -121,14 +121,18 @@ const struct xattr_handler *ext2_xattr_handlers[] = {
 
 #define EA_BLOCK_CACHE(inode)  (EXT2_SB(inode->i_sb)->s_ea_block_cache)
 
-static inline const struct xattr_handler *
-ext2_xattr_handler(int name_index)
+static inline const char *ext2_xattr_prefix(int name_index,
+                                           struct dentry *dentry)
 {
        const struct xattr_handler *handler = NULL;
 
        if (name_index > 0 && name_index < ARRAY_SIZE(ext2_xattr_handler_map))
                handler = ext2_xattr_handler_map[name_index];
-       return handler;
+
+       if (!xattr_handler_can_list(handler, dentry))
+               return NULL;
+
+       return xattr_prefix(handler);
 }
 
 static bool
@@ -329,11 +333,10 @@ bad_block:
        /* list the attribute names */
        for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry);
             entry = EXT2_XATTR_NEXT(entry)) {
-               const struct xattr_handler *handler =
-                       ext2_xattr_handler(entry->e_name_index);
+               const char *prefix;
 
-               if (handler && (!handler->list || handler->list(dentry))) {
-                       const char *prefix = handler->prefix ?: handler->name;
+               prefix = ext2_xattr_prefix(entry->e_name_index, dentry);
+               if (prefix) {
                        size_t prefix_len = strlen(prefix);
                        size_t size = prefix_len + entry->e_name_len + 1;