diff options
| author | tim szeto <Tim.Szeto@Sun.COM> | 2009-02-19 13:08:57 -0700 |
|---|---|---|
| committer | tim szeto <Tim.Szeto@Sun.COM> | 2009-02-19 13:08:57 -0700 |
| commit | e17f3b2227c590f1d761b9ec4613cfb05982e6ab (patch) | |
| tree | f06ec63b47e773122f7b03f25db9c1c6d5f5a288 | |
| parent | 858ec50c451301d1e3daa797384232a5a3a62585 (diff) | |
| download | illumos-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.c | 90 | ||||
| -rw-r--r-- | usr/src/uts/common/io/comstar/lu/stmf_sbd/filedisk.c | 45 | ||||
| -rw-r--r-- | usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd_scsi.c | 8 | ||||
| -rw-r--r-- | usr/src/uts/common/io/comstar/stmf/stmf.c | 27 |
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: |
