diff options
Diffstat (limited to 'net/rxrpc/call_object.c')
-rw-r--r-- | net/rxrpc/call_object.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c index 91287c9d01bb..ae057e0740f3 100644 --- a/net/rxrpc/call_object.c +++ b/net/rxrpc/call_object.c | |||
@@ -275,6 +275,7 @@ error: | |||
275 | list_del_init(&call->link); | 275 | list_del_init(&call->link); |
276 | write_unlock_bh(&rxrpc_call_lock); | 276 | write_unlock_bh(&rxrpc_call_lock); |
277 | 277 | ||
278 | set_bit(RXRPC_CALL_RELEASED, &call->flags); | ||
278 | call->state = RXRPC_CALL_DEAD; | 279 | call->state = RXRPC_CALL_DEAD; |
279 | rxrpc_put_call(call); | 280 | rxrpc_put_call(call); |
280 | _leave(" = %d", ret); | 281 | _leave(" = %d", ret); |
@@ -287,6 +288,7 @@ error: | |||
287 | */ | 288 | */ |
288 | found_user_ID_now_present: | 289 | found_user_ID_now_present: |
289 | write_unlock(&rx->call_lock); | 290 | write_unlock(&rx->call_lock); |
291 | set_bit(RXRPC_CALL_RELEASED, &call->flags); | ||
290 | call->state = RXRPC_CALL_DEAD; | 292 | call->state = RXRPC_CALL_DEAD; |
291 | rxrpc_put_call(call); | 293 | rxrpc_put_call(call); |
292 | _leave(" = -EEXIST [%p]", call); | 294 | _leave(" = -EEXIST [%p]", call); |
@@ -491,15 +493,9 @@ void rxrpc_release_call(struct rxrpc_call *call) | |||
491 | spin_lock_bh(&call->lock); | 493 | spin_lock_bh(&call->lock); |
492 | while ((skb = skb_dequeue(&call->rx_queue)) || | 494 | while ((skb = skb_dequeue(&call->rx_queue)) || |
493 | (skb = skb_dequeue(&call->rx_oos_queue))) { | 495 | (skb = skb_dequeue(&call->rx_oos_queue))) { |
494 | sp = rxrpc_skb(skb); | ||
495 | if (sp->call) { | ||
496 | ASSERTCMP(sp->call, ==, call); | ||
497 | rxrpc_put_call(call); | ||
498 | sp->call = NULL; | ||
499 | } | ||
500 | skb->destructor = NULL; | ||
501 | spin_unlock_bh(&call->lock); | 496 | spin_unlock_bh(&call->lock); |
502 | 497 | ||
498 | sp = rxrpc_skb(skb); | ||
503 | _debug("- zap %s %%%u #%u", | 499 | _debug("- zap %s %%%u #%u", |
504 | rxrpc_pkts[sp->hdr.type], | 500 | rxrpc_pkts[sp->hdr.type], |
505 | sp->hdr.serial, sp->hdr.seq); | 501 | sp->hdr.serial, sp->hdr.seq); |
@@ -605,6 +601,7 @@ void __rxrpc_put_call(struct rxrpc_call *call) | |||
605 | 601 | ||
606 | if (atomic_dec_and_test(&call->usage)) { | 602 | if (atomic_dec_and_test(&call->usage)) { |
607 | _debug("call %d dead", call->debug_id); | 603 | _debug("call %d dead", call->debug_id); |
604 | WARN_ON(atomic_read(&call->skb_count) != 0); | ||
608 | ASSERTCMP(call->state, ==, RXRPC_CALL_DEAD); | 605 | ASSERTCMP(call->state, ==, RXRPC_CALL_DEAD); |
609 | rxrpc_queue_work(&call->destroyer); | 606 | rxrpc_queue_work(&call->destroyer); |
610 | } | 607 | } |