lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 200/879] rxrpc, afs: Fix selection of abort codes
    Date
    From: David Howells <dhowells@redhat.com>

    [ 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>
    ---
    fs/afs/rxrpc.c | 8 +++++---
    net/rxrpc/call_event.c | 4 ++--
    net/rxrpc/conn_object.c | 2 +-
    3 files changed, 8 insertions(+), 6 deletions(-)

    diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c
    index 23a1a92d64bb..a5434f3e57c6 100644
    --- a/fs/afs/rxrpc.c
    +++ b/fs/afs/rxrpc.c
    @@ -537,6 +537,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;
    @@ -544,7 +546,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;
    @@ -836,7 +838,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]");
    @@ -878,7 +880,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]");
    }
    diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c
    index 22e05de5d1ca..e426f6831aab 100644
    --- a/net/rxrpc/call_event.c
    +++ b/net/rxrpc/call_event.c
    @@ -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;
    diff --git a/net/rxrpc/conn_object.c b/net/rxrpc/conn_object.c
    index b2159dbf5412..660cd9b1a465 100644
    --- a/net/rxrpc/conn_object.c
    +++ b/net/rxrpc/conn_object.c
    @@ -183,7 +183,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;
    }
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-08 00:27    [W:2.712 / U:0.416 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site