Currently, when calling erofs_diskbuf_commit() in the S3 code, the
argument passed is `resp.end - resp.pos`. This value is always zero upon
a successful GetObject operation, making erofs_diskbuf_commit() a no-op.
It should use the modified `resp.pos` in s3erofs_remote_getobject_cb()
minus its original value instead.

Fixes: 093c7e2f97a1 ("erofs-utils: mkfs: support full image generation from S3")
Signed-off-by: Yifan Zhao <[email protected]>
---
 lib/remotes/s3.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/lib/remotes/s3.c b/lib/remotes/s3.c
index 296df61..3426585 100644
--- a/lib/remotes/s3.c
+++ b/lib/remotes/s3.c
@@ -980,6 +980,7 @@ static int s3erofs_remote_getobject(struct erofs_importer 
*im,
        struct s3erofs_curl_request req = {};
        struct s3erofs_curl_getobject_resp resp;
        struct erofs_vfile vf;
+       u64 diskbuf_off;
        int ret;
 
        ret = s3erofs_prepare_url(&req, s3->endpoint, bucket, key, NULL,
@@ -1003,8 +1004,6 @@ static int s3erofs_remote_getobject(struct erofs_importer 
*im,
                resp.pos = erofs_pos(inode->sbi, inode->u.i_blkaddr);
                inode->datasource = EROFS_INODE_DATA_SOURCE_NONE;
        } else {
-               u64 off;
-
                if (!inode->i_diskbuf) {
                        inode->i_diskbuf = calloc(1, sizeof(*inode->i_diskbuf));
                        if (!inode->i_diskbuf)
@@ -1014,10 +1013,10 @@ static int s3erofs_remote_getobject(struct 
erofs_importer *im,
                }
 
                vf = (struct erofs_vfile) {.fd =
-                       erofs_diskbuf_reserve(inode->i_diskbuf, 0, &off)};
+                       erofs_diskbuf_reserve(inode->i_diskbuf, 0, 
&diskbuf_off)};
                if (vf.fd < 0)
                        return -EBADF;
-               resp.pos = off;
+               resp.pos = diskbuf_off;
                resp.vf = &vf;
                inode->datasource = EROFS_INODE_DATA_SOURCE_DISKBUF;
        }
@@ -1025,7 +1024,7 @@ static int s3erofs_remote_getobject(struct erofs_importer 
*im,
 
        ret = s3erofs_request_perform(s3, &req, &resp);
        if (resp.vf == &vf) {
-               erofs_diskbuf_commit(inode->i_diskbuf, resp.end - resp.pos);
+               erofs_diskbuf_commit(inode->i_diskbuf, resp.pos - diskbuf_off);
                if (ret) {
                        erofs_diskbuf_close(inode->i_diskbuf);
                        inode->i_diskbuf = NULL;
-- 
2.47.3


Reply via email to