[openib-general] [PATCH] [CM] fix CM unload after receiving a bad REQ

Sean Hefty mshefty at ichips.intel.com
Thu Mar 10 15:48:57 PST 2005


The following patch fixes the issue of unloading the CM after
receiving a bad REQ.

Signed-off-by: Sean Hefty <sean.hefty at intel.com>


Index: cm.c
===================================================================
--- cm.c	(revision 1974)
+++ cm.c	(working copy)
@@ -237,8 +237,8 @@
 {
 	av->port = port;
 	av->pkey_index = wc->pkey_index;
-	cm_set_ah_attr(&av->ah_attr, port->port_num, wc->slid, wc->sl,
-		       wc->dlid_path_bits);
+	cm_set_ah_attr(&av->ah_attr, port->port_num, cpu_to_be16(wc->slid),
+		       wc->sl, wc->dlid_path_bits);
 }
 
 static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
@@ -648,7 +648,7 @@
 		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
 		ib_send_cm_rej(cm_id, IB_CM_REJ_TIMEOUT, 
 			       &cm_id_priv->av.port->cm_dev->ca_guid,
-			       sizeof &cm_id_priv->av.port->cm_dev->ca_guid,
+			       sizeof cm_id_priv->av.port->cm_dev->ca_guid,
 			       NULL, 0);
 		break;
 	case IB_CM_ESTABLISHED:
@@ -1038,14 +1038,14 @@
 	if (cm_insert_remote_id(cm_id_priv->timewait_info)) {
 		spin_unlock_irqrestore(&cm.lock, flags);
 		ret = -EINVAL;
-		goto error2;
+		goto error1;
 	}
 	/* Check for a stale connection. */
 	if (cm_insert_remote_qpn(cm_id_priv->timewait_info)) {
 		spin_unlock_irqrestore(&cm.lock, flags);
 		/* todo: reject as stale */
 		ret = -EINVAL;
-		goto error2;
+		goto error1;
 	}
 	/* Find matching listen request. */
 	listen_cm_id_priv = cm_find_listen(req_msg->service_id);
@@ -1053,7 +1053,7 @@
 		spin_unlock_irqrestore(&cm.lock, flags);
 		/* todo: reject with no match */
 		ret = -EINVAL;
-		goto error2;
+		goto error1;
 	}
 	atomic_inc(&listen_cm_id_priv->refcount);
 	atomic_inc(&cm_id_priv->refcount);
@@ -1069,11 +1069,11 @@
 	cm_format_paths_from_req(req_msg, &work->path[0], &work->path[1]);
 	ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av);
 	if (ret)
-		goto error3;
+		goto error2;
 	if (req_msg->alt_local_lid) {
 		ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av);
 		if (ret)
-			goto error3;
+			goto error2;
 	}
 	cm_id_priv->timeout_ms = cm_convert_to_ms(
 					cm_req_get_local_resp_timeout(req_msg));
@@ -1092,11 +1092,9 @@
 	cm_process_work(cm_id_priv, work);
 	cm_deref_id(listen_cm_id_priv);
 	return 0;
-error3:
-	cm_deref_id(listen_cm_id_priv);
 error2:
-	cm_cleanup_timewait(cm_id_priv->timewait_info);
-	kfree(cm_id_priv->timewait_info);
+	atomic_dec(&cm_id_priv->refcount);
+	cm_deref_id(listen_cm_id_priv);
 error1:
 	ib_destroy_cm_id(&cm_id_priv->id);
 	return ret;
@@ -2592,7 +2590,7 @@
 }
 
 static void cm_send_handler(struct ib_mad_agent *mad_agent,
-			 struct ib_mad_send_wc *mad_send_wc)
+			    struct ib_mad_send_wc *mad_send_wc)
 {
 	struct cm_msg *msg;
 



More information about the general mailing list