{
        struct listxattr_iter *it =
                container_of(_it, struct listxattr_iter, it);
-       unsigned int prefix_len;
-       const char *prefix;
+       unsigned int base_index = entry->e_name_index;
+       unsigned int prefix_len, infix_len = 0;
+       const char *prefix, *infix = NULL;
 -      const struct xattr_handler *h;
+ 
+       if (entry->e_name_index & EROFS_XATTR_LONG_PREFIX) {
+               struct erofs_sb_info *sbi = EROFS_SB(_it->sb);
+               struct erofs_xattr_prefix_item *pf = sbi->xattr_prefixes +
+                       (entry->e_name_index & EROFS_XATTR_LONG_PREFIX_MASK);
+ 
+               if (pf >= sbi->xattr_prefixes + sbi->xattr_prefix_count)
+                       return 1;
+               infix = pf->prefix->infix;
+               infix_len = pf->infix_len;
+               base_index = pf->prefix->base_index;
+       }
  
-       prefix = erofs_xattr_prefix(entry->e_name_index, it->dentry);
 -      h = erofs_xattr_handler(base_index);
 -      if (!h || (h->list && !h->list(it->dentry)))
++      prefix = erofs_xattr_prefix(base_index, it->dentry);
 +      if (!prefix)
                return 1;
 -
 -      prefix = xattr_prefix(h);
        prefix_len = strlen(prefix);
  
        if (!it->buffer) {