erofs: enable long extended attribute name prefixes
authorJingbo Xu <jefflexu@linux.alibaba.com>
Fri, 7 Apr 2023 22:28:08 +0000 (06:28 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Sun, 16 Apr 2023 17:15:53 +0000 (01:15 +0800)
Let's enable long xattr name prefix feature.  Old kernels will just
ignore / skip such extended attributes.  In addition, in case you
don't want to mount such images, add another incompatible feature as
an option for this.

Signed-off-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Acked-by: Chao Yu <chao@kernel.org>
Link: https://lore.kernel.org/r/20230407222808.19670-1-jefflexu@linux.alibaba.com
[ Gao Xiang: minor commit message fix. ]
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/erofs_fs.h
fs/erofs/internal.h
fs/erofs/super.c

index 71a4b3c..4ec422c 100644 (file)
@@ -27,6 +27,7 @@
 #define EROFS_FEATURE_INCOMPAT_ZTAILPACKING    0x00000010
 #define EROFS_FEATURE_INCOMPAT_FRAGMENTS       0x00000020
 #define EROFS_FEATURE_INCOMPAT_DEDUPE          0x00000020
+#define EROFS_FEATURE_INCOMPAT_XATTR_PREFIXES  0x00000040
 #define EROFS_ALL_FEATURE_INCOMPAT             \
        (EROFS_FEATURE_INCOMPAT_ZERO_PADDING | \
         EROFS_FEATURE_INCOMPAT_COMPR_CFGS | \
@@ -36,7 +37,8 @@
         EROFS_FEATURE_INCOMPAT_COMPR_HEAD2 | \
         EROFS_FEATURE_INCOMPAT_ZTAILPACKING | \
         EROFS_FEATURE_INCOMPAT_FRAGMENTS | \
-        EROFS_FEATURE_INCOMPAT_DEDUPE)
+        EROFS_FEATURE_INCOMPAT_DEDUPE | \
+        EROFS_FEATURE_INCOMPAT_XATTR_PREFIXES)
 
 #define EROFS_SB_EXTSLOT_SIZE  16
 
index 5a9c196..f675050 100644 (file)
@@ -285,6 +285,7 @@ EROFS_FEATURE_FUNCS(compr_head2, incompat, INCOMPAT_COMPR_HEAD2)
 EROFS_FEATURE_FUNCS(ztailpacking, incompat, INCOMPAT_ZTAILPACKING)
 EROFS_FEATURE_FUNCS(fragments, incompat, INCOMPAT_FRAGMENTS)
 EROFS_FEATURE_FUNCS(dedupe, incompat, INCOMPAT_DEDUPE)
+EROFS_FEATURE_FUNCS(xattr_prefixes, incompat, INCOMPAT_XATTR_PREFIXES)
 EROFS_FEATURE_FUNCS(sb_chksum, compat, COMPAT_SB_CHKSUM)
 
 /* atomic flag definitions */
index ddfb73b..811ab66 100644 (file)
@@ -385,6 +385,8 @@ static int erofs_read_superblock(struct super_block *sb)
        sbi->meta_blkaddr = le32_to_cpu(dsb->meta_blkaddr);
 #ifdef CONFIG_EROFS_FS_XATTR
        sbi->xattr_blkaddr = le32_to_cpu(dsb->xattr_blkaddr);
+       sbi->xattr_prefix_start = le32_to_cpu(dsb->xattr_prefix_start);
+       sbi->xattr_prefix_count = dsb->xattr_prefix_count;
 #endif
        sbi->islotbits = ilog2(sizeof(struct erofs_inode_compact));
        sbi->root_nid = le16_to_cpu(dsb->root_nid);
@@ -820,6 +822,10 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
        if (err)
                return err;
 
+       err = erofs_xattr_prefixes_init(sb);
+       if (err)
+               return err;
+
        err = erofs_register_sysfs(sb);
        if (err)
                return err;
@@ -979,6 +985,7 @@ static void erofs_put_super(struct super_block *sb)
 
        erofs_unregister_sysfs(sb);
        erofs_shrinker_unregister(sb);
+       erofs_xattr_prefixes_cleanup(sb);
 #ifdef CONFIG_EROFS_FS_ZIP
        iput(sbi->managed_cache);
        sbi->managed_cache = NULL;