[PATCH 1/2] erofs-utils: lib: fix erofs_io_sendfile() again
Gao Xiang
hsiangkao at linux.alibaba.com
Fri Oct 17 22:20:01 AEDT 2025
The number of bytes written should be returned.
Fixes: 29466e7f1cbf ("erofs-utils: lib: fix erofs_io_sendfile()")
Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
lib/io.c | 13 +++++++------
mount/main.c | 12 ++++++------
2 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/lib/io.c b/lib/io.c
index 440f69b..90d2e54 100644
--- a/lib/io.c
+++ b/lib/io.c
@@ -581,6 +581,7 @@ ssize_t erofs_io_sendfile(struct erofs_vfile *vout, struct erofs_vfile *vin,
off_t *pos, size_t count)
{
ssize_t read, written;
+ size_t rem = count;
if (vin->ops || vout->ops) {
if (vin->ops && vin->ops->sendfile)
@@ -600,13 +601,13 @@ ssize_t erofs_io_sendfile(struct erofs_vfile *vout, struct erofs_vfile *vin,
}
break;
}
- count -= written;
+ rem -= written;
} while (written);
#endif
- while (count) {
+ while (rem) {
char buf[max(EROFS_MAX_BLOCK_SIZE, 32768)];
- read = min_t(u64, count, sizeof(buf));
+ read = min_t(u64, rem, sizeof(buf));
if (pos)
read = erofs_io_pread(vin, buf, read, *pos);
else
@@ -615,17 +616,17 @@ ssize_t erofs_io_sendfile(struct erofs_vfile *vout, struct erofs_vfile *vin,
written = read;
break;
}
- count -= read;
+ rem -= read;
if (pos)
*pos += read;
do {
written = erofs_io_write(vout, buf, read);
if (written < 0)
- break;
+ return written;
read -= written;
} while (read);
}
- return written < 0 ? written : count;
+ return written < 0 ? written : count - rem;
}
int erofs_io_xcopy(struct erofs_vfile *vout, off_t pos,
diff --git a/mount/main.c b/mount/main.c
index 53bd2b2..e25134c 100644
--- a/mount/main.c
+++ b/mount/main.c
@@ -577,7 +577,7 @@ static void *erofsmount_nbd_loopfn(void *arg)
while (1) {
struct erofs_nbd_request rq;
- ssize_t rem;
+ ssize_t written;
off_t pos;
err = erofs_nbd_get_request(ctx->sk.fd, &rq);
@@ -597,13 +597,13 @@ static void *erofsmount_nbd_loopfn(void *arg)
erofs_nbd_send_reply_header(ctx->sk.fd, rq.cookie, 0);
pos = rq.from;
do {
- rem = erofs_io_sendfile(&ctx->sk, &ctx->vd, &pos, rq.len);
- if (rem == -EINTR) {
- err = rem;
+ written = erofs_io_sendfile(&ctx->sk, &ctx->vd, &pos, rq.len);
+ if (written == -EINTR) {
+ err = written;
goto out;
}
- } while (rem < 0);
- err = __erofs_0write(ctx->sk.fd, rem);
+ } while (written < 0);
+ err = __erofs_0write(ctx->sk.fd, rq.len - written);
if (err) {
if (err > 0)
err = -EIO;
--
2.43.5
More information about the Linux-erofs
mailing list