In case of a race condition when MC group was deleted during creation
and it is detected in osm_sm_mcgrp_join() don't create new group - it
will be empty and invalid anyway, just return an error - similar to port
join/leave race condition handling.

Signed-off-by: Sasha Khapyorsky <[email protected]>
---
 opensm/opensm/osm_sm.c |   34 +++++++++-------------------------
 1 files changed, 9 insertions(+), 25 deletions(-)

diff --git a/opensm/opensm/osm_sm.c b/opensm/opensm/osm_sm.c
index efebf4a..649ff2a 100644
--- a/opensm/opensm/osm_sm.c
+++ b/opensm/opensm/osm_sm.c
@@ -535,36 +535,20 @@ osm_sm_mcgrp_join(IN osm_sm_t * const p_sm,
         * If this multicast group does not already exist, create it.
         */
        p_mgrp = osm_get_mgrp_by_mlid(p_sm->p_subn, mlid);
-       if (!p_mgrp) {
-               OSM_LOG(p_sm->p_log, OSM_LOG_VERBOSE,
-                       "Creating group, MLID 0x%X\n", cl_ntoh16(mlid));
-
-               p_mgrp = osm_mgrp_new(mlid);
-               if (p_mgrp == NULL) {
-                       CL_PLOCK_RELEASE(p_sm->p_lock);
-                       OSM_LOG(p_sm->p_log, OSM_LOG_ERROR, "ERR 2E06: "
-                               "Unable to allocate multicast group object\n");
-                       status = IB_INSUFFICIENT_MEMORY;
-                       goto Exit;
-               }
-
-               p_sm->p_subn->mgroups[cl_ntoh16(mlid) - IB_LID_MCAST_START_HO] 
= p_mgrp;
-       } else {
+       if (!p_mgrp || !osm_mgrp_is_guid(p_mgrp, port_guid)) {
                /*
-                * The group already exists.  If the port is not a
+                * The group removed or the port is not a
                 * member of the group, then fail immediately.
                 * This can happen since the spinlock is released briefly
                 * before the SA calls this function.
                 */
-               if (!osm_mgrp_is_guid(p_mgrp, port_guid)) {
-                       CL_PLOCK_RELEASE(p_sm->p_lock);
-                       OSM_LOG(p_sm->p_log, OSM_LOG_ERROR, "ERR 2E12: "
-                               "Port 0x%016" PRIx64
-                               " not in mcast group 0x%X\n",
-                               cl_ntoh64(port_guid), cl_ntoh16(mlid));
-                       status = IB_NOT_FOUND;
-                       goto Exit;
-               }
+               CL_PLOCK_RELEASE(p_sm->p_lock);
+               OSM_LOG(p_sm->p_log, OSM_LOG_ERROR, "ERR 2E12: "
+                       "MC group with mlid 0x%x doesn't exist or "
+                       "port 0x%016" PRIx64 " is not in the group.\n",
+                       cl_ntoh16(mlid), cl_ntoh64(port_guid));
+               status = IB_NOT_FOUND;
+               goto Exit;
        }
 
        /*
-- 
1.6.0.4.766.g6fc4a

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to