]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Fix occasional rsend test crashes
authorPaul Dagnelie <pcd@delphix.com>
Wed, 20 Sep 2023 23:39:38 +0000 (16:39 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 22 Sep 2023 23:13:20 +0000 (16:13 -0700)
We have occasional crashes in the rsend tests. Debugging revealed
that this is because the send_worker thread is getting EINTR from
splice(). This happens when a non-fatal signal is received during
the syscall. We should retry the syscall, rather than exiting failure.
Tweak the loop to only break if the splice is finished or we receive
a non-EINTR error.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Ahelenia ZiemiaƄska <nabijaczleweli@nabijaczleweli.xyz>
Signed-off-by: Paul Dagnelie <pcd@delphix.com>
Closes #15273

lib/libzfs_core/libzfs_core.c

index c63a16de5ab6864940b3a9e97cf61478b87c28c6..01d803e21db054510101770a0bc67c489e8a8f67 100644 (file)
@@ -650,10 +650,12 @@ send_worker(void *arg)
        unsigned int bufsiz = max_pipe_buffer(ctx->from);
        ssize_t rd;
 
-       while ((rd = splice(ctx->from, NULL, ctx->to, NULL, bufsiz,
-           SPLICE_F_MOVE | SPLICE_F_MORE)) > 0)
-               ;
-
+       for (;;) {
+               rd = splice(ctx->from, NULL, ctx->to, NULL, bufsiz,
+                   SPLICE_F_MOVE | SPLICE_F_MORE);
+               if ((rd == -1 && errno != EINTR) || rd == 0)
+                       break;
+       }
        int err = (rd == -1) ? errno : 0;
        close(ctx->from);
        return ((void *)(uintptr_t)err);