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

Jingbo Xu jefflexu at linux.alibaba.com
Wed Jul 5 15:39:34 AEST 2023



On 7/5/23 10:21 AM, Gao Xiang wrote:
> 
> 
> 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.

What's the purpose of removing these non-shared xattrs while leaving
shared xattrs there?

> 
> 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.

Later erofs_mkfs_build_tree_from_path() needs to reconstruct these
non-shared xattrs, which have been previously removed.

erofs_mkfs_build_tree_from_path
  erofs_mkfs_build_tree
    erofs_prepare_xattr_ibody
      read_xattrs_from_file


-- 
Thanks,
Jingbo


More information about the Linux-erofs mailing list