[PATCH] erofs-utils: mkfs: don't clean cached xattr items prematurely

Gao Xiang hsiangkao at linux.alibaba.com
Wed Jul 5 12:21:26 AEST 2023



On 2023/7/5 10:10, Jingbo Xu wrote:
> Extended attributes read from file are cached in a hash table when
> building shared extended attributes.  However the cached xattr items
> for inline xattrs are cleaned up from the hash table when the processing
> for shared extended attributes has finished, while later the hash table
> is reconstructed from scratch when building the inode tree (see
> erofs_mkfs_build_tree_from_path()).
> 
> Don't clean up the xattr hash table halfway until mkfs exits.  Also move
> the logic of cleaning long xattr name prefixes into erofs_cleanxattrs().
> 
> Signed-off-by: Jingbo Xu <jefflexu at linux.alibaba.com>
> ---
>   include/erofs/xattr.h |  2 +-
>   lib/xattr.c           | 30 ++++++++----------------------
>   mkfs/main.c           |  2 +-
>   3 files changed, 10 insertions(+), 24 deletions(-)
> 
> diff --git a/include/erofs/xattr.h b/include/erofs/xattr.h
> index 14fc081..b202f78 100644
> --- a/include/erofs/xattr.h
> +++ b/include/erofs/xattr.h
> @@ -75,9 +75,9 @@ static inline unsigned int xattrblock_offset(unsigned int xattr_id)
>   int erofs_prepare_xattr_ibody(struct erofs_inode *inode);
>   char *erofs_export_xattr_ibody(struct list_head *ixattrs, unsigned int size);
>   int erofs_build_shared_xattrs_from_path(const char *path);
> +void erofs_cleanxattrs(void);
>   
>   int erofs_xattr_insert_name_prefix(const char *prefix);
> -void erofs_xattr_cleanup_name_prefixes(void);
>   int erofs_xattr_write_name_prefixes(FILE *f);
>   
>   #ifdef __cplusplus
> diff --git a/lib/xattr.c b/lib/xattr.c
> index 7d7dc54..8d0079f 100644
> --- a/lib/xattr.c
> +++ b/lib/xattr.c
> @@ -547,24 +547,23 @@ fail:
>   	return ret;
>   }
>   
> -static void erofs_cleanxattrs(bool sharedxattrs)
> +void erofs_cleanxattrs(void)
>   {
>   	unsigned int i;
>   	struct xattr_item *item;
>   	struct hlist_node *tmp;
> +	struct ea_type_node *tnode, *n;
>   
>   	hash_for_each_safe(ea_hashtable, i, tmp, item, node) {
> -		if (sharedxattrs && item->shared_xattr_id >= 0)
> -			continue;

I'm not sure it's the expected behavior. Previously we will remove
all non-shared xattrs which are below xattr threshold in the shared
xattr generation process.

But now, such non-shared xattrs will be left in memory.  What
the benefits of this?  In addition, I'm not sure if we need to add
non-shared (inline) xattrs to hash table as well.

Thanks,
Gao Xiang


More information about the Linux-erofs mailing list