[PATCH v2] erofs-utils: lib: fix incorrect nblocks in block list for chunked inodes

Gao Xiang hsiangkao at linux.alibaba.com
Wed Sep 11 18:41:56 AEST 2024



On 2024/9/11 16:35, Hongzhen Luo wrote:
> 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>

I guess it fixes

Fixes: 7b46f7a0160a ("erofs-utils: lib: merge consecutive chunks if possible")
Fixes: b6749839e710 ("erofs-utils: generate preallocated extents for tarerofs")

?


> ---
>   lib/blobchunk.c | 6 +++++-
>   1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/blobchunk.c b/lib/blobchunk.c
> index 33dadd5..a0f3d0e 100644
> --- a/lib/blobchunk.c
> +++ b/lib/blobchunk.c
> @@ -133,6 +133,7 @@ static int erofs_blob_hashmap_cmp(const void *a, const void *b,
>   int erofs_blob_write_chunk_indexes(struct erofs_inode *inode,
>   				   erofs_off_t off)
>   {
> +	erofs_blk_t remaining_blks = BLK_ROUND_UP(inode->sbi, inode->i_size);
>   	struct erofs_inode_chunk_index idx = {0};>   	erofs_blk_t extent_start = EROFS_NULL_ADDR;
>   	erofs_blk_t extent_end, chunkblks;
> @@ -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) {
> +				remaining_blks -= extent_end - extent_start;
>   				tarerofs_blocklist_write(extent_start,
>   						extent_end - extent_start,
>   						source_offset);
> @@ -187,9 +189,11 @@ int erofs_blob_write_chunk_indexes(struct erofs_inode *inode,
>   			memcpy(inode->chunkindexes + dst, &idx, sizeof(idx));
>   	}
>   	off = roundup(off, unit);
> -	if (extent_start != EROFS_NULL_ADDR)
> +	if (extent_start != EROFS_NULL_ADDR) {

You should move extent_end out of this block since
erofs_droid_blocklist_write_extent() is impacted too.

Thanks,
Gao Xiang


More information about the Linux-erofs mailing list