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

Reply via email to