aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/core/multicast.c11
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 }