[PATCH 3/6] erofs-utils: introduce on-disk format for extra xattr name prefix

Gao Xiang hsiangkao at linux.alibaba.com
Tue Apr 4 18:19:49 AEST 2023



On 2023/4/4 16:02, Jingbo Xu wrote:
> Besides the predefined xattr name prefixes, introduces extra xattr name
> prefixes, which works similarly as the predefined xattr name prefixees,
> except that they are user specified.

Besides the built-in xattr name prefixes, let's introduce user-defined
extra xattr name prefixes, which works similarly as the pre-defined xattr
name prefixees, except that they are user specified.

> 
> When matched with a user specified extra xattr name prefix, only the
> trailing part of the xattr name except the xattr name prefix will be
> stored in erofs_xattr_entry.e_name.  e_name is empty if the xattr name
> matches exactly as the extra xattr name prefix.

When a user-specified extra xattr name prefix is matched, only the
trailing part of the xattr name which already eliminates the given
prefix will be stored in `erofs_xattr_entry.e_name`.  `e_name` can be
empty if the xattr full name matches exactly as the name prefix.

> 
> All extra xattr name prefixes are stored in the packed file.  For each
> extra xattr name prefix, the on-disk format in packed file can be shown
> as (u8 prefix_len, prefix string), where the first u8 represents the
> length of the prefix string (excluding '\0'), followed by the content of
> the prefix string (including '\0').

Why we have to introduce a prefix_len here?

> 
> Two fields are introduced to the on-disk superblock, where
> ea_prefix_count represents the total number of the extra xattr name
> prefixes recorded in the packed file, and ea_prefix_off represents the
> start offset of recorded name prefixes in the packed file.
> 
> When referring to an extra xattr name prefix, the highest bit (bit 7) of
> erofs_xattr_entry.e_name_index is set, while the lower bits (bit 0-6)
> as a whole represents the index of the referred name prefix among all
> extra xattr name prefixes in the packed file.

When an extra xattr name prefix is referred, the highest bit (bit 7) of
`erofs_xattr_entry.e_name_index` is set, while the lower bits (bit 0-6)
as a whole represents the index of the referred name prefix among all
extra xattr name prefixes in the packed file.

> 
> Signed-off-by: Jingbo Xu <jefflexu at linux.alibaba.com>
> ---
>   include/erofs_fs.h | 7 ++++++-
>   1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/include/erofs_fs.h b/include/erofs_fs.h
> index 8835a76..3d8eb5f 100644
> --- a/include/erofs_fs.h
> +++ b/include/erofs_fs.h
> @@ -77,7 +77,9 @@ struct erofs_super_block {
>   	} __packed u1;
>   	__le16 extra_devices;	/* # of devices besides the primary device */
>   	__le16 devt_slotoff;	/* startoff = devt_slotoff * devt_slotsize */
> -	__u8 reserved[6];
> +	__u8 reserved;
> +	__u8 ea_prefix_count;	/* # of extra xattr name prefix */
> +	__le32 ea_prefix_off;	/* start offset of extra prefixes in packed inode */
>   	__le64 packed_nid;	/* nid of the special packed inode */
>   	__u8 reserved2[24];
>   };
> @@ -228,6 +230,9 @@ struct erofs_xattr_ibody_header {
>   #define EROFS_XATTR_INDEX_LUSTRE            5
>   #define EROFS_XATTR_INDEX_SECURITY          6
>   
> +#define EROFS_XATTR_EA_FLAG	(1 << 7)
> +#define EROFS_XATTR_EA_MASK	(EROFS_XATTR_EINDEX_FLAG - 1)

EROFS_EXTRA_XATTR_FLAG		0x80
EROFS_EXTRA_XATTR_MASK		0x7F

?

Thanks,
Gao Xiang

> +
>   /* xattr entry (for both inline & shared xattrs) */
>   struct erofs_xattr_entry {
>   	__u8   e_name_len;      /* length of name */


More information about the Linux-erofs mailing list