]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
improve do_splice()
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 4 Jan 2024 01:30:35 +0000 (20:30 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 4 Jan 2024 01:30:44 +0000 (20:30 -0500)
cmd_fsck.c

index 81e589b465a7c4d157e772f1f60d9ba3a5e46b8c..262ac1bcde02012c64a30fa2798b2ab130dceb9d 100644 (file)
@@ -35,7 +35,7 @@ static void setnonblocking(int fd)
 
 static int do_splice(int rfd, int wfd)
 {
-       char buf[4096];
+       char buf[4096], *b = buf;
 
        int r = read(rfd, buf, sizeof(buf));
        if (r < 0 && errno == EAGAIN)
@@ -44,8 +44,13 @@ static int do_splice(int rfd, int wfd)
                return r;
        if (!r)
                return 1;
-       if (write(wfd, buf, r) != r)
-               die("write error");
+       do {
+               ssize_t w = write(wfd, b, r);
+               if (w < 0)
+                       die("%s: write error: %m", __func__);
+               r -= w;
+               b += w;
+       } while (r);
        return 0;
 }