mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
afs: Fix afs to abort the rxrpc call on send error
Fix afs_send_empty_reply() and afs_send_simple_reply() to always try to
abort the rxrpc call rather than just aborting on -ENOMEM and otherwise
abandoning it. If the call is already complete due to network failure or a
received abort, this will do nothing.
Also make afs_make_call() always abort on send error; again, it does
nothing if the rxrpc call is already dead.
Fixes: 08e0e7c82e ("[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
Link: https://patch.msgid.link/20261006133011.531806-6-dhowells@redhat.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
af208f36ae
commit
3e6af08a57
|
|
@ -441,10 +441,8 @@ void afs_make_call(struct afs_call *call, gfp_t gfp)
|
|||
return;
|
||||
|
||||
error_do_abort:
|
||||
if (ret != -ECONNABORTED)
|
||||
rxrpc_kernel_abort_call(call->net->socket, rxcall,
|
||||
RX_USER_ABORT, ret,
|
||||
afs_abort_send_data_error);
|
||||
rxrpc_kernel_abort_call(call->net->socket, rxcall,
|
||||
RX_USER_ABORT, ret, afs_abort_send_data_error);
|
||||
if (call->async) {
|
||||
afs_see_call(call, afs_call_trace_async_abort);
|
||||
return;
|
||||
|
|
@ -857,6 +855,7 @@ void afs_send_empty_reply(struct afs_call *call)
|
|||
{
|
||||
struct afs_net *net = call->net;
|
||||
struct msghdr msg;
|
||||
int ret;
|
||||
|
||||
_enter("");
|
||||
|
||||
|
|
@ -869,21 +868,13 @@ void afs_send_empty_reply(struct afs_call *call)
|
|||
msg.msg_controllen = 0;
|
||||
msg.msg_flags = 0;
|
||||
|
||||
switch (rxrpc_kernel_send_data(net->socket, call->rxcall, &msg,
|
||||
afs_notify_end_reply_tx)) {
|
||||
case 0:
|
||||
_leave(" [replied]");
|
||||
return;
|
||||
|
||||
case -ENOMEM:
|
||||
_debug("oom");
|
||||
ret = rxrpc_kernel_send_data(net->socket, call->rxcall, &msg,
|
||||
afs_notify_end_reply_tx);
|
||||
if (ret < 0) {
|
||||
rxrpc_kernel_abort_call(net->socket, call->rxcall,
|
||||
RXGEN_SS_MARSHAL, -ENOMEM,
|
||||
afs_abort_oom);
|
||||
fallthrough;
|
||||
default:
|
||||
_leave(" [error]");
|
||||
return;
|
||||
RXGEN_SS_MARSHAL, ret,
|
||||
afs_abort_send_error);
|
||||
afs_set_call_complete(call, ret, RXGEN_SS_MARSHAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -913,12 +904,10 @@ void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len)
|
|||
ret = rxrpc_kernel_send_data(net->socket, call->rxcall, &msg,
|
||||
afs_notify_end_reply_tx);
|
||||
if (ret < 0) {
|
||||
if (ret == -ENOMEM) {
|
||||
_debug("oom");
|
||||
rxrpc_kernel_abort_call(net->socket, call->rxcall,
|
||||
RXGEN_SS_MARSHAL, -ENOMEM,
|
||||
afs_abort_oom);
|
||||
}
|
||||
rxrpc_kernel_abort_call(net->socket, call->rxcall,
|
||||
RXGEN_SS_MARSHAL, ret,
|
||||
afs_abort_send_error);
|
||||
afs_set_call_complete(call, ret, RXGEN_SS_MARSHAL);
|
||||
_leave(" [error]");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,10 +20,10 @@
|
|||
/* AFS errors */ \
|
||||
EM(afs_abort_general_error, "afs-error") \
|
||||
EM(afs_abort_interrupted, "afs-intr") \
|
||||
EM(afs_abort_oom, "afs-oom") \
|
||||
EM(afs_abort_op_not_supported, "afs-op-notsupp") \
|
||||
EM(afs_abort_probeuuid_negative, "afs-probeuuid-neg") \
|
||||
EM(afs_abort_send_data_error, "afs-send-data") \
|
||||
EM(afs_abort_send_error, "afs-send-error") \
|
||||
EM(afs_abort_unmarshal_error, "afs-unmarshal") \
|
||||
EM(afs_abort_unsupported_sec_class, "afs-unsup-sec-class") \
|
||||
/* rxperf errors */ \
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user