--- 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