6671900 Nevada83a iSCSI target dumping core, shared QFS iscsi Initiators are doing moderate I/O
authorts143224
Tue, 25 Mar 2008 13:21:02 -0700
changeset 6280 27d96a1601aa
parent 6279 696954f6dab2
child 6281 abaa1bb4fbe5
6671900 Nevada83a iSCSI target dumping core, shared QFS iscsi Initiators are doing moderate I/O 6674650 Nevada85 dumps core when deleting iSCSI lun
usr/src/cmd/iscsi/iscsitgtd/iscsi_ffp.c
usr/src/cmd/iscsi/iscsitgtd/t10_sam.c
usr/src/cmd/iscsi/iscsitgtd/t10_spc.c
usr/src/cmd/iscsi/iscsitgtd/t10_spc_pr.c
--- a/usr/src/cmd/iscsi/iscsitgtd/iscsi_ffp.c	Tue Mar 25 10:48:32 2008 -0700
+++ b/usr/src/cmd/iscsi/iscsitgtd/iscsi_ffp.c	Tue Mar 25 13:21:02 2008 -0700
@@ -310,9 +310,12 @@
 				 */
 				if (cmd->c_state == CmdAlloc) {
 					cmd->c_state = CmdCanceled;
-
-					t10_cmd_shoot_event(cmd->c_t10_cmd,
-					    T10_Cmd_T6);
+					if (cmd->c_t10_cmd != NULL) {
+						t10_cmd_shoot_event(
+						    cmd->c_t10_cmd,
+						    T10_Cmd_T6);
+						cmd->c_t10_cmd = NULL;
+					}
 				}
 
 			}
--- a/usr/src/cmd/iscsi/iscsitgtd/t10_sam.c	Tue Mar 25 10:48:32 2008 -0700
+++ b/usr/src/cmd/iscsi/iscsitgtd/t10_sam.c	Tue Mar 25 13:21:02 2008 -0700
@@ -341,8 +341,8 @@
 					    t->s_targ_num);
 				}
 			}
+			avl_destroy(&l->l_cmds);
 			(void) pthread_mutex_unlock(&l->l_cmd_mutex);
-			avl_destroy(&l->l_cmds);
 			free(l);
 		}
 	}
@@ -737,6 +737,7 @@
 
 	switch (op) {
 	case InventoryChange:
+		(void) pthread_mutex_lock(&t->s_mutex);
 		if ((lu = avl_first(&t->s_open_lu)) != NULL) {
 			do {
 				/*CSTYLED*/
@@ -744,40 +745,53 @@
 				    0, msg_targ_inventory_change, (void *)lu);
 			} while ((lu = AVL_NEXT(&t->s_open_lu, lu)) != NULL);
 		}
+		(void) pthread_mutex_unlock(&t->s_mutex);
 		return (True);
 
 	case ResetTarget:
+		(void) pthread_mutex_lock(&t->s_mutex);
 		if ((lu = avl_first(&t->s_open_lu)) != NULL) {
 			do {
 				/*CSTYLED*/
 				queue_message_set(lu->l_common->l_from_transports,
 				    Q_HIGH, msg_reset_lu, (void *)lu);
 			} while ((lu = AVL_NEXT(&t->s_open_lu, lu)) != NULL);
+			(void) pthread_mutex_unlock(&t->s_mutex);
 			return (True);
-		} else
+		} else {
+			(void) pthread_mutex_unlock(&t->s_mutex);
 			return (False);
+		}
 
 	case ResetLun:
 		search.l_targ_lun = opt_lun;
+		(void) pthread_mutex_lock(&t->s_mutex);
 		if ((lu = avl_find(&t->s_open_lu, (void *)&search, NULL)) !=
 		    NULL) {
 			queue_message_set(lu->l_common->l_from_transports,
 			    Q_HIGH, msg_reset_lu, (void *)lu);
+			(void) pthread_mutex_unlock(&t->s_mutex);
 			return (True);
-		} else
+		} else {
+			(void) pthread_mutex_unlock(&t->s_mutex);
 			return (False);
+		}
 		break;
 
 	case CapacityChange:
 		search.l_targ_lun = opt_lun;
+		(void) pthread_mutex_lock(&t->s_mutex);
 		if ((lu = avl_find(&t->s_open_lu, (void *)&search, NULL)) !=
 		    NULL) {
 			queue_message_set(lu->l_common->l_from_transports,
 			    Q_HIGH, msg_lu_capacity_change,
 			    (void *)(uintptr_t)opt_lun);
+			(void) pthread_mutex_unlock(&t->s_mutex);
 			return (True);
-		} else
+		} else {
+			(void) pthread_mutex_unlock(&t->s_mutex);
 			return (False);
+		}
 		break;
 
 	default:
@@ -806,6 +820,7 @@
 	if (t == NULL)
 		return;
 
+	(void) pthread_mutex_lock(&t->s_mutex);
 	itl = avl_first(&t->s_open_lu);
 	while (itl) {
 		tgt_buf_add_tag(buf, XML_ELEMENT_LUN, Tag_Start);
@@ -837,6 +852,7 @@
 		tgt_buf_add_tag(buf, XML_ELEMENT_LUN, Tag_End);
 		itl = AVL_NEXT(&t->s_open_lu, itl);
 	}
+	(void) pthread_mutex_unlock(&t->s_mutex);
 }
 
 /*
@@ -1380,6 +1396,7 @@
 	 */
 	search.l_targ_lun = lun;
 
+	(void) pthread_mutex_lock(&t->s_mutex);
 	if ((l = avl_find(&t->s_open_lu, (void *)&search, &wt)) != NULL) {
 
 		/*
@@ -1390,8 +1407,10 @@
 		 * even faster than an AVL tree and not take up to much space.
 		 */
 		cmd->c_lu = l;
+		(void) pthread_mutex_unlock(&t->s_mutex);
 		return (True);
 	}
+	(void) pthread_mutex_unlock(&t->s_mutex);
 
 	/*
 	 * First access for this I_T_L so we need to allocate space for it.
@@ -1615,7 +1634,9 @@
 	 * We wait to add the LU to the target list until now so that we don't
 	 * have to delete the node in case an error occurs.
 	 */
+	(void) pthread_mutex_lock(&t->s_mutex);
 	avl_insert(&t->s_open_lu, (void *)l, wt);
+	(void) pthread_mutex_unlock(&t->s_mutex);
 
 	(void) pthread_mutex_lock(&l->l_mutex);
 	l->l_common = common;
--- a/usr/src/cmd/iscsi/iscsitgtd/t10_spc.c	Tue Mar 25 10:48:32 2008 -0700
+++ b/usr/src/cmd/iscsi/iscsitgtd/t10_spc.c	Tue Mar 25 13:21:02 2008 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -738,8 +738,10 @@
 	 * and subtract one since the first is accounted for in
 	 * rtpg_targ_desc_t
 	 */
+	(void) pthread_mutex_lock(&lu->l_common_mutex);
 	alloc_len = ((avl_numnodes(&lu->l_all_open) - 1) *
 	    sizeof (rtpg_targ_desc_t)) + sizeof (rtpg_hdr_t);
+	(void) pthread_mutex_unlock(&lu->l_common_mutex);
 
 	/*
 	 * Make sure that we have enough room to store everything
@@ -768,7 +770,9 @@
 	r->len[2]	= hibyte(loword(i));
 	r->len[3]	= lobyte(loword(i));
 	dp		= &r->desc_list[0];
+	(void) pthread_mutex_lock(&lu->l_common_mutex);
 	dp->tpg_cnt	= avl_numnodes(&lu->l_all_open);
+	(void) pthread_mutex_unlock(&lu->l_common_mutex);
 	dp->status_code	= 0;
 	dp->access_state	= 0; /* Active/optimized */
 	dp->pref	= 1;
@@ -782,6 +786,7 @@
 	dp->tpg[1]	= lobyte(loword(i));
 
 	tp		= &dp->targ_list[0];
+	(void) pthread_mutex_lock(&lu->l_common_mutex);
 	lu_per		= avl_first(&lu->l_all_open);
 	do {
 		tp->rel_tpi[0] = hibyte(loword(lu_per->l_targ->s_tpgt));
@@ -789,6 +794,7 @@
 		lu_per = AVL_NEXT(&lu->l_all_open, lu_per);
 		tp++;
 	} while (lu_per != NULL);
+	(void) pthread_mutex_unlock(&lu->l_common_mutex);
 
 	if (trans_send_datain(cmd, (char *)r, MIN(rqst_len, alloc_len), 0,
 	    spc_free, True, (char *)r) == False) {
--- a/usr/src/cmd/iscsi/iscsitgtd/t10_spc_pr.c	Tue Mar 25 10:48:32 2008 -0700
+++ b/usr/src/cmd/iscsi/iscsitgtd/t10_spc_pr.c	Tue Mar 25 13:21:02 2008 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -891,6 +891,7 @@
 	/*
 	 * We may need register all initiators, depending on ALL_TG_TP
 	 */
+	(void) pthread_mutex_lock(&cmd->c_lu->l_common->l_common_mutex);
 	lu = avl_first(&cmd->c_lu->l_common->l_all_open);
 	do {
 		/*
@@ -981,6 +982,7 @@
 		}
 		lu = AVL_NEXT(&cmd->c_lu->l_common->l_all_open, lu);
 	} while (lu != NULL);
+	(void) pthread_mutex_unlock(&cmd->c_lu->l_common->l_common_mutex);
 
 	/*
 	 * Apply the last valid APTPL bit