diff options
author | David Howells <dhowells@redhat.com> | 2016-08-23 15:27:24 +0100 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2016-08-23 15:27:24 +0100 |
commit | f36b5e444cf772f52782d47e99c68fef20ac5195 (patch) | |
tree | 0601bb884f49ff91e64775bf6502aea3bb1bde1b /net | |
parent | dabe5a790655c79f47d75749874ce7b4d5016de9 (diff) | |
download | linux-f36b5e444cf772f52782d47e99c68fef20ac5195.tar.gz linux-f36b5e444cf772f52782d47e99c68fef20ac5195.tar.bz2 linux-f36b5e444cf772f52782d47e99c68fef20ac5195.zip |
rxrpc: When clearing a socket, clear the call sets in the right order
When clearing a socket, we should clear the securing-in-progress list
first, then the accept queue and last the main call tree because that's the
order in which a call progresses. Not that a call should move from the
accept queue to the main tree whilst we're shutting down a socket, but it a
call could possibly move from sequreq to acceptq whilst we're clearing up.
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/rxrpc/call_object.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c index 5007e7ac889f..008188103fd6 100644 --- a/net/rxrpc/call_object.c +++ b/net/rxrpc/call_object.c @@ -564,12 +564,6 @@ void rxrpc_release_calls_on_socket(struct rxrpc_sock *rx) read_lock_bh(&rx->call_lock); - /* mark all the calls as no longer wanting incoming packets */ - for (p = rb_first(&rx->calls); p; p = rb_next(p)) { - call = rb_entry(p, struct rxrpc_call, sock_node); - rxrpc_mark_call_released(call); - } - /* kill the not-yet-accepted incoming calls */ list_for_each_entry(call, &rx->secureq, accept_link) { rxrpc_mark_call_released(call); @@ -579,6 +573,12 @@ void rxrpc_release_calls_on_socket(struct rxrpc_sock *rx) rxrpc_mark_call_released(call); } + /* mark all the calls as no longer wanting incoming packets */ + for (p = rb_first(&rx->calls); p; p = rb_next(p)) { + call = rb_entry(p, struct rxrpc_call, sock_node); + rxrpc_mark_call_released(call); + } + read_unlock_bh(&rx->call_lock); _leave(""); } |