[PATCH 6/9] erofs-utils: add inode hash helper

Jingbo Xu jefflexu at linux.alibaba.com
Thu Jul 27 16:55:01 AEST 2023



On 7/27/23 2:12 PM, Gao Xiang wrote:
> 
> 
> On 2023/7/27 12:57, Jingbo Xu wrote:
>> Add erofs_insert_ihash() helper inserting inode into inode hash table,
>> and erofs_cleanup_ihash() helper cleaning up inode hash table.
>>
>> Also add prototypes of erofs_iget() and erofs_iget_by_nid() in the
>> header file.
>>
>> Signed-off-by: Jingbo Xu <jefflexu at linux.alibaba.com>
>> ---
>>   include/erofs/inode.h |  4 ++++
>>   lib/inode.c           | 22 +++++++++++++++++++---
>>   2 files changed, 23 insertions(+), 3 deletions(-)
>>
>> diff --git a/include/erofs/inode.h b/include/erofs/inode.h
>> index e8a5670..aba2a94 100644
>> --- a/include/erofs/inode.h
>> +++ b/include/erofs/inode.h
>> @@ -25,6 +25,10 @@ u32 erofs_new_encode_dev(dev_t dev);
>>   unsigned char erofs_mode_to_ftype(umode_t mode);
>>   unsigned char erofs_ftype_to_dtype(unsigned int filetype);
>>   void erofs_inode_manager_init(void);
>> +void erofs_insert_ihash(struct erofs_inode *inode, dev_t dev, ino_t
>> ino);
>> +void erofs_cleanup_ihash(void);
>> +struct erofs_inode *erofs_iget(dev_t dev, ino_t ino);
>> +struct erofs_inode *erofs_iget_by_nid(erofs_nid_t nid);
>>   unsigned int erofs_iput(struct erofs_inode *inode);
>>   erofs_nid_t erofs_lookupnid(struct erofs_inode *inode);
>>   struct erofs_dentry *erofs_d_alloc(struct erofs_inode *parent,
>> diff --git a/lib/inode.c b/lib/inode.c
>> index d54f84f..d82ea95 100644
>> --- a/lib/inode.c
>> +++ b/lib/inode.c
>> @@ -75,6 +75,24 @@ void erofs_inode_manager_init(void)
>>           init_list_head(&inode_hashtable[i]);
>>   }
>>   +void erofs_insert_ihash(struct erofs_inode *inode, dev_t dev, ino_t
>> ino)
>> +{
>> +    list_add(&inode->i_hash,
>> +         &inode_hashtable[(ino ^ dev) % NR_INODE_HASHTABLE]);
>> +}
>> +
>> +void erofs_cleanup_ihash(void)
>> +{
>> +    unsigned int i;
>> +    struct erofs_inode *inode, *n;
>> +
>> +    for (i = 0; i < NR_INODE_HASHTABLE; ++i) {
>> +        list_for_each_entry_safe(inode, n, &inode_hashtable[i], i_hash)
> 
> Why are there still inodes here? 

The inode hash table is used to detect hardlink file.  In union mode,
only ino (dev is always 0) comes to play when calculating the hash.
Thus the inode hash table is built on a per-image basis.  When we have
finished parsing one input image, erofs_cleanup_ihash() is called to
clean up the whole inode hash table, otherwise inode (with the same ino)
from next input image may conflict when hashing.

-- 
Thanks,
Jingbo


More information about the Linux-erofs mailing list