summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortim szeto <Tim.Szeto@Sun.COM>2009-02-19 13:08:57 -0700
committertim szeto <Tim.Szeto@Sun.COM>2009-02-19 13:08:57 -0700
commite17f3b2227c590f1d761b9ec4613cfb05982e6ab (patch)
treef06ec63b47e773122f7b03f25db9c1c6d5f5a288
parent858ec50c451301d1e3daa797384232a5a3a62585 (diff)
downloadillumos-joyent-e17f3b2227c590f1d761b9ec4613cfb05982e6ab.tar.gz
6795700 COMSTAR framework should have DTrace Probes
6804929 after "svcadm disable stmf", can still enable targets and LUs manually
-rw-r--r--usr/src/cmd/stmfadm/stmfadm.c90
-rw-r--r--usr/src/uts/common/io/comstar/lu/stmf_sbd/filedisk.c45
-rw-r--r--usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd_scsi.c8
-rw-r--r--usr/src/uts/common/io/comstar/stmf/stmf.c27
4 files changed, 126 insertions, 44 deletions
diff --git a/usr/src/cmd/stmfadm/stmfadm.c b/usr/src/cmd/stmfadm/stmfadm.c
index f169800922..7be85c5796 100644
--- a/usr/src/cmd/stmfadm/stmfadm.c
+++ b/usr/src/cmd/stmfadm/stmfadm.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -1453,6 +1453,39 @@ printSessionProps(stmfSessionList *sessionList)
}
}
+static int
+getStmfState(stmfState *state)
+{
+ int ret;
+
+ ret = stmfGetState(state);
+ switch (ret) {
+ case STMF_STATUS_SUCCESS:
+ break;
+ case STMF_ERROR_PERM:
+ (void) fprintf(stderr, "%s: %s\n", cmdName,
+ gettext("permission denied"));
+ break;
+ case STMF_ERROR_SERVICE_NOT_FOUND:
+ (void) fprintf(stderr, "%s: %s\n", cmdName,
+ gettext("STMF service not found"));
+ break;
+ case STMF_ERROR_BUSY:
+ (void) fprintf(stderr, "%s: %s\n", cmdName,
+ gettext("resource busy"));
+ break;
+ case STMF_ERROR_SERVICE_DATA_VERSION:
+ (void) fprintf(stderr, "%s: %s\n", cmdName,
+ gettext("STMF service version incorrect"));
+ break;
+ default:
+ (void) fprintf(stderr, "%s: %s\n", cmdName,
+ gettext("unknown error"));
+ break;
+ }
+ return (ret);
+}
+
/*
* listStateFunc
*
@@ -1467,35 +1500,8 @@ listStateFunc(int operandLen, char *operands[], cmdOptions_t *options,
int ret;
stmfState state;
- if ((ret = stmfGetState(&state)) != STMF_STATUS_SUCCESS) {
- switch (ret) {
- case STMF_ERROR_PERM:
- (void) fprintf(stderr, "%s: %s\n", cmdName,
- gettext("permission denied"));
- ret++;
- break;
- case STMF_ERROR_SERVICE_NOT_FOUND:
- (void) fprintf(stderr, "%s: %s\n", cmdName,
- gettext("STMF service not found"));
- ret++;
- break;
- case STMF_ERROR_BUSY:
- (void) fprintf(stderr, "%s: %s\n", cmdName,
- gettext("resource busy"));
- break;
- case STMF_ERROR_SERVICE_DATA_VERSION:
- (void) fprintf(stderr, "%s: %s\n", cmdName,
- gettext("STMF service version incorrect"));
- ret++;
- break;
- default:
- (void) fprintf(stderr, "%s: %s\n", cmdName,
- gettext("unknown error"));
- ret++;
- break;
- }
- return (1);
- }
+ if ((ret = getStmfState(&state)) != STMF_STATUS_SUCCESS)
+ return (ret);
(void) printf("%-18s: ", "Operational Status");
switch (state.operationalState) {
@@ -1898,6 +1904,18 @@ static int
onlineLuFunc(int operandLen, char *operands[], cmdOptions_t *options,
void *args)
{
+ int ret;
+ stmfState state;
+
+ ret = getStmfState(&state);
+ if (ret != STMF_STATUS_SUCCESS)
+ return (ret);
+ if (state.operationalState == STMF_SERVICE_STATE_OFFLINE ||
+ state.operationalState == STMF_SERVICE_STATE_OFFLINING) {
+ (void) fprintf(stderr, "%s: %s\n", cmdName,
+ gettext("STMF service is offline"));
+ return (1);
+ }
return (onlineOfflineLu(operands[0], ONLINE_LU));
}
@@ -1979,6 +1997,18 @@ static int
onlineTargetFunc(int operandLen, char *operands[], cmdOptions_t *options,
void *args)
{
+ int ret;
+ stmfState state;
+
+ ret = getStmfState(&state);
+ if (ret != STMF_STATUS_SUCCESS)
+ return (ret);
+ if (state.operationalState == STMF_SERVICE_STATE_OFFLINE ||
+ state.operationalState == STMF_SERVICE_STATE_OFFLINING) {
+ (void) fprintf(stderr, "%s: %s\n", cmdName,
+ gettext("STMF service is offline"));
+ return (1);
+ }
return (onlineOfflineTarget(operands[0], ONLINE_TARGET));
}
diff --git a/usr/src/uts/common/io/comstar/lu/stmf_sbd/filedisk.c b/usr/src/uts/common/io/comstar/lu/stmf_sbd/filedisk.c
index 7011a063f2..cf23131e84 100644
--- a/usr/src/uts/common/io/comstar/lu/stmf_sbd/filedisk.c
+++ b/usr/src/uts/common/io/comstar/lu/stmf_sbd/filedisk.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -54,6 +54,7 @@
#include <sys/scsi/impl/scsi_reset_notify.h>
#include <sys/byteorder.h>
#include <sys/atomic.h>
+#include <sys/sdt.h>
#include <stmf.h>
#include <lpif.h>
@@ -88,7 +89,7 @@ filedisk_data_read(struct sbd_store *sst, uint64_t offset, uint64_t size,
ssize_t resid;
if (((offset + size) > sfd->sfd_lun_size) ||
- ((sfd->sfd_flags & SFD_OPENED) == 0)) {
+ ((sfd->sfd_flags & SFD_OPENED) == 0)) {
return (STMF_FAILURE);
}
@@ -103,9 +104,18 @@ filedisk_data_read(struct sbd_store *sst, uint64_t offset, uint64_t size,
bzero(buf + store_end, size - store_end);
size = store_end;
}
+
+ DTRACE_PROBE4(backing__store__read__start, sbd_store_t *, sst,
+ uint8_t *, buf, uint64_t, size, uint64_t, offset);
+
ret = vn_rdwr(UIO_READ, sfd->sfd_vp, (caddr_t)buf, (ssize_t)size,
- (offset_t)offset, UIO_SYSSPACE, 0,
- RLIM64_INFINITY, CRED(), &resid);
+ (offset_t)offset, UIO_SYSSPACE, 0,
+ RLIM64_INFINITY, CRED(), &resid);
+
+ DTRACE_PROBE5(backing__store__read__end, sbd_store_t *, sst,
+ uint8_t *, buf, uint64_t, size, uint64_t, offset,
+ int, ret);
+
if (ret || resid) {
stmf_trace(0, "UIO_READ failed, ret %d, resid %d", ret, resid);
return (STMF_FAILURE);
@@ -123,13 +133,22 @@ filedisk_data_write(struct sbd_store *sst, uint64_t offset, uint64_t size,
ssize_t resid;
if (((offset + size) > sfd->sfd_lun_size) ||
- ((sfd->sfd_flags & SFD_OPENED) == 0)) {
+ ((sfd->sfd_flags & SFD_OPENED) == 0)) {
return (STMF_FAILURE);
}
+
+ DTRACE_PROBE4(backing__store__write__start, sbd_store_t *, sst,
+ uint8_t *, buf, uint64_t, size, uint64_t, offset);
+
ret = vn_rdwr(UIO_WRITE, sfd->sfd_vp, (caddr_t)buf,
- (ssize_t)size, (offset_t)offset, UIO_SYSSPACE, 0,
- RLIM64_INFINITY, CRED(), &resid);
+ (ssize_t)size, (offset_t)offset, UIO_SYSSPACE, 0,
+ RLIM64_INFINITY, CRED(), &resid);
+
+ DTRACE_PROBE5(backing__store__write__end, sbd_store_t *, sst,
+ uint8_t *, buf, uint64_t, size, uint64_t, offset,
+ int, ret);
+
if (ret || resid) {
stmf_trace(0, "UIO_WRITE failed, ret %d, resid %d", ret, resid);
return (STMF_FAILURE);
@@ -245,7 +264,7 @@ filedisk_register_lu(register_lu_cmd_t *rlc)
supported_size = (((uint64_t)1) << nbits) - 1;
if (file_size > supported_size) {
rlc->return_code =
- RLC_RET_SIZE_NOT_SUPPORTED_BY_FS;
+ RLC_RET_SIZE_NOT_SUPPORTED_BY_FS;
rlc->filesize_nbits = (uint32_t)nbits;
ret = SBD_FAILURE;
goto closeout;
@@ -316,7 +335,7 @@ filedisk_register_lu(register_lu_cmd_t *rlc)
bcopy(sid.sst_guid, rlc->guid, 16);
if (ret == STMF_ALREADY) {
rlc->return_code =
- RLC_RET_GUID_ALREADY_REGISTERED;
+ RLC_RET_GUID_ALREADY_REGISTERED;
} else if (ret == STMF_INVALID_ARG) {
rlc->return_code = RLC_RET_LU_NOT_INITIALIZED;
} else {
@@ -337,7 +356,7 @@ filedisk_register_lu(register_lu_cmd_t *rlc)
(void) sbd_deregister_sst(sst);
sbd_sst_free(sst);
rlc->return_code =
- RLC_RET_SIZE_NOT_SUPPORTED_BY_FS;
+ RLC_RET_SIZE_NOT_SUPPORTED_BY_FS;
rlc->filesize_nbits = (uint32_t)nbits;
ret = SBD_FAILURE;
goto closeout;
@@ -428,7 +447,7 @@ filedisk_modify_lu(sbd_store_t *sst, modify_lu_cmd_t *mlc)
supported_size = (((uint64_t)1) << nbits) - 1;
if (file_size > supported_size) {
mlc->return_code =
- RLC_RET_SIZE_NOT_SUPPORTED_BY_FS;
+ RLC_RET_SIZE_NOT_SUPPORTED_BY_FS;
mlc->filesize_nbits = (uint32_t)nbits;
ret = SBD_FAILURE;
goto closeout;
@@ -493,7 +512,7 @@ filedisk_online(sbd_store_t *sst)
sfd = (sbd_filedisk_t *)sst->sst_store_private;
ASSERT((sfd->sfd_flags & SFD_OPENED) == 0);
error = lookupname(sfd->sfd_filename, UIO_SYSSPACE, FOLLOW,
- NULLVPP, &sfd->sfd_vp);
+ NULLVPP, &sfd->sfd_vp);
if (error) {
return (SBD_FILEIO_FAILURE | error);
}
@@ -501,7 +520,7 @@ filedisk_online(sbd_store_t *sst)
flag = FREAD | FWRITE | FOFFMAX | FEXCL;
error = vn_open(sfd->sfd_filename, UIO_SYSSPACE, flag, 0,
- &sfd->sfd_vp, 0, 0);
+ &sfd->sfd_vp, 0, 0);
if (error) {
return (SBD_FILEIO_FAILURE | error);
}
diff --git a/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd_scsi.c b/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd_scsi.c
index 58ba89f031..022fa217f7 100644
--- a/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd_scsi.c
+++ b/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd_scsi.c
@@ -34,6 +34,7 @@
#include <sys/disp.h>
#include <sys/byteorder.h>
#include <sys/atomic.h>
+#include <sys/sdt.h>
#include <stmf.h>
#include <lpif.h>
@@ -885,6 +886,10 @@ sbd_remove_it_handle(sbd_lu_t *slu, sbd_it_data_t *it)
}
}
mutex_exit(&slu->sl_it_list_lock);
+
+ DTRACE_PROBE2(itl__nexus__end, stmf_lu_t *, slu->sl_lu,
+ sbd_it_data_t *, it);
+
kmem_free(it, sizeof (*it));
}
@@ -971,6 +976,9 @@ sbd_new_task(struct scsi_task *task, struct stmf_data_buf *initial_dbuf)
it->sbd_it_next = slu->sl_it_list;
slu->sl_it_list = it;
mutex_exit(&slu->sl_it_list_lock);
+
+ DTRACE_PROBE1(itl__nexus__start, scsi_task *, task);
+
if (stmf_register_itl_handle(task->task_lu, task->task_lun_no,
task->task_session, it->sbd_it_session_id, it)
!= STMF_SUCCESS) {
diff --git a/usr/src/uts/common/io/comstar/stmf/stmf.c b/usr/src/uts/common/io/comstar/stmf/stmf.c
index 0d9774d56c..83b4943bbd 100644
--- a/usr/src/uts/common/io/comstar/stmf/stmf.c
+++ b/usr/src/uts/common/io/comstar/stmf/stmf.c
@@ -2002,6 +2002,8 @@ stmf_register_scsi_session(stmf_local_port_t *lport, stmf_scsi_session_t *ss)
iss->iss_creation_time = ddi_get_time();
ss->ss_session_id = atomic_add_64_nv(&stmf_session_counter, 1);
iss->iss_flags &= ~ISS_BEING_CREATED;
+ DTRACE_PROBE2(session__online, stmf_local_port_t *, lport,
+ stmf_scsi_session_t *, ss);
return (STMF_SUCCESS);
}
@@ -2013,6 +2015,9 @@ stmf_deregister_scsi_session(stmf_local_port_t *lport, stmf_scsi_session_t *ss)
stmf_i_scsi_session_t *iss, **ppss;
int found = 0;
+ DTRACE_PROBE2(session__offline, stmf_local_port_t *, lport,
+ stmf_scsi_session_t *, ss);
+
iss = (stmf_i_scsi_session_t *)ss->ss_stmf_private;
if (ss->ss_rport_alias) {
ss->ss_rport_alias = NULL;
@@ -2748,6 +2753,7 @@ stmf_task_free(scsi_task_t *task)
stmf_i_scsi_task_t *itask = (stmf_i_scsi_task_t *)
task->task_stmf_private;
+ DTRACE_PROBE1(stmf__task__end, scsi_task_t *, task);
stmf_free_task_bufs(itask, lport);
if (itask->itask_itl_datap) {
if (atomic_add_32_nv(&itask->itask_itl_datap->itl_counter,
@@ -2902,6 +2908,8 @@ stmf_post_task(scsi_task_t *task, stmf_data_buf_t *dbuf)
stmf_status_t
stmf_xfer_data(scsi_task_t *task, stmf_data_buf_t *dbuf, uint32_t ioflags)
{
+ stmf_status_t ret;
+
stmf_i_scsi_task_t *itask =
(stmf_i_scsi_task_t *)task->task_stmf_private;
@@ -2923,7 +2931,12 @@ stmf_xfer_data(scsi_task_t *task, stmf_data_buf_t *dbuf, uint32_t ioflags)
return (STMF_SUCCESS);
}
#endif
- return (task->task_lport->lport_xfer_data(task, dbuf, ioflags));
+ DTRACE_PROBE2(scsi__xfer__start, scsi_task_t *, task,
+ stmf_data_buf_t *, dbuf);
+ ret = task->task_lport->lport_xfer_data(task, dbuf, ioflags);
+ DTRACE_PROBE2(scsi__xfer__end, scsi_task_t *, task,
+ stmf_data_buf_t *, dbuf);
+ return (ret);
}
void
@@ -3006,6 +3019,8 @@ stmf_data_xfer_done(scsi_task_t *task, stmf_data_buf_t *dbuf, uint32_t iof)
stmf_status_t
stmf_send_scsi_status(scsi_task_t *task, uint32_t ioflags)
{
+ DTRACE_PROBE1(scsi__send__status, scsi_task_t *, task);
+
stmf_i_scsi_task_t *itask =
(stmf_i_scsi_task_t *)task->task_stmf_private;
if (ioflags & STMF_IOF_LU_DONE) {
@@ -3208,6 +3223,9 @@ stmf_abort(int abort_cmd, scsi_task_t *task, stmf_status_t s, void *arg)
stmf_i_scsi_task_t *itask = NULL;
uint32_t old, new, f, rf;
+ DTRACE_PROBE2(scsi__task__abort, scsi_task_t *, task,
+ stmf_status_t, s);
+
switch (abort_cmd) {
case STMF_QUEUE_ABORT_LU:
stmf_task_lu_killall((stmf_lu_t *)arg, task, s);
@@ -3491,11 +3509,17 @@ stmf_ctl(int cmd, void *obj, void *arg)
if (ilu == NULL) {
goto stmf_ctl_lock_exit;
}
+ DTRACE_PROBE3(lu__state__change,
+ stmf_lu_t *, ilu->ilu_lu,
+ int, cmd, stmf_state_change_info_t *, ssci);
} else if (cmd & STMF_CMD_LPORT_OP) {
ilport = stmf_lookup_lport((stmf_local_port_t *)obj);
if (ilport == NULL) {
goto stmf_ctl_lock_exit;
}
+ DTRACE_PROBE3(lport__state__change,
+ stmf_local_port_t *, ilport->ilport_lport,
+ int, cmd, stmf_state_change_info_t *, ssci);
} else {
goto stmf_ctl_lock_exit;
}
@@ -4399,6 +4423,7 @@ out_itask_flag_loop:
}
}
#endif
+ DTRACE_PROBE1(scsi__task__start, scsi_task_t *, task);
lu->lu_new_task(task, dbuf);
break;
case ITASK_CMD_DATA_XFER_DONE: