rxrpc, afs: Fix selection of abort codes
[ Upstream commit de696c4784f0706884458893c5a6c39b3a3ff65c ] The RX_USER_ABORT code should really only be used to indicate that the user of the rxrpc service (ie. userspace) implicitly caused a call to be aborted - for instance if the AF_RXRPC socket is closed whilst the call was in progress. (The user may also explicitly abort a call and specify the abort code to use). Change some of the points of generation to use other abort codes instead: (1) Abort the call with RXGEN_SS_UNMARSHAL or RXGEN_CC_UNMARSHAL if we see ENOMEM and EFAULT during received data delivery and abort with RX_CALL_DEAD in the default case. (2) Abort with RXGEN_SS_MARSHAL if we get ENOMEM whilst trying to send a reply. (3) Abort with RX_CALL_DEAD if we stop hearing from the peer if we had heard from the peer and abort with RX_CALL_TIMEOUT if we hadn't. (4) Abort with RX_CALL_DEAD if we try to disconnect a call that's not completed successfully or been aborted. Reported-by: Jeffrey Altman <jaltman@auristor.com> Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: linux-afs@lists.infradead.org Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
4a4e2e90ec
commit
cb2ca93f8f
|
@ -572,6 +572,8 @@ static void afs_deliver_to_call(struct afs_call *call)
|
|||
case -ENODATA:
|
||||
case -EBADMSG:
|
||||
case -EMSGSIZE:
|
||||
case -ENOMEM:
|
||||
case -EFAULT:
|
||||
abort_code = RXGEN_CC_UNMARSHAL;
|
||||
if (state != AFS_CALL_CL_AWAIT_REPLY)
|
||||
abort_code = RXGEN_SS_UNMARSHAL;
|
||||
|
@ -579,7 +581,7 @@ static void afs_deliver_to_call(struct afs_call *call)
|
|||
abort_code, ret, "KUM");
|
||||
goto local_abort;
|
||||
default:
|
||||
abort_code = RX_USER_ABORT;
|
||||
abort_code = RX_CALL_DEAD;
|
||||
rxrpc_kernel_abort_call(call->net->socket, call->rxcall,
|
||||
abort_code, ret, "KER");
|
||||
goto local_abort;
|
||||
|
@ -871,7 +873,7 @@ void afs_send_empty_reply(struct afs_call *call)
|
|||
case -ENOMEM:
|
||||
_debug("oom");
|
||||
rxrpc_kernel_abort_call(net->socket, call->rxcall,
|
||||
RX_USER_ABORT, -ENOMEM, "KOO");
|
||||
RXGEN_SS_MARSHAL, -ENOMEM, "KOO");
|
||||
fallthrough;
|
||||
default:
|
||||
_leave(" [error]");
|
||||
|
@ -913,7 +915,7 @@ void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len)
|
|||
if (n == -ENOMEM) {
|
||||
_debug("oom");
|
||||
rxrpc_kernel_abort_call(net->socket, call->rxcall,
|
||||
RX_USER_ABORT, -ENOMEM, "KOO");
|
||||
RXGEN_SS_MARSHAL, -ENOMEM, "KOO");
|
||||
}
|
||||
_leave(" [error]");
|
||||
}
|
||||
|
|
|
@ -377,9 +377,9 @@ void rxrpc_process_call(struct work_struct *work)
|
|||
if (test_bit(RXRPC_CALL_RX_HEARD, &call->flags) &&
|
||||
(int)call->conn->hi_serial - (int)call->rx_serial > 0) {
|
||||
trace_rxrpc_call_reset(call);
|
||||
rxrpc_abort_call("EXP", call, 0, RX_USER_ABORT, -ECONNRESET);
|
||||
rxrpc_abort_call("EXP", call, 0, RX_CALL_DEAD, -ECONNRESET);
|
||||
} else {
|
||||
rxrpc_abort_call("EXP", call, 0, RX_USER_ABORT, -ETIME);
|
||||
rxrpc_abort_call("EXP", call, 0, RX_CALL_TIMEOUT, -ETIME);
|
||||
}
|
||||
set_bit(RXRPC_CALL_EV_ABORT, &call->events);
|
||||
goto recheck_state;
|
||||
|
|
|
@ -184,7 +184,7 @@ void __rxrpc_disconnect_call(struct rxrpc_connection *conn,
|
|||
chan->last_type = RXRPC_PACKET_TYPE_ABORT;
|
||||
break;
|
||||
default:
|
||||
chan->last_abort = RX_USER_ABORT;
|
||||
chan->last_abort = RX_CALL_DEAD;
|
||||
chan->last_type = RXRPC_PACKET_TYPE_ABORT;
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user