diff options
Diffstat (limited to 'net/tipc/bcast.c')
-rw-r--r-- | net/tipc/bcast.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index 035b350be5c6..facc216c6a92 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c | |||
@@ -520,6 +520,7 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf) | |||
520 | 520 | ||
521 | if (likely(seqno == next_in)) { | 521 | if (likely(seqno == next_in)) { |
522 | receive: | 522 | receive: |
523 | spin_lock_bh(&bc_lock); | ||
523 | bcl->stats.recv_info++; | 524 | bcl->stats.recv_info++; |
524 | node->bclink.last_in++; | 525 | node->bclink.last_in++; |
525 | bclink_set_gap(node); | 526 | bclink_set_gap(node); |
@@ -527,7 +528,9 @@ receive: | |||
527 | bclink_send_ack(node); | 528 | bclink_send_ack(node); |
528 | bcl->stats.sent_acks++; | 529 | bcl->stats.sent_acks++; |
529 | } | 530 | } |
531 | |||
530 | if (likely(msg_isdata(msg))) { | 532 | if (likely(msg_isdata(msg))) { |
533 | spin_unlock_bh(&bc_lock); | ||
531 | tipc_node_unlock(node); | 534 | tipc_node_unlock(node); |
532 | if (likely(msg_mcast(msg))) | 535 | if (likely(msg_mcast(msg))) |
533 | tipc_port_recv_mcast(buf, NULL); | 536 | tipc_port_recv_mcast(buf, NULL); |
@@ -536,6 +539,7 @@ receive: | |||
536 | } else if (msg_user(msg) == MSG_BUNDLER) { | 539 | } else if (msg_user(msg) == MSG_BUNDLER) { |
537 | bcl->stats.recv_bundles++; | 540 | bcl->stats.recv_bundles++; |
538 | bcl->stats.recv_bundled += msg_msgcnt(msg); | 541 | bcl->stats.recv_bundled += msg_msgcnt(msg); |
542 | spin_unlock_bh(&bc_lock); | ||
539 | tipc_node_unlock(node); | 543 | tipc_node_unlock(node); |
540 | tipc_link_recv_bundle(buf); | 544 | tipc_link_recv_bundle(buf); |
541 | } else if (msg_user(msg) == MSG_FRAGMENTER) { | 545 | } else if (msg_user(msg) == MSG_FRAGMENTER) { |
@@ -543,12 +547,15 @@ receive: | |||
543 | if (tipc_link_recv_fragment(&node->bclink.defragm, | 547 | if (tipc_link_recv_fragment(&node->bclink.defragm, |
544 | &buf, &msg)) | 548 | &buf, &msg)) |
545 | bcl->stats.recv_fragmented++; | 549 | bcl->stats.recv_fragmented++; |
550 | spin_unlock_bh(&bc_lock); | ||
546 | tipc_node_unlock(node); | 551 | tipc_node_unlock(node); |
547 | tipc_net_route_msg(buf); | 552 | tipc_net_route_msg(buf); |
548 | } else if (msg_user(msg) == NAME_DISTRIBUTOR) { | 553 | } else if (msg_user(msg) == NAME_DISTRIBUTOR) { |
554 | spin_unlock_bh(&bc_lock); | ||
549 | tipc_node_unlock(node); | 555 | tipc_node_unlock(node); |
550 | tipc_named_recv(buf); | 556 | tipc_named_recv(buf); |
551 | } else { | 557 | } else { |
558 | spin_unlock_bh(&bc_lock); | ||
552 | tipc_node_unlock(node); | 559 | tipc_node_unlock(node); |
553 | buf_discard(buf); | 560 | buf_discard(buf); |
554 | } | 561 | } |
@@ -601,11 +608,15 @@ receive: | |||
601 | } else | 608 | } else |
602 | deferred = 0; | 609 | deferred = 0; |
603 | 610 | ||
611 | spin_lock_bh(&bc_lock); | ||
612 | |||
604 | if (deferred) | 613 | if (deferred) |
605 | bcl->stats.deferred_recv++; | 614 | bcl->stats.deferred_recv++; |
606 | else | 615 | else |
607 | bcl->stats.duplicates++; | 616 | bcl->stats.duplicates++; |
608 | 617 | ||
618 | spin_unlock_bh(&bc_lock); | ||
619 | |||
609 | unlock: | 620 | unlock: |
610 | tipc_node_unlock(node); | 621 | tipc_node_unlock(node); |
611 | exit: | 622 | exit: |