diff options
-rw-r--r-- | drivers/infiniband/core/multicast.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/infiniband/core/multicast.c b/drivers/infiniband/core/multicast.c index d2360a8ef0b2..fa17b552ff78 100644 --- a/drivers/infiniband/core/multicast.c +++ b/drivers/infiniband/core/multicast.c | |||
@@ -525,17 +525,22 @@ static void join_handler(int status, struct ib_sa_mcmember_rec *rec, | |||
525 | if (status) | 525 | if (status) |
526 | process_join_error(group, status); | 526 | process_join_error(group, status); |
527 | else { | 527 | else { |
528 | int mgids_changed, is_mgid0; | ||
528 | ib_find_pkey(group->port->dev->device, group->port->port_num, | 529 | ib_find_pkey(group->port->dev->device, group->port->port_num, |
529 | be16_to_cpu(rec->pkey), &pkey_index); | 530 | be16_to_cpu(rec->pkey), &pkey_index); |
530 | 531 | ||
531 | spin_lock_irq(&group->port->lock); | 532 | spin_lock_irq(&group->port->lock); |
532 | group->rec = *rec; | ||
533 | if (group->state == MCAST_BUSY && | 533 | if (group->state == MCAST_BUSY && |
534 | group->pkey_index == MCAST_INVALID_PKEY_INDEX) | 534 | group->pkey_index == MCAST_INVALID_PKEY_INDEX) |
535 | group->pkey_index = pkey_index; | 535 | group->pkey_index = pkey_index; |
536 | if (!memcmp(&mgid0, &group->rec.mgid, sizeof mgid0)) { | 536 | mgids_changed = memcmp(&rec->mgid, &group->rec.mgid, |
537 | sizeof(group->rec.mgid)); | ||
538 | group->rec = *rec; | ||
539 | if (mgids_changed) { | ||
537 | rb_erase(&group->node, &group->port->table); | 540 | rb_erase(&group->node, &group->port->table); |
538 | mcast_insert(group->port, group, 1); | 541 | is_mgid0 = !memcmp(&mgid0, &group->rec.mgid, |
542 | sizeof(mgid0)); | ||
543 | mcast_insert(group->port, group, is_mgid0); | ||
539 | } | 544 | } |
540 | spin_unlock_irq(&group->port->lock); | 545 | spin_unlock_irq(&group->port->lock); |
541 | } | 546 | } |