diff options
Diffstat (limited to 'net/tipc/bearer.c')
-rw-r--r-- | net/tipc/bearer.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index f7c29af4ab81..5fcd1c1214fd 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
@@ -46,6 +46,8 @@ static u32 media_count; | |||
46 | 46 | ||
47 | struct tipc_bearer tipc_bearers[MAX_BEARERS]; | 47 | struct tipc_bearer tipc_bearers[MAX_BEARERS]; |
48 | 48 | ||
49 | static void bearer_disable(struct tipc_bearer *b_ptr); | ||
50 | |||
49 | /** | 51 | /** |
50 | * media_name_valid - validate media name | 52 | * media_name_valid - validate media name |
51 | * | 53 | * |
@@ -518,7 +520,7 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority) | |||
518 | if (!m_ptr) { | 520 | if (!m_ptr) { |
519 | warn("Bearer <%s> rejected, media <%s> not registered\n", name, | 521 | warn("Bearer <%s> rejected, media <%s> not registered\n", name, |
520 | b_name.media_name); | 522 | b_name.media_name); |
521 | goto failed; | 523 | goto exit; |
522 | } | 524 | } |
523 | 525 | ||
524 | if (priority == TIPC_MEDIA_LINK_PRI) | 526 | if (priority == TIPC_MEDIA_LINK_PRI) |
@@ -534,14 +536,14 @@ restart: | |||
534 | } | 536 | } |
535 | if (!strcmp(name, tipc_bearers[i].name)) { | 537 | if (!strcmp(name, tipc_bearers[i].name)) { |
536 | warn("Bearer <%s> rejected, already enabled\n", name); | 538 | warn("Bearer <%s> rejected, already enabled\n", name); |
537 | goto failed; | 539 | goto exit; |
538 | } | 540 | } |
539 | if ((tipc_bearers[i].priority == priority) && | 541 | if ((tipc_bearers[i].priority == priority) && |
540 | (++with_this_prio > 2)) { | 542 | (++with_this_prio > 2)) { |
541 | if (priority-- == 0) { | 543 | if (priority-- == 0) { |
542 | warn("Bearer <%s> rejected, duplicate priority\n", | 544 | warn("Bearer <%s> rejected, duplicate priority\n", |
543 | name); | 545 | name); |
544 | goto failed; | 546 | goto exit; |
545 | } | 547 | } |
546 | warn("Bearer <%s> priority adjustment required %u->%u\n", | 548 | warn("Bearer <%s> priority adjustment required %u->%u\n", |
547 | name, priority + 1, priority); | 549 | name, priority + 1, priority); |
@@ -551,7 +553,7 @@ restart: | |||
551 | if (bearer_id >= MAX_BEARERS) { | 553 | if (bearer_id >= MAX_BEARERS) { |
552 | warn("Bearer <%s> rejected, bearer limit reached (%u)\n", | 554 | warn("Bearer <%s> rejected, bearer limit reached (%u)\n", |
553 | name, MAX_BEARERS); | 555 | name, MAX_BEARERS); |
554 | goto failed; | 556 | goto exit; |
555 | } | 557 | } |
556 | 558 | ||
557 | b_ptr = &tipc_bearers[bearer_id]; | 559 | b_ptr = &tipc_bearers[bearer_id]; |
@@ -559,7 +561,7 @@ restart: | |||
559 | res = m_ptr->enable_bearer(b_ptr); | 561 | res = m_ptr->enable_bearer(b_ptr); |
560 | if (res) { | 562 | if (res) { |
561 | warn("Bearer <%s> rejected, enable failure (%d)\n", name, -res); | 563 | warn("Bearer <%s> rejected, enable failure (%d)\n", name, -res); |
562 | goto failed; | 564 | goto exit; |
563 | } | 565 | } |
564 | 566 | ||
565 | b_ptr->identity = bearer_id; | 567 | b_ptr->identity = bearer_id; |
@@ -569,14 +571,18 @@ restart: | |||
569 | b_ptr->priority = priority; | 571 | b_ptr->priority = priority; |
570 | INIT_LIST_HEAD(&b_ptr->cong_links); | 572 | INIT_LIST_HEAD(&b_ptr->cong_links); |
571 | INIT_LIST_HEAD(&b_ptr->links); | 573 | INIT_LIST_HEAD(&b_ptr->links); |
572 | b_ptr->link_req = tipc_disc_init_link_req(b_ptr, &m_ptr->bcast_addr, | ||
573 | disc_domain); | ||
574 | spin_lock_init(&b_ptr->lock); | 574 | spin_lock_init(&b_ptr->lock); |
575 | write_unlock_bh(&tipc_net_lock); | 575 | |
576 | res = tipc_disc_create(b_ptr, &m_ptr->bcast_addr, disc_domain); | ||
577 | if (res) { | ||
578 | bearer_disable(b_ptr); | ||
579 | warn("Bearer <%s> rejected, discovery object creation failed\n", | ||
580 | name); | ||
581 | goto exit; | ||
582 | } | ||
576 | info("Enabled bearer <%s>, discovery domain %s, priority %u\n", | 583 | info("Enabled bearer <%s>, discovery domain %s, priority %u\n", |
577 | name, tipc_addr_string_fill(addr_string, disc_domain), priority); | 584 | name, tipc_addr_string_fill(addr_string, disc_domain), priority); |
578 | return 0; | 585 | exit: |
579 | failed: | ||
580 | write_unlock_bh(&tipc_net_lock); | 586 | write_unlock_bh(&tipc_net_lock); |
581 | return res; | 587 | return res; |
582 | } | 588 | } |
@@ -627,14 +633,14 @@ static void bearer_disable(struct tipc_bearer *b_ptr) | |||
627 | struct link *temp_l_ptr; | 633 | struct link *temp_l_ptr; |
628 | 634 | ||
629 | info("Disabling bearer <%s>\n", b_ptr->name); | 635 | info("Disabling bearer <%s>\n", b_ptr->name); |
630 | tipc_disc_stop_link_req(b_ptr->link_req); | ||
631 | spin_lock_bh(&b_ptr->lock); | 636 | spin_lock_bh(&b_ptr->lock); |
632 | b_ptr->link_req = NULL; | ||
633 | b_ptr->blocked = 1; | 637 | b_ptr->blocked = 1; |
634 | b_ptr->media->disable_bearer(b_ptr); | 638 | b_ptr->media->disable_bearer(b_ptr); |
635 | list_for_each_entry_safe(l_ptr, temp_l_ptr, &b_ptr->links, link_list) { | 639 | list_for_each_entry_safe(l_ptr, temp_l_ptr, &b_ptr->links, link_list) { |
636 | tipc_link_delete(l_ptr); | 640 | tipc_link_delete(l_ptr); |
637 | } | 641 | } |
642 | if (b_ptr->link_req) | ||
643 | tipc_disc_delete(b_ptr->link_req); | ||
638 | spin_unlock_bh(&b_ptr->lock); | 644 | spin_unlock_bh(&b_ptr->lock); |
639 | memset(b_ptr, 0, sizeof(struct tipc_bearer)); | 645 | memset(b_ptr, 0, sizeof(struct tipc_bearer)); |
640 | } | 646 | } |