mkfs.erofs may fail because copy_file_range() returns the number of bytes which could be less than the length originally requested.
Fixes: 03cbf7b8f7f7 ("erofs-utils: mkfs: support chunk-based uncompressed files") Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com> --- lib/blobchunk.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/blobchunk.c b/lib/blobchunk.c index 6c2ea0e..9e85721 100644 --- a/lib/blobchunk.c +++ b/lib/blobchunk.c @@ -480,9 +480,8 @@ int tarerofs_write_chunkes(struct erofs_inode *inode, erofs_off_t data_offset) int erofs_mkfs_dump_blobs(struct erofs_sb_info *sbi) { struct erofs_buffer_head *bh; - ssize_t length; + ssize_t length, ret; u64 pos_in, pos_out; - ssize_t ret; if (blobfile) { fflush(blobfile); @@ -532,9 +531,21 @@ int erofs_mkfs_dump_blobs(struct erofs_sb_info *sbi) pos_out += sbi->bdev.offset; if (blobfile) { pos_in = 0; - ret = erofs_copy_file_range(fileno(blobfile), &pos_in, - sbi->bdev.fd, &pos_out, datablob_size); - ret = ret < datablob_size ? -EIO : 0; + do { + length = min_t(erofs_off_t, datablob_size, SSIZE_MAX); + ret = erofs_copy_file_range(fileno(blobfile), &pos_in, + sbi->bdev.fd, &pos_out, length); + } while (ret > 0 && (datablob_size -= ret)); + + if (ret >= 0) { + if (datablob_size) { + erofs_err("failed to append the remaining %llu-byte chunk data", + datablob_size); + ret = -EIO; + } else { + ret = 0; + } + } } else { ret = erofs_io_ftruncate(&sbi->bdev, pos_out + datablob_size); } -- 2.43.5