rxrpc: Allow listen(sock, 0) to be used to disable listening
Allow listen() with a backlog of 0 to be used to disable listening on an AF_RXRPC socket. This also releases any preallocation, thereby making it easier for a kernel service to account for all allocated call structures when shutting down the service. The socket cannot thereafter have listening reenabled, but must rather be closed and reopened. Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
parent
56ff9c8377
commit
210f035316
|
@ -224,6 +224,14 @@ static int rxrpc_listen(struct socket *sock, int backlog)
|
|||
else
|
||||
sk->sk_max_ack_backlog = old;
|
||||
break;
|
||||
case RXRPC_SERVER_LISTENING:
|
||||
if (backlog == 0) {
|
||||
rx->sk.sk_state = RXRPC_SERVER_LISTEN_DISABLED;
|
||||
sk->sk_max_ack_backlog = 0;
|
||||
rxrpc_discard_prealloc(rx);
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ret = -EBUSY;
|
||||
break;
|
||||
|
|
|
@ -60,6 +60,7 @@ enum {
|
|||
RXRPC_CLIENT_BOUND, /* client local address bound */
|
||||
RXRPC_SERVER_BOUND, /* server local address bound */
|
||||
RXRPC_SERVER_LISTENING, /* server listening for connections */
|
||||
RXRPC_SERVER_LISTEN_DISABLED, /* server listening disabled */
|
||||
RXRPC_CLOSE, /* socket is being closed */
|
||||
};
|
||||
|
||||
|
|
|
@ -349,7 +349,8 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local,
|
|||
|
||||
found_service:
|
||||
spin_lock(&rx->incoming_lock);
|
||||
if (rx->sk.sk_state == RXRPC_CLOSE) {
|
||||
if (rx->sk.sk_state == RXRPC_SERVER_LISTEN_DISABLED ||
|
||||
rx->sk.sk_state == RXRPC_CLOSE) {
|
||||
trace_rxrpc_abort("CLS", sp->hdr.cid, sp->hdr.callNumber,
|
||||
sp->hdr.seq, RX_INVALID_OPERATION, ESHUTDOWN);
|
||||
skb->mark = RXRPC_SKB_MARK_LOCAL_ABORT;
|
||||
|
|
Loading…
Reference in a new issue