Re: [PATCH net v9 01/14] afs: Fix lack of loop around sendmsg() to rxrpc
From: David Laight <hidden>
Date: 2026-09-07 13:06:53
Also in:
lkml, stable
On Mon, 7 Sep 2026 12:37:28 +0100 David Howells [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Fix the afs callers of sendmsg() to send data through an rxrpc socket to call again if a short send occurs. Note that this is also a prerequisite for changing the way rxrpc_send_data() works to return a short send rather than an error if some data was buffered. Fixes: 08e0e7c82eea ("[AF_RXRPC]: Make the in-kernel AFS filesystem use AF_RXRPC.") Link: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260824091645.415423-1-dhowells%40redhat.com Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Eric Dumazet <edumazet@google.com> cc: "David S. Miller" <davem@davemloft.net> cc: Jakub Kicinski <kuba@kernel.org> cc: Paolo Abeni <pabeni@redhat.com> cc: Simon Horman <horms@kernel.org> cc: linux-afs@lists.infradead.org cc: stable@vger.kernel.org --- fs/afs/rxrpc.c | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-)diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c index d82916657a3d..a80b043d36be 100644 --- a/fs/afs/rxrpc.c +++ b/fs/afs/rxrpc.c@@ -412,26 +412,32 @@ void afs_make_call(struct afs_call *call, gfp_t gfp) msg.msg_controllen = 0; msg.msg_flags = MSG_WAITALL | (call->write_iter ? MSG_MORE : 0); - ret = rxrpc_kernel_send_data(call->net->socket, rxcall, - &msg, call->request_size, - afs_notify_end_request_tx); - if (ret < 0) - goto error_do_abort; + do { + ret = rxrpc_kernel_send_data(call->net->socket, rxcall, &msg, + msg_data_left(&msg), + afs_notify_end_request_tx); + if (ret < 0) + goto error_do_abort; + } while (msg_data_left(&msg) > 0);
Is there any reason you didn't change rxrpc_kernel_send_data() instead? David
quoted hunk ↗ jump to hunk
if (call->write_iter) { msg.msg_iter = *call->write_iter; msg.msg_flags &= ~MSG_MORE; trace_afs_send_data(call, &msg); - ret = rxrpc_kernel_send_data(call->net->socket, - call->rxcall, &msg, - iov_iter_count(&msg.msg_iter), - afs_notify_end_request_tx); + do { + ret = rxrpc_kernel_send_data(call->net->socket, + call->rxcall, &msg, + msg_data_left(&msg), + afs_notify_end_request_tx); + if (ret < 0) { + trace_afs_sent_data(call, &msg, ret); + goto error_do_abort; + } + } while (msg_data_left(&msg) > 0); *call->write_iter = msg.msg_iter; - trace_afs_sent_data(call, &msg, ret); - if (ret < 0) - goto error_do_abort; + trace_afs_sent_data(call, &msg, 0); } /* Note that at this point, we may have received the reply or an abort@@ -912,8 +918,12 @@ void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len) msg.msg_controllen = 0; msg.msg_flags = 0; - n = rxrpc_kernel_send_data(net->socket, call->rxcall, &msg, len, - afs_notify_end_reply_tx); + do { + n = rxrpc_kernel_send_data(net->socket, call->rxcall, + &msg, msg_data_left(&msg), + afs_notify_end_reply_tx); + } while (n >= 0 && msg_data_left(&msg) > 0); + if (n >= 0) { /* Success */ _leave(" [replied]");