[PATCH] erofs-utils: lib: fix the incorrect nblocks number under chunk mode

Hongzhen Luo hongzhen at linux.alibaba.com
Wed Sep 11 18:23:21 AEST 2024


On 2024/9/11 16:20, Gao Xiang wrote:
>
>
> On 2024/9/11 16:10, Hongzhen Luo wrote:
>> Currently, in chunk mode, the number of blocks (nblocks) for the last
>> chunk written to the blocklist file is the size of the chunk, which may
>> not be consistent with the size of the original file in the last chunk.
>> This patch writes the actual number of blocks of the file in the last
>> chunk to the blocklist file.
>
> subject:
>
> erofs-utils: lib: fix incorrect nblocks in block list for chunked inodes
>
> Currently, the number of physical blocks (nblocks) for the last chunk
> written to the block list file is incorrectly recorded as the inode
> chunksize.
>
> This patch writes the actual number of physical blocks for the inode in
> the last chunk to the block list file.
>
>>
>> Signed-off-by: Hongzhen Luo <hongzhen at linux.alibaba.com>
>> ---
>>   lib/blobchunk.c | 9 +++++++--
>>   1 file changed, 7 insertions(+), 2 deletions(-)
>>
>> diff --git a/lib/blobchunk.c b/lib/blobchunk.c
>> index 33dadd5..40b731b 100644
>> --- a/lib/blobchunk.c
>> +++ b/lib/blobchunk.c
>> @@ -135,6 +135,7 @@ int erofs_blob_write_chunk_indexes(struct 
>> erofs_inode *inode,
>>   {
>>       struct erofs_inode_chunk_index idx = {0};
>>       erofs_blk_t extent_start = EROFS_NULL_ADDR;
>> +    erofs_blk_t front_blks = 0, tail_blks;
>
> Personally I think it can be improved as:
>
>     erofs_blk_t remaining_blks = BLK_ROUND_UP(inode->sbi, inode->i_size);
>
Sure, I will send the next patch soon.
>>       erofs_blk_t extent_end, chunkblks;
>>       erofs_off_t source_offset;
>>       unsigned int dst, src, unit;
>> @@ -165,6 +166,7 @@ int erofs_blob_write_chunk_indexes(struct 
>> erofs_inode *inode,
>>           if (extent_start == EROFS_NULL_ADDR ||
>>               idx.blkaddr != extent_end) {
>>               if (extent_start != EROFS_NULL_ADDR) {
>> +                front_blks += extent_end - extent_start;
>
>                 remaining_blks -= extent_end - extent_start;
>
>> tarerofs_blocklist_write(extent_start,
>>                           extent_end - extent_start,
>>                           source_offset);
>> @@ -187,9 +189,12 @@ int erofs_blob_write_chunk_indexes(struct 
>> erofs_inode *inode,
>>               memcpy(inode->chunkindexes + dst, &idx, sizeof(idx));
>>       }
>>       off = roundup(off, unit);
>
>     extent_end = min(extent_end, extent_start + remaining_blks);
>
> Thanks,
> Gao Xiang
>
Thanks,

Hongzhen

>> -    if (extent_start != EROFS_NULL_ADDR)
>> -        tarerofs_blocklist_write(extent_start, extent_end - 
>> extent_start,
>> +    if (extent_start != EROFS_NULL_ADDR) {
>> +        tail_blks = BLK_ROUND_UP(inode->sbi, inode->i_size)
>> +                - front_blks;
>> +        tarerofs_blocklist_write(extent_start, tail_blks,
>>                        source_offset);
>> +    }
>>       erofs_droid_blocklist_write_extent(inode, extent_start,
>>               extent_start == EROFS_NULL_ADDR ?
>>                       0 : extent_end - extent_start,


More information about the Linux-erofs mailing list