diff options
Diffstat (limited to 'net/rxrpc/call_event.c')
-rw-r--r-- | net/rxrpc/call_event.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c index fc32aa5764a2..e60cf65c2232 100644 --- a/net/rxrpc/call_event.c +++ b/net/rxrpc/call_event.c | |||
@@ -460,6 +460,7 @@ static void rxrpc_insert_oos_packet(struct rxrpc_call *call, | |||
460 | ASSERTCMP(sp->call, ==, NULL); | 460 | ASSERTCMP(sp->call, ==, NULL); |
461 | sp->call = call; | 461 | sp->call = call; |
462 | rxrpc_get_call(call); | 462 | rxrpc_get_call(call); |
463 | atomic_inc(&call->skb_count); | ||
463 | 464 | ||
464 | /* insert into the buffer in sequence order */ | 465 | /* insert into the buffer in sequence order */ |
465 | spin_lock_bh(&call->lock); | 466 | spin_lock_bh(&call->lock); |
@@ -734,6 +735,7 @@ all_acked: | |||
734 | skb->mark = RXRPC_SKB_MARK_FINAL_ACK; | 735 | skb->mark = RXRPC_SKB_MARK_FINAL_ACK; |
735 | sp->call = call; | 736 | sp->call = call; |
736 | rxrpc_get_call(call); | 737 | rxrpc_get_call(call); |
738 | atomic_inc(&call->skb_count); | ||
737 | spin_lock_bh(&call->lock); | 739 | spin_lock_bh(&call->lock); |
738 | if (rxrpc_queue_rcv_skb(call, skb, true, true) < 0) | 740 | if (rxrpc_queue_rcv_skb(call, skb, true, true) < 0) |
739 | BUG(); | 741 | BUG(); |
@@ -793,6 +795,7 @@ static int rxrpc_post_message(struct rxrpc_call *call, u32 mark, u32 error, | |||
793 | sp->error = error; | 795 | sp->error = error; |
794 | sp->call = call; | 796 | sp->call = call; |
795 | rxrpc_get_call(call); | 797 | rxrpc_get_call(call); |
798 | atomic_inc(&call->skb_count); | ||
796 | 799 | ||
797 | spin_lock_bh(&call->lock); | 800 | spin_lock_bh(&call->lock); |
798 | ret = rxrpc_queue_rcv_skb(call, skb, true, fatal); | 801 | ret = rxrpc_queue_rcv_skb(call, skb, true, fatal); |
@@ -834,6 +837,9 @@ void rxrpc_process_call(struct work_struct *work) | |||
834 | return; | 837 | return; |
835 | } | 838 | } |
836 | 839 | ||
840 | if (!call->conn) | ||
841 | goto skip_msg_init; | ||
842 | |||
837 | /* there's a good chance we're going to have to send a message, so set | 843 | /* there's a good chance we're going to have to send a message, so set |
838 | * one up in advance */ | 844 | * one up in advance */ |
839 | msg.msg_name = &call->conn->params.peer->srx.transport; | 845 | msg.msg_name = &call->conn->params.peer->srx.transport; |
@@ -856,6 +862,7 @@ void rxrpc_process_call(struct work_struct *work) | |||
856 | memset(iov, 0, sizeof(iov)); | 862 | memset(iov, 0, sizeof(iov)); |
857 | iov[0].iov_base = &whdr; | 863 | iov[0].iov_base = &whdr; |
858 | iov[0].iov_len = sizeof(whdr); | 864 | iov[0].iov_len = sizeof(whdr); |
865 | skip_msg_init: | ||
859 | 866 | ||
860 | /* deal with events of a final nature */ | 867 | /* deal with events of a final nature */ |
861 | if (test_bit(RXRPC_CALL_EV_RCVD_ERROR, &call->events)) { | 868 | if (test_bit(RXRPC_CALL_EV_RCVD_ERROR, &call->events)) { |