6944367 stmf ALUA should support discovery commands on standby path
authorJohn Forte <John.Forte@Sun.COM>
Fri, 07 May 2010 18:55:36 -0700
changeset 12340 4a5a5c4e987a
parent 12339 07dcda070d15
child 12341 24484f9a5652
6944367 stmf ALUA should support discovery commands on standby path
usr/src/cmd/stmfproxy/stmfproxy/stmfproxy.c
usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd_scsi.c
usr/src/uts/common/io/comstar/port/pppt/alua_ic_if.c
usr/src/uts/common/io/comstar/port/pppt/pppt_msg.c
usr/src/uts/common/io/comstar/stmf/stmf.c
--- a/usr/src/cmd/stmfproxy/stmfproxy/stmfproxy.c	Fri May 07 11:42:37 2010 -0700
+++ b/usr/src/cmd/stmfproxy/stmfproxy/stmfproxy.c	Fri May 07 18:55:36 2010 -0700
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 #include <stdio.h>
@@ -74,6 +73,7 @@
 int fore_ground = 0;
 int proxy_hdl;
 pt_ops_t *pt_ops;
+pthread_mutex_t send_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 /*
  * killHandler
@@ -144,7 +144,9 @@
 	bcopy(&buflen, buf, sizeof (buflen));
 	bcopy(aluaMsg, buf + sizeof (buflen), nelem);
 
+	(void) pthread_mutex_lock(&send_mutex);
 	ns = pt_ops->stmf_proxy_send(t_handle, buf, nelem + sizeof (buflen));
+	(void) pthread_mutex_unlock(&send_mutex);
 	if (ns != nelem + sizeof (buflen)) {
 		ret = errno;
 		if (ret == 0)
--- a/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd_scsi.c	Fri May 07 11:42:37 2010 -0700
+++ b/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd_scsi.c	Fri May 07 18:55:36 2010 -0700
@@ -2655,6 +2655,12 @@
 		    cdb0 != SCMD_PERSISTENT_RESERVE_IN &&
 		    cdb0 != SCMD_REQUEST_SENSE &&
 		    cdb0 != SCMD_READ_CAPACITY &&
+		    cdb0 != SCMD_TEST_UNIT_READY &&
+		    cdb0 != SCMD_START_STOP &&
+		    cdb0 != SCMD_READ &&
+		    cdb0 != SCMD_READ_G1 &&
+		    cdb0 != SCMD_READ_G4 &&
+		    cdb0 != SCMD_READ_G5 &&
 		    !(cdb0 == SCMD_SVC_ACTION_IN_G4 &&
 		    cdb1 == SSVC_ACTION_READ_CAPACITY_G4) &&
 		    !(cdb0 == SCMD_MAINTENANCE_IN &&
--- a/usr/src/uts/common/io/comstar/port/pppt/alua_ic_if.c	Fri May 07 11:42:37 2010 -0700
+++ b/usr/src/uts/common/io/comstar/port/pppt/alua_ic_if.c	Fri May 07 18:55:36 2010 -0700
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 /*
@@ -282,7 +281,7 @@
 static scsi_devid_desc_t *stmf_ic_scsi_devid_desc_unmarshal(
     nvlist_t *nvl_devid);
 static uint8_t *stmf_ic_uint8_array_unmarshal(nvlist_t *nvl, char *field_name,
-	uint16_t len, uint8_t *buf);
+	uint64_t len, uint8_t *buf);
 static char *stmf_ic_string_unmarshal(nvlist_t *nvl, char *field_name);
 
 /*
@@ -2027,7 +2026,7 @@
 stmf_ic_uint8_array_unmarshal(
     nvlist_t *nvl,
     char *field_name,
-    uint16_t len,
+    uint64_t len,
     uint8_t *buf)	/* non-NULL: copy array into buf */
 {
 	uint8_t *array = NULL;
@@ -2042,7 +2041,7 @@
 	if (len != actual_len) {
 		cmn_err(CE_WARN,
 		    "stmf_ic_uint8_array_unmarshal: wrong len (%d != %d)",
-		    len, actual_len);
+		    (int)len, actual_len);
 		return (NULL);
 	}
 
--- a/usr/src/uts/common/io/comstar/port/pppt/pppt_msg.c	Fri May 07 11:42:37 2010 -0700
+++ b/usr/src/uts/common/io/comstar/port/pppt/pppt_msg.c	Fri May 07 18:55:36 2010 -0700
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 #include <sys/cpuvar.h>
@@ -349,7 +348,7 @@
 	 */
 	task->task_mgmt_function = scmd->icsc_task_mgmt_function;
 
-	task->task_max_nbufs = STMF_BUFS_MAX; /* Or protocol value */
+	task->task_max_nbufs = 1; /* Don't allow parallel xfers */
 	task->task_cmd_seq_no = msg->icm_msgid;
 	task->task_expected_xfer_length =
 	    scmd->icsc_task_expected_xfer_length;
--- a/usr/src/uts/common/io/comstar/stmf/stmf.c	Fri May 07 11:42:37 2010 -0700
+++ b/usr/src/uts/common/io/comstar/stmf/stmf.c	Fri May 07 18:55:36 2010 -0700
@@ -85,7 +85,7 @@
 void stmf_target_reset_poll(struct scsi_task *task);
 void stmf_handle_lun_reset(scsi_task_t *task);
 void stmf_handle_target_reset(scsi_task_t *task);
-void stmf_xd_to_dbuf(stmf_data_buf_t *dbuf);
+void stmf_xd_to_dbuf(stmf_data_buf_t *dbuf, int set_rel_off);
 int stmf_load_ppd_ioctl(stmf_ppioctl_data_t *ppi, uint64_t *ppi_token,
     uint32_t *err_ret);
 int stmf_delete_ppd_ioctl(stmf_ppioctl_data_t *ppi);
@@ -1784,7 +1784,7 @@
 	itask = (stmf_i_scsi_task_t *)task->task_stmf_private;
 	dbuf = itask->itask_proxy_dbuf;
 
-	task->task_cmd_xfer_length = msg->icsd_data_len;
+	task->task_cmd_xfer_length += msg->icsd_data_len;
 
 	if (task->task_additional_flags &
 	    TASK_AF_NO_EXPECTED_XFER_LENGTH) {
@@ -1822,7 +1822,8 @@
 		return (STMF_FAILURE);
 	}
 	dbuf->db_lu_private = xd;
-	stmf_xd_to_dbuf(dbuf);
+	dbuf->db_relative_offset = task->task_nbytes_transferred;
+	stmf_xd_to_dbuf(dbuf, 0);
 
 	dbuf->db_flags = DB_DIRECTION_TO_RPORT;
 	(void) stmf_xfer_data(task, dbuf, 0);
@@ -6163,7 +6164,7 @@
 		return;
 	}
 	dbuf->db_lu_private = xd;
-	stmf_xd_to_dbuf(dbuf);
+	stmf_xd_to_dbuf(dbuf, 1);
 
 	dbuf->db_flags = DB_DIRECTION_TO_RPORT;
 	(void) stmf_xfer_data(task, dbuf, 0);
@@ -6800,7 +6801,7 @@
  * db_lu_private NULL.
  */
 void
-stmf_xd_to_dbuf(stmf_data_buf_t *dbuf)
+stmf_xd_to_dbuf(stmf_data_buf_t *dbuf, int set_rel_off)
 {
 	stmf_xfer_data_t *xd;
 	uint8_t *p;
@@ -6809,7 +6810,8 @@
 
 	xd = (stmf_xfer_data_t *)dbuf->db_lu_private;
 	dbuf->db_data_size = 0;
-	dbuf->db_relative_offset = xd->size_done;
+	if (set_rel_off)
+		dbuf->db_relative_offset = xd->size_done;
 	for (i = 0; i < dbuf->db_sglist_length; i++) {
 		s = min(xd->size_left, dbuf->db_sglist[i].seg_length);
 		p = &xd->buf[xd->size_done];
@@ -6967,7 +6969,7 @@
 			return;
 		}
 		dbuf->db_lu_private = xd;
-		stmf_xd_to_dbuf(dbuf);
+		stmf_xd_to_dbuf(dbuf, 1);
 
 		atomic_and_32(&iss->iss_flags,
 		    ~(ISS_LUN_INVENTORY_CHANGED | ISS_GOT_INITIAL_LUNS));
@@ -6990,13 +6992,15 @@
 		    dbuf->db_xfer_status, NULL);
 		return;
 	}
-	task->task_nbytes_transferred = dbuf->db_data_size;
+	task->task_nbytes_transferred += dbuf->db_data_size;
 	if (dbuf->db_lu_private) {
 		/* There is more */
-		stmf_xd_to_dbuf(dbuf);
+		stmf_xd_to_dbuf(dbuf, 1);
 		(void) stmf_xfer_data(task, dbuf, 0);
 		return;
 	}
+
+	stmf_free_dbuf(task, dbuf);
 	/*
 	 * If this is a proxy task, it will need to be completed from the
 	 * proxy port provider. This message lets pppt know that the xfer