io_uring: call req_set_fail_links() on short send[msg]()/recv[msg]() with MSG_WAITALL

Without that it's not safe to use them in a linked combination with
others.

Now combinations like IORING_OP_SENDMSG followed by IORING_OP_SPLICE
should be possible.

We already handle short reads and writes for the following opcodes:

- IORING_OP_READV
- IORING_OP_READ_FIXED
- IORING_OP_READ
- IORING_OP_WRITEV
- IORING_OP_WRITE_FIXED
- IORING_OP_WRITE
- IORING_OP_SPLICE
- IORING_OP_TEE

Now we have it for these as well:

- IORING_OP_SENDMSG
- IORING_OP_SEND
- IORING_OP_RECVMSG
- IORING_OP_RECV

For IORING_OP_RECVMSG we also check for the MSG_TRUNC and MSG_CTRUNC
flags in order to call req_set_fail_links().

There might be applications arround depending on the behavior
that even short send[msg]()/recv[msg]() retuns continue an
IOSQE_IO_LINK chain.

It's very unlikely that such applications pass in MSG_WAITALL,
which is only defined in 'man 2 recvmsg', but not in 'man 2 sendmsg'.

It's expected that the low level sock_sendmsg() call just ignores
MSG_WAITALL, as MSG_ZEROCOPY is also ignored without explicitly set
SO_ZEROCOPY.

We also expect the caller to know about the implicit truncation to
MAX_RW_COUNT, which we don't detect.

cc: netdev@vger.kernel.org
Link: https://lore.kernel.org/r/c4e1a4cc0d905314f4d5dc567e65a7b09621aab3.1615908477.git.metze@samba.org
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by Stefan Metzmacher and committed by Jens Axboe 0031275d 00ddff43

Changed files
+20 -4
fs
+20 -4
fs/io_uring.c
··· 4386 4386 struct io_async_msghdr iomsg, *kmsg; 4387 4387 struct socket *sock; 4388 4388 unsigned flags; 4389 + int min_ret = 0; 4389 4390 int ret; 4390 4391 4391 4392 sock = sock_from_file(req->file); ··· 4407 4406 else if (issue_flags & IO_URING_F_NONBLOCK) 4408 4407 flags |= MSG_DONTWAIT; 4409 4408 4409 + if (flags & MSG_WAITALL) 4410 + min_ret = iov_iter_count(&kmsg->msg.msg_iter); 4411 + 4410 4412 ret = __sys_sendmsg_sock(sock, &kmsg->msg, flags); 4411 4413 if ((issue_flags & IO_URING_F_NONBLOCK) && ret == -EAGAIN) 4412 4414 return io_setup_async_msg(req, kmsg); ··· 4420 4416 if (kmsg->free_iov) 4421 4417 kfree(kmsg->free_iov); 4422 4418 req->flags &= ~REQ_F_NEED_CLEANUP; 4423 - if (ret < 0) 4419 + if (ret < min_ret) 4424 4420 req_set_fail_links(req); 4425 4421 __io_req_complete(req, issue_flags, ret, 0); 4426 4422 return 0; ··· 4433 4429 struct iovec iov; 4434 4430 struct socket *sock; 4435 4431 unsigned flags; 4432 + int min_ret = 0; 4436 4433 int ret; 4437 4434 4438 4435 sock = sock_from_file(req->file); ··· 4455 4450 else if (issue_flags & IO_URING_F_NONBLOCK) 4456 4451 flags |= MSG_DONTWAIT; 4457 4452 4453 + if (flags & MSG_WAITALL) 4454 + min_ret = iov_iter_count(&msg.msg_iter); 4455 + 4458 4456 msg.msg_flags = flags; 4459 4457 ret = sock_sendmsg(sock, &msg); 4460 4458 if ((issue_flags & IO_URING_F_NONBLOCK) && ret == -EAGAIN) ··· 4465 4457 if (ret == -ERESTARTSYS) 4466 4458 ret = -EINTR; 4467 4459 4468 - if (ret < 0) 4460 + if (ret < min_ret) 4469 4461 req_set_fail_links(req); 4470 4462 __io_req_complete(req, issue_flags, ret, 0); 4471 4463 return 0; ··· 4617 4609 struct socket *sock; 4618 4610 struct io_buffer *kbuf; 4619 4611 unsigned flags; 4612 + int min_ret = 0; 4620 4613 int ret, cflags = 0; 4621 4614 bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK; 4622 4615 ··· 4649 4640 else if (force_nonblock) 4650 4641 flags |= MSG_DONTWAIT; 4651 4642 4643 + if (flags & MSG_WAITALL) 4644 + min_ret = iov_iter_count(&kmsg->msg.msg_iter); 4645 + 4652 4646 ret = __sys_recvmsg_sock(sock, &kmsg->msg, req->sr_msg.umsg, 4653 4647 kmsg->uaddr, flags); 4654 4648 if (force_nonblock && ret == -EAGAIN) ··· 4665 4653 if (kmsg->free_iov) 4666 4654 kfree(kmsg->free_iov); 4667 4655 req->flags &= ~REQ_F_NEED_CLEANUP; 4668 - if (ret < 0) 4656 + if (ret < min_ret || ((flags & MSG_WAITALL) && (kmsg->msg.msg_flags & (MSG_TRUNC | MSG_CTRUNC)))) 4669 4657 req_set_fail_links(req); 4670 4658 __io_req_complete(req, issue_flags, ret, cflags); 4671 4659 return 0; ··· 4680 4668 struct socket *sock; 4681 4669 struct iovec iov; 4682 4670 unsigned flags; 4671 + int min_ret = 0; 4683 4672 int ret, cflags = 0; 4684 4673 bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK; 4685 4674 ··· 4712 4699 else if (force_nonblock) 4713 4700 flags |= MSG_DONTWAIT; 4714 4701 4702 + if (flags & MSG_WAITALL) 4703 + min_ret = iov_iter_count(&msg.msg_iter); 4704 + 4715 4705 ret = sock_recvmsg(sock, &msg, flags); 4716 4706 if (force_nonblock && ret == -EAGAIN) 4717 4707 return -EAGAIN; ··· 4723 4707 out_free: 4724 4708 if (req->flags & REQ_F_BUFFER_SELECTED) 4725 4709 cflags = io_put_recv_kbuf(req); 4726 - if (ret < 0) 4710 + if (ret < min_ret || ((flags & MSG_WAITALL) && (msg.msg_flags & (MSG_TRUNC | MSG_CTRUNC)))) 4727 4711 req_set_fail_links(req); 4728 4712 __io_req_complete(req, issue_flags, ret, cflags); 4729 4713 return 0;