Otherwise we risk sleeping with the pipe locked for indeterminate lengths of time ‒ given: cat > udp.c <<^D #define _GNU_SOURCE #include <fcntl.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/udp.h> int main() { int s = socket(AF_INET, SOCK_DGRAM, 0); bind(s, &(struct sockaddr_in){ .sin_family = AF_INET, .sin_addr.s_addr = htonl(INADDR_ANY) }, sizeof(struct sockaddr_in)); for (;;) splice(s, 0, 1, 0, 128 * 1024 * 1024, 0); } ^D cc udp.c -o udp mkfifo fifo ./udp > fifo & read -r _ < fifo & sleep 0.1 echo zupa > fifo udp used to sleep in splice and the shell used to enter an uninterruptible sleep in open("fifo"); now the splice returns -EAGAIN and the whole program completes. Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@xxxxxxxxxxxxxxxxxx> --- fs/splice.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/splice.c b/fs/splice.c index d983d375ff11..9d29664f23ee 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -361,6 +361,7 @@ ssize_t copy_splice_read(struct file *in, loff_t *ppos, iov_iter_bvec(&to, ITER_DEST, bv, npages, len); init_sync_kiocb(&kiocb, in); kiocb.ki_pos = *ppos; + kiocb.ki_flags |= IOCB_NOWAIT; ret = call_read_iter(in, &kiocb, &to); if (ret > 0) { -- 2.39.2
Attachment:
signature.asc
Description: PGP signature