# HG changeset patch # User John Forte # Date 1273283736 25200 # Node ID 4a5a5c4e987abeb123a5b64b2ce99407a82cddf3 # Parent 07dcda070d15500b839926b9a69816180c395e57 6944367 stmf ALUA should support discovery commands on standby path diff -r 07dcda070d15 -r 4a5a5c4e987a usr/src/cmd/stmfproxy/stmfproxy/stmfproxy.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 @@ -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) diff -r 07dcda070d15 -r 4a5a5c4e987a usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd_scsi.c --- 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 && diff -r 07dcda070d15 -r 4a5a5c4e987a usr/src/uts/common/io/comstar/port/pppt/alua_ic_if.c --- 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); } diff -r 07dcda070d15 -r 4a5a5c4e987a usr/src/uts/common/io/comstar/port/pppt/pppt_msg.c --- 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 @@ -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; diff -r 07dcda070d15 -r 4a5a5c4e987a usr/src/uts/common/io/comstar/stmf/stmf.c --- 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