Remove unused target and initiator IDs.

This commit is contained in:
mav 2015-09-10 10:46:21 +00:00
parent 9701f78cf8
commit 1d4ff31d06
13 changed files with 167 additions and 285 deletions

View File

@ -569,15 +569,14 @@ ctl_isc_handler_finish_ser_only(struct ctl_softc *ctl_softc,
printf("%s: %p use after free!\n", __func__,
ctsio);
printf("%s: type %d msg %d cdb %x iptl: "
"%d:%d:%d:%d tag 0x%04x "
"%u:%u:%u tag 0x%04x "
"flag %#x status %x\n",
__func__,
tmp_io->io_hdr.io_type,
tmp_io->io_hdr.msg_type,
tmp_io->scsiio.cdb[0],
tmp_io->io_hdr.nexus.initid.id,
tmp_io->io_hdr.nexus.initid,
tmp_io->io_hdr.nexus.targ_port,
tmp_io->io_hdr.nexus.targ_target.id,
tmp_io->io_hdr.nexus.targ_lun,
(tmp_io->io_hdr.io_type ==
CTL_IO_TASK) ?
@ -665,10 +664,9 @@ ctl_isc_event_handler(ctl_ha_channel channel, ctl_ha_event event, int param)
io->io_hdr.flags |= CTL_FLAG_INT_COPY;
io->io_hdr.nexus = msg_info.hdr.nexus;
#if 0
printf("targ %d, port %d, iid %d, lun %d\n",
io->io_hdr.nexus.targ_target.id,
printf("port %u, iid %u, lun %u\n",
io->io_hdr.nexus.targ_port,
io->io_hdr.nexus.initid.id,
io->io_hdr.nexus.initid,
io->io_hdr.nexus.targ_lun);
#endif
io->scsiio.tag_num = msg_info.scsi.tag_num;
@ -3068,10 +3066,10 @@ uint32_t
ctl_get_initindex(struct ctl_nexus *nexus)
{
if (nexus->targ_port < CTL_MAX_PORTS)
return (nexus->initid.id +
return (nexus->initid +
(nexus->targ_port * CTL_MAX_INIT_PER_PORT));
else
return (nexus->initid.id +
return (nexus->initid +
((nexus->targ_port - CTL_MAX_PORTS) *
CTL_MAX_INIT_PER_PORT));
}
@ -3079,7 +3077,7 @@ ctl_get_initindex(struct ctl_nexus *nexus)
uint32_t
ctl_get_resindex(struct ctl_nexus *nexus)
{
return (nexus->initid.id + (nexus->targ_port * CTL_MAX_INIT_PER_PORT));
return (nexus->initid + (nexus->targ_port * CTL_MAX_INIT_PER_PORT));
}
uint32_t
@ -10432,8 +10430,8 @@ ctl_check_for_blockage(struct ctl_lun *lun, union ctl_io *pending_io,
&& (ooa_io->scsiio.tag_type == CTL_TAG_UNTAGGED)
&& ((pending_io->io_hdr.nexus.targ_port ==
ooa_io->io_hdr.nexus.targ_port)
&& (pending_io->io_hdr.nexus.initid.id ==
ooa_io->io_hdr.nexus.initid.id))
&& (pending_io->io_hdr.nexus.initid ==
ooa_io->io_hdr.nexus.initid))
&& ((ooa_io->io_hdr.flags & (CTL_FLAG_ABORT |
CTL_FLAG_STATUS_SENT)) == 0))
return (CTL_ACTION_OVERLAP);
@ -10454,8 +10452,8 @@ ctl_check_for_blockage(struct ctl_lun *lun, union ctl_io *pending_io,
&& (pending_io->scsiio.tag_num == ooa_io->scsiio.tag_num)
&& ((pending_io->io_hdr.nexus.targ_port ==
ooa_io->io_hdr.nexus.targ_port)
&& (pending_io->io_hdr.nexus.initid.id ==
ooa_io->io_hdr.nexus.initid.id))
&& (pending_io->io_hdr.nexus.initid ==
ooa_io->io_hdr.nexus.initid))
&& ((ooa_io->io_hdr.flags & (CTL_FLAG_ABORT |
CTL_FLAG_STATUS_SENT)) == 0))
return (CTL_ACTION_OVERLAP_TAG);
@ -11569,9 +11567,9 @@ ctl_abort_tasks_lun(struct ctl_lun *lun, uint32_t targ_port, uint32_t init_id,
if ((targ_port == UINT32_MAX ||
targ_port == xio->io_hdr.nexus.targ_port) &&
(init_id == UINT32_MAX ||
init_id == xio->io_hdr.nexus.initid.id)) {
init_id == xio->io_hdr.nexus.initid)) {
if (targ_port != xio->io_hdr.nexus.targ_port ||
init_id != xio->io_hdr.nexus.initid.id)
init_id != xio->io_hdr.nexus.initid)
xio->io_hdr.flags |= CTL_FLAG_ABORT_STATUS;
xio->io_hdr.flags |= CTL_FLAG_ABORT;
if (!other_sc && !(lun->flags & CTL_LUN_PRIMARY_SC)) {
@ -11614,7 +11612,7 @@ ctl_abort_task_set(union ctl_io *io)
mtx_unlock(&softc->ctl_lock);
if (io->taskio.task_action == CTL_TASK_ABORT_TASK_SET) {
ctl_abort_tasks_lun(lun, io->io_hdr.nexus.targ_port,
io->io_hdr.nexus.initid.id,
io->io_hdr.nexus.initid,
(io->io_hdr.flags & CTL_FLAG_FROM_OTHER_SC) != 0);
} else { /* CTL_TASK_CLEAR_TASK_SET */
ctl_abort_tasks_lun(lun, UINT32_MAX, UINT32_MAX,
@ -11637,7 +11635,7 @@ ctl_i_t_nexus_reset(union ctl_io *io)
STAILQ_FOREACH(lun, &softc->lun_list, links) {
mtx_lock(&lun->lun_lock);
ctl_abort_tasks_lun(lun, io->io_hdr.nexus.targ_port,
io->io_hdr.nexus.initid.id,
io->io_hdr.nexus.initid,
(io->io_hdr.flags & CTL_FLAG_FROM_OTHER_SC) != 0);
#ifdef CTL_WITH_CA
ctl_clear_mask(lun->have_ca, initidx);
@ -11716,7 +11714,7 @@ ctl_abort_task(union ctl_io *io)
#endif
if ((xio->io_hdr.nexus.targ_port != io->io_hdr.nexus.targ_port)
|| (xio->io_hdr.nexus.initid.id != io->io_hdr.nexus.initid.id)
|| (xio->io_hdr.nexus.initid != io->io_hdr.nexus.initid)
|| (xio->io_hdr.flags & CTL_FLAG_ABORT))
continue;
@ -11778,10 +11776,9 @@ ctl_abort_task(union ctl_io *io)
*/
#if 0
printf("ctl_abort_task: ABORT sent for nonexistent I/O: "
"%d:%d:%d:%d tag %d type %d\n",
io->io_hdr.nexus.initid.id,
"%u:%u:%u tag %d type %d\n",
io->io_hdr.nexus.initid,
io->io_hdr.nexus.targ_port,
io->io_hdr.nexus.targ_target.id,
io->io_hdr.nexus.targ_lun, io->taskio.tag_num,
io->taskio.tag_type);
#endif
@ -12208,10 +12205,9 @@ ctl_datamove(union ctl_io *io)
* the data move.
*/
if (io->io_hdr.flags & CTL_FLAG_ABORT) {
printf("ctl_datamove: tag 0x%04x on (%ju:%d:%ju:%d) aborted\n",
io->scsiio.tag_num,(uintmax_t)io->io_hdr.nexus.initid.id,
printf("ctl_datamove: tag 0x%04x on (%u:%u:%u) aborted\n",
io->scsiio.tag_num, io->io_hdr.nexus.initid,
io->io_hdr.nexus.targ_port,
(uintmax_t)io->io_hdr.nexus.targ_target.id,
io->io_hdr.nexus.targ_lun);
io->io_hdr.port_status = 31337;
/*
@ -12979,10 +12975,9 @@ ctl_datamove_remote(union ctl_io *io)
* have been done if need be on the other controller.
*/
if (io->io_hdr.flags & CTL_FLAG_ABORT) {
printf("%s: tag 0x%04x on (%d:%d:%d:%d) aborted\n", __func__,
io->scsiio.tag_num, io->io_hdr.nexus.initid.id,
printf("%s: tag 0x%04x on (%u:%u:%u) aborted\n", __func__,
io->scsiio.tag_num, io->io_hdr.nexus.initid,
io->io_hdr.nexus.targ_port,
io->io_hdr.nexus.targ_target.id,
io->io_hdr.nexus.targ_lun);
io->io_hdr.port_status = 31338;
ctl_send_datamove_done(io, /*have_lock*/ 0);
@ -13377,15 +13372,14 @@ ctl_done(union ctl_io *io)
#if 0
if (io->io_hdr.flags & CTL_FLAG_ALREADY_DONE) {
printf("%s: type %d msg %d cdb %x iptl: "
"%d:%d:%d:%d tag 0x%04x "
"%u:%u:%u tag 0x%04x "
"flag %#x status %x\n",
__func__,
io->io_hdr.io_type,
io->io_hdr.msg_type,
io->scsiio.cdb[0],
io->io_hdr.nexus.initid.id,
io->io_hdr.nexus.initid,
io->io_hdr.nexus.targ_port,
io->io_hdr.nexus.targ_target.id,
io->io_hdr.nexus.targ_lun,
(io->io_hdr.io_type ==
CTL_IO_TASK) ?
@ -13649,7 +13643,7 @@ ctl_enqueue_incoming(union ctl_io *io)
u_int idx;
idx = (io->io_hdr.nexus.targ_port * 127 +
io->io_hdr.nexus.initid.id) % worker_threads;
io->io_hdr.nexus.initid) % worker_threads;
thr = &softc->threads[idx];
mtx_lock(&thr->queue_lock);
STAILQ_INSERT_TAIL(&thr->incoming_queue, &io->io_hdr, links);

View File

@ -125,12 +125,12 @@ struct ctl_wwpn_iid {
* port_online(): This function is called, with onoff_arg as its
* argument, by the CTL layer when it wants the FETD
* to start responding to selections on the specified
* target ID. (targ_target)
* target ID.
*
* port_offline(): This function is called, with onoff_arg as its
* argument, by the CTL layer when it wants the FETD
* to stop responding to selection on the specified
* target ID. (targ_target)
* target ID.
*
* onoff_arg: This is supplied as an argument to port_online()
* and port_offline(). This is specified by the

View File

@ -546,12 +546,8 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb)
* down via the XPT_RESET_BUS/LUN CCBs below.
*/
io->io_hdr.io_type = CTL_IO_SCSI;
io->io_hdr.nexus.initid.id = 1;
io->io_hdr.nexus.initid = 1;
io->io_hdr.nexus.targ_port = softc->port.targ_port;
/*
* XXX KDM how do we handle target IDs?
*/
io->io_hdr.nexus.targ_target.id = ccb->ccb_h.target_id;
io->io_hdr.nexus.targ_lun = ccb->ccb_h.target_lun;
/*
* This tag scheme isn't the best, since we could in theory
@ -639,9 +635,8 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb)
ccb->ccb_h.io_ptr = io;
io->io_hdr.io_type = CTL_IO_TASK;
io->io_hdr.nexus.initid.id = 1;
io->io_hdr.nexus.initid = 1;
io->io_hdr.nexus.targ_port = softc->port.targ_port;
io->io_hdr.nexus.targ_target.id = ccb->ccb_h.target_id;
io->io_hdr.nexus.targ_lun = ccb->ccb_h.target_lun;
io->taskio.task_action = CTL_TASK_ABORT_TASK;
io->taskio.tag_num = abort_ccb->csio.tag_id;
@ -735,9 +730,8 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb)
ccb->ccb_h.io_ptr = io;
io->io_hdr.io_type = CTL_IO_TASK;
io->io_hdr.nexus.initid.id = 0;
io->io_hdr.nexus.initid = 1;
io->io_hdr.nexus.targ_port = softc->port.targ_port;
io->io_hdr.nexus.targ_target.id = ccb->ccb_h.target_id;
io->io_hdr.nexus.targ_lun = ccb->ccb_h.target_lun;
if (ccb->ccb_h.func_code == XPT_RESET_BUS)
io->taskio.task_action = CTL_TASK_BUS_RESET;

View File

@ -564,9 +564,8 @@ cfiscsi_pdu_handle_scsi_command(struct icl_pdu *request)
ctl_zero_io(io);
io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = request;
io->io_hdr.io_type = CTL_IO_SCSI;
io->io_hdr.nexus.initid.id = cs->cs_ctl_initid;
io->io_hdr.nexus.initid = cs->cs_ctl_initid;
io->io_hdr.nexus.targ_port = cs->cs_target->ct_port.targ_port;
io->io_hdr.nexus.targ_target.id = 0;
io->io_hdr.nexus.targ_lun = cfiscsi_decode_lun(bhssc->bhssc_lun);
io->scsiio.tag_num = bhssc->bhssc_initiator_task_tag;
switch ((bhssc->bhssc_flags & BHSSC_FLAGS_ATTR)) {
@ -621,9 +620,8 @@ cfiscsi_pdu_handle_task_request(struct icl_pdu *request)
ctl_zero_io(io);
io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = request;
io->io_hdr.io_type = CTL_IO_TASK;
io->io_hdr.nexus.initid.id = cs->cs_ctl_initid;
io->io_hdr.nexus.initid = cs->cs_ctl_initid;
io->io_hdr.nexus.targ_port = cs->cs_target->ct_port.targ_port;
io->io_hdr.nexus.targ_target.id = 0;
io->io_hdr.nexus.targ_lun = cfiscsi_decode_lun(bhstmr->bhstmr_lun);
io->taskio.tag_type = CTL_TAG_SIMPLE; /* XXX */
@ -1120,9 +1118,8 @@ cfiscsi_session_terminate_tasks(struct cfiscsi_session *cs)
ctl_zero_io(io);
io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = cs;
io->io_hdr.io_type = CTL_IO_TASK;
io->io_hdr.nexus.initid.id = cs->cs_ctl_initid;
io->io_hdr.nexus.initid = cs->cs_ctl_initid;
io->io_hdr.nexus.targ_port = cs->cs_target->ct_port.targ_port;
io->io_hdr.nexus.targ_target.id = 0;
io->io_hdr.nexus.targ_lun = 0;
io->taskio.tag_type = CTL_TAG_SIMPLE; /* XXX */
io->taskio.task_action = CTL_TASK_I_T_NEXUS_RESET;

View File

@ -183,11 +183,6 @@ struct ctl_sg_entry {
size_t len;
};
struct ctl_id {
uint32_t id;
uint64_t wwid[2];
};
typedef enum {
CTL_IO_NONE,
CTL_IO_SCSI,
@ -195,9 +190,8 @@ typedef enum {
} ctl_io_type;
struct ctl_nexus {
struct ctl_id initid; /* Initiator ID */
uint32_t initid; /* Initiator ID */
uint32_t targ_port; /* Target port, filled in by PORT */
struct ctl_id targ_target; /* Destination target */
uint32_t targ_lun; /* Destination lun */
uint32_t targ_mapped_lun; /* Destination lun CTL-wide */
};

View File

@ -86,7 +86,6 @@ typedef enum {
} ctl_ooa_status;
struct ctl_ooa_info {
uint32_t target_id; /* Passed in to CTL */
uint32_t lun_id; /* Passed in to CTL */
uint32_t num_entries; /* Returned from CTL */
ctl_ooa_status status; /* Returned from CTL */
@ -114,7 +113,6 @@ typedef enum {
} ctl_delay_status;
struct ctl_io_delay_info {
uint32_t target_id;
uint32_t lun_id;
ctl_delay_type delay_type;
ctl_delay_location delay_loc;
@ -133,7 +131,6 @@ typedef enum {
* means that we will let through every N SYNCHRONIZE CACHE commands.
*/
struct ctl_sync_info {
uint32_t target_id; /* passed to kernel */
uint32_t lun_id; /* passed to kernel */
int sync_interval; /* depends on whether get/set */
ctl_gs_sync_status status; /* passed from kernel */
@ -262,7 +259,6 @@ struct ctl_error_desc_cmd {
/*
* Error injection descriptor.
*
* target_id: Target ID to act on.
* lun_id LUN to act on.
* lun_error: The type of error to inject. See above for descriptions.
* error_pattern: What kind of command to act on. See above.
@ -273,7 +269,6 @@ struct ctl_error_desc_cmd {
* links: Kernel use only.
*/
struct ctl_error_desc {
uint32_t target_id; /* To kernel */
uint32_t lun_id; /* To kernel */
ctl_lun_error lun_error; /* To kernel */
ctl_lun_error_pattern error_pattern; /* To kernel */

View File

@ -114,7 +114,7 @@ ctl_scsi_path_string(union ctl_io *io, char *path_str, int len)
{
snprintf(path_str, len, "(%u:%u:%u/%u): ",
io->io_hdr.nexus.initid.id, io->io_hdr.nexus.targ_port,
io->io_hdr.nexus.initid, io->io_hdr.nexus.targ_port,
io->io_hdr.nexus.targ_lun, io->io_hdr.nexus.targ_mapped_lun);
}

View File

@ -328,9 +328,8 @@ tpcl_queue(union ctl_io *io, uint64_t lun)
{
struct tpcl_softc *tsoftc = &tpcl_softc;
io->io_hdr.nexus.initid.id = 0;
io->io_hdr.nexus.initid = 0;
io->io_hdr.nexus.targ_port = tsoftc->port.targ_port;
io->io_hdr.nexus.targ_target.id = 0;
io->io_hdr.nexus.targ_lun = lun;
io->scsiio.tag_num = atomic_fetchadd_int(&tsoftc->cur_tag_num, 1);
io->scsiio.ext_data_filled = 0;

View File

@ -679,7 +679,7 @@ ctl_scsi_maintenance_in(union ctl_io *io, uint8_t *data_ptr, uint32_t data_len,
#ifndef _KERNEL
union ctl_io *
ctl_scsi_alloc_io(struct ctl_id initid)
ctl_scsi_alloc_io(uint32_t initid)
{
union ctl_io *io;

View File

@ -94,7 +94,7 @@ void ctl_scsi_maintenance_in(union ctl_io *io, uint8_t *data_ptr,
uint32_t data_len, uint8_t action,
ctl_tag_type tag_type, uint8_t control);
#ifndef _KERNEL
union ctl_io *ctl_scsi_alloc_io(struct ctl_id initid);
union ctl_io *ctl_scsi_alloc_io(uint32_t initid);
void ctl_scsi_free_io(union ctl_io *io);
#endif /* !_KERNEL */
void ctl_scsi_zero_io(union ctl_io *io);

View File

@ -1164,9 +1164,8 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb)
* down the immediate notify path below.
*/
io->io_hdr.io_type = CTL_IO_SCSI;
io->io_hdr.nexus.initid.id = atio->init_id;
io->io_hdr.nexus.initid = atio->init_id;
io->io_hdr.nexus.targ_port = bus_softc->port.targ_port;
io->io_hdr.nexus.targ_target.id = atio->ccb_h.target_id;
io->io_hdr.nexus.targ_lun = atio->ccb_h.target_lun;
io->scsiio.tag_num = atio->tag_id;
switch (atio->tag_action) {
@ -1200,10 +1199,9 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb)
io->scsiio.cdb_len);
#ifdef CTLFEDEBUG
printf("%s: %ju:%d:%ju:%d: tag %04x CDB %02x\n", __func__,
(uintmax_t)io->io_hdr.nexus.initid.id,
printf("%s: %u:%u:%u: tag %04x CDB %02x\n", __func__,
io->io_hdr.nexus.initid,
io->io_hdr.nexus.targ_port,
(uintmax_t)io->io_hdr.nexus.targ_target.id,
io->io_hdr.nexus.targ_lun,
io->scsiio.tag_num, io->scsiio.cdb[0]);
#endif
@ -1440,9 +1438,8 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb)
io->io_hdr.io_type = CTL_IO_TASK;
io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr =done_ccb;
inot->ccb_h.io_ptr = io;
io->io_hdr.nexus.initid.id = inot->initiator_id;
io->io_hdr.nexus.initid = inot->initiator_id;
io->io_hdr.nexus.targ_port = bus_softc->port.targ_port;
io->io_hdr.nexus.targ_target.id = inot->ccb_h.target_id;
io->io_hdr.nexus.targ_lun = inot->ccb_h.target_lun;
/* XXX KDM should this be the tag_id? */
io->taskio.tag_num = inot->seq_id;

View File

@ -34,7 +34,7 @@
.\" $Id: //depot/users/kenm/FreeBSD-test2/usr.sbin/ctladm/ctladm.8#3 $
.\" $FreeBSD$
.\"
.Dd September 6, 2015
.Dd September 10, 2015
.Dt CTLADM 8
.Os
.Sh NAME
@ -43,28 +43,28 @@
.Sh SYNOPSIS
.Nm
.Aq Ar command
.Op target:lun
.Op lun
.Op generic args
.Op command args
.Nm
.Ic tur
.Aq target:lun
.Aq lun
.Op general options
.Nm
.Ic inquiry
.Aq target:lun
.Aq lun
.Op general options
.Nm
.Ic reqsense
.Aq target:lun
.Aq lun
.Op general options
.Nm
.Ic reportluns
.Aq target:lun
.Aq lun
.Op general options
.Nm
.Ic read
.Aq target:lun
.Aq lun
.Op general options
.Aq Fl l Ar lba
.Aq Fl d Ar datalen
@ -74,7 +74,7 @@
.Op Fl N
.Nm
.Ic write
.Aq target:lun
.Aq lun
.Op general options
.Aq Fl l Ar lba
.Aq Fl d Ar datalen
@ -84,12 +84,12 @@
.Op Fl N
.Nm
.Ic readcap
.Aq target:lun
.Aq lun
.Op general options
.Op Fl c Ar cdbsize
.Nm
.Ic modesense
.Aq target:lun
.Aq lun
.Aq Fl m Ar page | Fl l
.Op Fl P Ar pc
.Op Fl d
@ -97,19 +97,19 @@
.Op Fl c Ar size
.Nm
.Ic start
.Aq target:lun
.Aq lun
.Op general options
.Op Fl i
.Op Fl o
.Nm
.Ic stop
.Aq target:lun
.Aq lun
.Op general options
.Op Fl i
.Op Fl o
.Nm
.Ic synccache
.Aq target:lun
.Aq lun
.Op general options
.Op Fl l Ar lba
.Op Fl b Ar blockcount
@ -126,7 +126,7 @@
.Ic lunlist
.Nm
.Ic delay
.Aq target:lun
.Aq lun
.Aq Fl l Ar datamove|done
.Aq Fl t Ar secs
.Op Fl T Ar oneshot|cont
@ -134,11 +134,11 @@
.Ic realsync Aq on|off|query
.Nm
.Ic setsync interval
.Aq target:lun
.Aq lun
.Aq Fl i Ar interval
.Nm
.Ic getsync
.Aq target:lun
.Aq lun
.Nm
.Ic inject
.Aq Fl i Ar action
@ -236,8 +236,8 @@ utility has a number of primary functions, many of which require a device
identifier.
The device identifier takes the following form:
.Bl -tag -width 14n
.It target:lun
Specify the target (almost always 0) and LUN number to operate on.
.It lun
Specify the LUN number to operate on.
.El
Many of the primary functions of the
.Nm
@ -570,7 +570,7 @@ sending SYNCHRONIZE cache commands. An interval of 0 means that the cache
will be flushed for this LUN every time a SYNCHRONIZE CACHE command is
received.
.Pp
You must specify the target and LUN you want to modify.
You must specify the LUN you want to modify.
.It Ic getsync
Get the interval at which we actually service the SYNCHRONIZE CACHE
command, as set by the
@ -580,7 +580,7 @@ The reported number means that we will actually flush the cache on every
Nth SYNCHRONIZE CACHE command. A value of 0 means that we will flush the
cache every time.
.Pp
You must specify the target and LUN you want to query.
You must specify the LUN you want to query.
.It Ic inject
Inject the specified type of error for the LUN specified, when a command
that matches the given pattern is seen.
@ -1024,34 +1024,34 @@ Specifies file or device name to use for backing store.
Specifies number of backend threads to use for this LUN.
.El
.Sh EXAMPLES
.Dl ctladm tur 0:1
.Dl ctladm tur 1
.Pp
Send a
.Tn SCSI
TEST UNIT READY command to LUN 1.
.Pp
.Dl ctladm modesense 0:1 -l
.Dl ctladm modesense 1 -l
.Pp
Display the list of mode pages supported by LUN 1.
.Pp
.Dl ctladm modesense 0:0 -m 10 -P 3 -d -c 10
.Dl ctladm modesense 0 -m 10 -P 3 -d -c 10
.Pp
Display the saved version of the Control mode page (page 10) on LUN 0.
Disable fetching block descriptors, and use a 10 byte MODE SENSE command
instead of the default 6 byte command.
.Bd -literal
ctladm read 0:2 -l 0 -d 1 -b 512 -f - > foo
ctladm read 2 -l 0 -d 1 -b 512 -f - > foo
.Ed
.Pp
Read the first 512 byte block from LUN 2 and dump it to the file
.Pa foo .
.Bd -literal
ctladm write 0:3 -l 0xff432140 -d 20 -b 512 -f /tmp/bar
ctladm write 3 -l 0xff432140 -d 20 -b 512 -f /tmp/bar
.Ed
.Pp
Read 10240 bytes from the file
.Pa /tmp/bar
and write it to target 0, LUN 3.
and write it to LUN 3.
starting at LBA 0xff432140.
.Pp
.Dl ctladm create -b ramdisk -s 10485760000000000
@ -1095,12 +1095,12 @@ List all LUNs in the system, along with their inquiry data and device type.
This only works when the FETDs are enabled, since the commands go through the
ioctl port.
.Pp
.Dl ctladm inject 0:6 -i mediumerr -p read -r 0,512 -c
.Dl ctladm inject 6 -i mediumerr -p read -r 0,512 -c
.Pp
Inject a medium error on LUN 6 for every read that covers the first 512
blocks of the LUN.
.Bd -literal -offset indent
ctladm inject 0:6 -i custom -p tur -s 18 "f0 0 02 s12 04 02"
ctladm inject 6 -i custom -p tur -s 18 "f0 0 02 s12 04 02"
.Ed
.Pp
Inject a custom error on LUN 6 for the next TEST UNIT READY command only.

View File

@ -211,49 +211,47 @@ static struct ctladm_opts option_table[] = {
ctladm_optret getoption(struct ctladm_opts *table, char *arg, uint32_t *cmdnum,
ctladm_cmdargs *argnum, const char **subopt);
static int cctl_parse_tl(char *str, int *target, int *lun);
static int cctl_dump_ooa(int fd, int argc, char **argv);
static int cctl_port_dump(int fd, int quiet, int xml, int32_t fe_num,
ctl_port_type port_type);
static int cctl_port(int fd, int argc, char **argv, char *combinedopt);
static int cctl_do_io(int fd, int retries, union ctl_io *io, const char *func);
static int cctl_delay(int fd, int target, int lun, int argc, char **argv,
static int cctl_delay(int fd, int lun, int argc, char **argv,
char *combinedopt);
static int cctl_lunlist(int fd);
static int cctl_startup_shutdown(int fd, int target, int lun, int iid,
static int cctl_startup_shutdown(int fd, int lun, int iid,
ctladm_cmdfunction command);
static int cctl_sync_cache(int fd, int target, int lun, int iid, int retries,
static int cctl_sync_cache(int fd, int lun, int iid, int retries,
int argc, char **argv, char *combinedopt);
static int cctl_start_stop(int fd, int target, int lun, int iid, int retries,
static int cctl_start_stop(int fd, int lun, int iid, int retries,
int start, int argc, char **argv, char *combinedopt);
static int cctl_mode_sense(int fd, int target, int lun, int iid, int retries,
static int cctl_mode_sense(int fd, int lun, int iid, int retries,
int argc, char **argv, char *combinedopt);
static int cctl_read_capacity(int fd, int target, int lun, int iid,
static int cctl_read_capacity(int fd, int lun, int iid,
int retries, int argc, char **argv,
char *combinedopt);
static int cctl_read_write(int fd, int target, int lun, int iid, int retries,
static int cctl_read_write(int fd, int lun, int iid, int retries,
int argc, char **argv, char *combinedopt,
ctladm_cmdfunction command);
static int cctl_get_luns(int fd, int target, int lun, int iid, int retries,
static int cctl_get_luns(int fd, int lun, int iid, int retries,
struct scsi_report_luns_data **lun_data,
uint32_t *num_luns);
static int cctl_report_luns(int fd, int target, int lun, int iid, int retries);
static int cctl_tur(int fd, int target, int lun, int iid, int retries);
static int cctl_get_inquiry(int fd, int target, int lun, int iid, int retries,
static int cctl_report_luns(int fd, int lun, int iid, int retries);
static int cctl_tur(int fd, int lun, int iid, int retries);
static int cctl_get_inquiry(int fd, int lun, int iid, int retries,
char *path_str, int path_len,
struct scsi_inquiry_data *inq_data);
static int cctl_inquiry(int fd, int target, int lun, int iid, int retries);
static int cctl_req_sense(int fd, int target, int lun, int iid, int retries);
static int cctl_persistent_reserve_in(int fd, int target, int lun,
static int cctl_inquiry(int fd, int lun, int iid, int retries);
static int cctl_req_sense(int fd, int lun, int iid, int retries);
static int cctl_persistent_reserve_in(int fd, int lun,
int initiator, int argc, char **argv,
char *combinedopt, int retry_count);
static int cctl_persistent_reserve_out(int fd, int target, int lun,
static int cctl_persistent_reserve_out(int fd, int lun,
int initiator, int argc, char **argv,
char *combinedopt, int retry_count);
static int cctl_create_lun(int fd, int argc, char **argv, char *combinedopt);
static int cctl_inquiry_vpd_devid(int fd, int target, int lun, int initiator);
static int cctl_report_target_port_group(int fd, int target, int lun,
int initiator);
static int cctl_inquiry_vpd_devid(int fd, int lun, int initiator);
static int cctl_report_target_port_group(int fd, int lun, int initiator);
static int cctl_modify_lun(int fd, int argc, char **argv, char *combinedopt);
ctladm_optret
@ -284,50 +282,20 @@ getoption(struct ctladm_opts *table, char *arg, uint32_t *cmdnum,
return(CC_OR_NOT_FOUND);
}
static int
cctl_parse_tl(char *str, int *target, int *lun)
{
char *tmpstr;
int retval;
retval = 0;
while (isspace(*str) && (*str != '\0'))
str++;
tmpstr = (char *)strtok(str, ":");
if ((tmpstr != NULL) && (*tmpstr != '\0')) {
*target = strtol(tmpstr, NULL, 0);
tmpstr = (char *)strtok(NULL, ":");
if ((tmpstr != NULL) && (*tmpstr != '\0')) {
*lun = strtol(tmpstr, NULL, 0);
} else
retval = -1;
} else
retval = -1;
return (retval);
}
static int
cctl_dump_ooa(int fd, int argc, char **argv)
{
struct ctl_ooa ooa;
long double cmd_latency;
int num_entries, len;
int target = -1, lun = -1;
int lun = -1;
int retval;
unsigned int i;
num_entries = 104;
if ((argc > 2)
&& (isdigit(argv[2][0]))) {
retval = cctl_parse_tl(argv[2], &target, &lun);
if (retval != 0)
warnx("invalid target:lun argument %s", argv[2]);
}
if ((argc > 2) && (isdigit(argv[2][0])))
lun = strtol(argv[2], NULL, 0);
retry:
len = num_entries * sizeof(struct ctl_ooa_entry);
@ -776,7 +744,7 @@ cctl_do_io(int fd, int retries, union ctl_io *io, const char *func)
}
static int
cctl_delay(int fd, int target, int lun, int argc, char **argv,
cctl_delay(int fd, int lun, int argc, char **argv,
char *combinedopt)
{
struct ctl_io_delay_info delay_info;
@ -831,7 +799,6 @@ cctl_delay(int fd, int target, int lun, int argc, char **argv,
goto bailout;
}
delay_info.target_id = target;
delay_info.lun_id = lun;
delay_info.delay_secs = delaytime;
@ -938,7 +905,7 @@ cctl_realsync(int fd, int argc, char **argv)
}
static int
cctl_getsetsync(int fd, int target, int lun, ctladm_cmdfunction command,
cctl_getsetsync(int fd, int lun, ctladm_cmdfunction command,
int argc, char **argv, char *combinedopt)
{
struct ctl_sync_info sync_info;
@ -950,7 +917,6 @@ cctl_getsetsync(int fd, int target, int lun, ctladm_cmdfunction command,
retval = 0;
memset(&sync_info, 0, sizeof(sync_info));
sync_info.target_id = target;
sync_info.lun_id = lun;
while ((c = getopt(argc, argv, combinedopt)) != -1) {
@ -986,12 +952,12 @@ cctl_getsetsync(int fd, int target, int lun, ctladm_cmdfunction command,
switch (sync_info.status) {
case CTL_GS_SYNC_OK:
if (command == CTLADM_CMD_GETSYNC) {
fprintf(stdout, "%d:%d: sync interval: %d\n",
target, lun, sync_info.sync_interval);
fprintf(stdout, "%d: sync interval: %d\n",
lun, sync_info.sync_interval);
}
break;
case CTL_GS_SYNC_NO_LUN:
warnx("%s: unknown target:LUN %d:%d", __func__, target, lun);
warnx("%s: unknown LUN %d", __func__, lun);
retval = 1;
break;
case CTL_GS_SYNC_NONE:
@ -1030,7 +996,7 @@ static struct ctladm_opts cctl_err_patterns[] = {
};
static int
cctl_error_inject(int fd, uint32_t target, uint32_t lun, int argc, char **argv,
cctl_error_inject(int fd, uint32_t lun, int argc, char **argv,
char *combinedopt)
{
int retval = 0;
@ -1045,7 +1011,6 @@ cctl_error_inject(int fd, uint32_t target, uint32_t lun, int argc, char **argv,
int c;
bzero(&err_desc, sizeof(err_desc));
err_desc.target_id = target;
err_desc.lun_id = lun;
while ((c = getopt(argc, argv, combinedopt)) != -1) {
@ -1256,7 +1221,6 @@ cctl_lunlist(int fd)
struct scsi_report_luns_data *lun_data;
struct scsi_inquiry_data *inq_data;
uint32_t num_luns;
int target;
int initid;
unsigned int i;
int retval;
@ -1264,14 +1228,13 @@ cctl_lunlist(int fd)
retval = 0;
inq_data = NULL;
target = 6;
initid = 7;
/*
* XXX KDM assuming LUN 0 is fine, but we may need to change this
* if we ever acquire the ability to have multiple targets.
*/
if ((retval = cctl_get_luns(fd, target, /*lun*/ 0, initid,
if ((retval = cctl_get_luns(fd, /*lun*/ 0, initid,
/*retries*/ 2, &lun_data, &num_luns)) != 0)
goto bailout;
@ -1308,7 +1271,7 @@ cctl_lunlist(int fd)
if (lun_val == -1)
continue;
if ((retval = cctl_get_inquiry(fd, target, lun_val, initid,
if ((retval = cctl_get_inquiry(fd, lun_val, initid,
/*retries*/ 2, scsi_path,
sizeof(scsi_path),
inq_data)) != 0) {
@ -1329,11 +1292,10 @@ cctl_lunlist(int fd)
}
static int
cctl_startup_shutdown(int fd, int target, int lun, int iid,
cctl_startup_shutdown(int fd, int lun, int iid,
ctladm_cmdfunction command)
{
union ctl_io *io;
struct ctl_id id;
struct scsi_report_luns_data *lun_data;
struct scsi_inquiry_data *inq_data;
uint32_t num_luns;
@ -1353,15 +1315,13 @@ cctl_startup_shutdown(int fd, int target, int lun, int iid,
* and reissue the stop with the offline bit set
*/
id.id = iid;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warnx("%s: can't allocate memory", __func__);
return (1);
}
if ((retval = cctl_get_luns(fd, target, lun, iid, /*retries*/ 2,
if ((retval = cctl_get_luns(fd, lun, iid, /*retries*/ 2,
&lun_data, &num_luns)) != 0)
goto bailout;
@ -1402,7 +1362,7 @@ cctl_startup_shutdown(int fd, int target, int lun, int iid,
if (lun_val == -1)
continue;
if ((retval = cctl_get_inquiry(fd, target, lun_val, iid,
if ((retval = cctl_get_inquiry(fd, lun_val, iid,
/*retries*/ 2, scsi_path,
sizeof(scsi_path),
inq_data)) != 0) {
@ -1422,7 +1382,6 @@ cctl_startup_shutdown(int fd, int target, int lun, int iid,
if (command == CTLADM_CMD_SHUTDOWN) {
struct ctl_ooa_info ooa_info;
ooa_info.target_id = target;
ooa_info.lun_id = lun_val;
if (ioctl(fd, CTL_CHECK_OOA, &ooa_info) == -1) {
@ -1457,9 +1416,8 @@ cctl_startup_shutdown(int fd, int target, int lun, int iid,
CTL_TAG_SIMPLE :CTL_TAG_ORDERED,
/*control*/ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun_val;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, /*retries*/ 3, io, __func__) != 0) {
retval = 1;
@ -1488,11 +1446,10 @@ cctl_startup_shutdown(int fd, int target, int lun, int iid,
}
static int
cctl_sync_cache(int fd, int target, int lun, int iid, int retries,
cctl_sync_cache(int fd, int lun, int iid, int retries,
int argc, char **argv, char *combinedopt)
{
union ctl_io *io;
struct ctl_id id;
int cdb_size = -1;
int retval;
uint64_t our_lba = 0;
@ -1500,10 +1457,9 @@ cctl_sync_cache(int fd, int target, int lun, int iid, int retries,
int reladr = 0, immed = 0;
int c;
id.id = iid;
retval = 0;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warnx("%s: can't allocate memory", __func__);
return (1);
@ -1555,9 +1511,8 @@ cctl_sync_cache(int fd, int target, int lun, int iid, int retries,
/*tag_type*/ CTL_TAG_SIMPLE,
/*control*/ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, retries, io, __func__) != 0) {
retval = 1;
@ -1575,19 +1530,17 @@ cctl_sync_cache(int fd, int target, int lun, int iid, int retries,
}
static int
cctl_start_stop(int fd, int target, int lun, int iid, int retries, int start,
cctl_start_stop(int fd, int lun, int iid, int retries, int start,
int argc, char **argv, char *combinedopt)
{
union ctl_io *io;
struct ctl_id id;
char scsi_path[40];
int immed = 0, onoffline = 0;
int retval, c;
id.id = iid;
retval = 0;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warnx("%s: can't allocate memory", __func__);
return (1);
@ -1622,9 +1575,8 @@ cctl_start_stop(int fd, int target, int lun, int iid, int retries, int start,
CTL_TAG_ORDERED,
/*control*/ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, retries, io, __func__) != 0) {
retval = 1;
@ -1645,11 +1597,10 @@ cctl_start_stop(int fd, int target, int lun, int iid, int retries, int start,
}
static int
cctl_mode_sense(int fd, int target, int lun, int iid, int retries,
cctl_mode_sense(int fd, int lun, int iid, int retries,
int argc, char **argv, char *combinedopt)
{
union ctl_io *io;
struct ctl_id id;
uint32_t datalen;
uint8_t *dataptr;
int pc = -1, cdbsize, retval, dbd = 0, subpage = -1;
@ -1657,12 +1608,11 @@ cctl_mode_sense(int fd, int target, int lun, int iid, int retries,
int page_code = -1;
int c;
id.id = iid;
cdbsize = 0;
retval = 0;
dataptr = NULL;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warn("%s: can't allocate memory", __func__);
return (1);
@ -1790,9 +1740,8 @@ cctl_mode_sense(int fd, int target, int lun, int iid, int retries,
/*tag_type*/ CTL_TAG_SIMPLE,
/*control*/ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, retries, io, __func__) != 0) {
retval = 1;
@ -1863,11 +1812,10 @@ cctl_mode_sense(int fd, int target, int lun, int iid, int retries,
}
static int
cctl_read_capacity(int fd, int target, int lun, int iid, int retries,
cctl_read_capacity(int fd, int lun, int iid, int retries,
int argc, char **argv, char *combinedopt)
{
union ctl_io *io;
struct ctl_id id;
struct scsi_read_capacity_data *data;
struct scsi_read_capacity_data_long *longdata;
int cdbsize = -1, retval;
@ -1877,9 +1825,8 @@ cctl_read_capacity(int fd, int target, int lun, int iid, int retries,
cdbsize = 10;
dataptr = NULL;
retval = 0;
id.id = iid;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warn("%s: can't allocate memory\n", __func__);
return (1);
@ -1943,8 +1890,7 @@ cctl_read_capacity(int fd, int target, int lun, int iid, int retries,
break;
}
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.initid = iid;
io->io_hdr.nexus.targ_lun = lun;
if (cctl_do_io(fd, retries, io, __func__) != 0) {
@ -1989,12 +1935,11 @@ cctl_read_capacity(int fd, int target, int lun, int iid, int retries,
}
static int
cctl_read_write(int fd, int target, int lun, int iid, int retries,
cctl_read_write(int fd, int lun, int iid, int retries,
int argc, char **argv, char *combinedopt,
ctladm_cmdfunction command)
{
union ctl_io *io;
struct ctl_id id;
int file_fd, do_stdio;
int cdbsize = -1, databytes;
uint8_t *dataptr;
@ -2009,9 +1954,8 @@ cctl_read_write(int fd, int target, int lun, int iid, int retries,
do_stdio = 0;
dataptr = NULL;
file_fd = -1;
id.id = iid;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warn("%s: can't allocate memory\n", __func__);
return (1);
@ -2135,9 +2079,8 @@ cctl_read_write(int fd, int target, int lun, int iid, int retries,
/*tag_type*/ CTL_TAG_SIMPLE,
/*control*/ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, retries, io, __func__) != 0) {
retval = 1;
@ -2172,19 +2115,17 @@ cctl_read_write(int fd, int target, int lun, int iid, int retries,
}
static int
cctl_get_luns(int fd, int target, int lun, int iid, int retries, struct
cctl_get_luns(int fd, int lun, int iid, int retries, struct
scsi_report_luns_data **lun_data, uint32_t *num_luns)
{
union ctl_io *io;
struct ctl_id id;
uint32_t nluns;
int lun_datalen;
int retval;
retval = 0;
id.id = iid;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warnx("%s: can't allocate memory", __func__);
return (1);
@ -2213,8 +2154,7 @@ cctl_get_luns(int fd, int target, int lun, int iid, int retries, struct
/*tag_type*/ CTL_TAG_SIMPLE,
/*control*/ 0);
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.initid = iid;
io->io_hdr.nexus.targ_lun = lun;
if (cctl_do_io(fd, retries, io, __func__) != 0) {
@ -2245,7 +2185,7 @@ cctl_get_luns(int fd, int target, int lun, int iid, int retries, struct
}
static int
cctl_report_luns(int fd, int target, int lun, int iid, int retries)
cctl_report_luns(int fd, int lun, int iid, int retries)
{
struct scsi_report_luns_data *lun_data;
uint32_t num_luns, i;
@ -2253,7 +2193,7 @@ cctl_report_luns(int fd, int target, int lun, int iid, int retries)
lun_data = NULL;
if ((retval = cctl_get_luns(fd, target, lun, iid, retries, &lun_data,
if ((retval = cctl_get_luns(fd, lun, iid, retries, &lun_data,
&num_luns)) != 0)
goto bailout;
@ -2298,14 +2238,11 @@ cctl_report_luns(int fd, int target, int lun, int iid, int retries)
}
static int
cctl_tur(int fd, int target, int lun, int iid, int retries)
cctl_tur(int fd, int lun, int iid, int retries)
{
union ctl_io *io;
struct ctl_id id;
id.id = iid;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
fprintf(stderr, "can't allocate memory\n");
return (1);
@ -2315,9 +2252,8 @@ cctl_tur(int fd, int target, int lun, int iid, int retries)
/* tag_type */ CTL_TAG_SIMPLE,
/* control */ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, retries, io, __func__) != 0) {
ctl_scsi_free_io(io);
@ -2333,19 +2269,16 @@ cctl_tur(int fd, int target, int lun, int iid, int retries)
}
static int
cctl_get_inquiry(int fd, int target, int lun, int iid, int retries,
cctl_get_inquiry(int fd, int lun, int iid, int retries,
char *path_str, int path_len,
struct scsi_inquiry_data *inq_data)
{
union ctl_io *io;
struct ctl_id id;
int retval;
retval = 0;
id.id = iid;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warnx("cctl_inquiry: can't allocate memory\n");
return (1);
@ -2359,9 +2292,8 @@ cctl_get_inquiry(int fd, int target, int lun, int iid, int retries,
/*tag_type*/ CTL_TAG_SIMPLE,
/*control*/ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, retries, io, __func__) != 0) {
retval = 1;
@ -2381,7 +2313,7 @@ cctl_get_inquiry(int fd, int target, int lun, int iid, int retries,
}
static int
cctl_inquiry(int fd, int target, int lun, int iid, int retries)
cctl_inquiry(int fd, int lun, int iid, int retries)
{
struct scsi_inquiry_data *inq_data;
char scsi_path[40];
@ -2396,7 +2328,7 @@ cctl_inquiry(int fd, int target, int lun, int iid, int retries)
goto bailout;
}
if ((retval = cctl_get_inquiry(fd, target, lun, iid, retries, scsi_path,
if ((retval = cctl_get_inquiry(fd, lun, iid, retries, scsi_path,
sizeof(scsi_path), inq_data)) != 0)
goto bailout;
@ -2411,18 +2343,15 @@ cctl_inquiry(int fd, int target, int lun, int iid, int retries)
}
static int
cctl_req_sense(int fd, int target, int lun, int iid, int retries)
cctl_req_sense(int fd, int lun, int iid, int retries)
{
union ctl_io *io;
struct scsi_sense_data *sense_data;
struct ctl_id id;
int retval;
retval = 0;
id.id = iid;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warnx("cctl_req_sense: can't allocate memory\n");
return (1);
@ -2437,9 +2366,8 @@ cctl_req_sense(int fd, int target, int lun, int iid, int retries)
/*tag_type*/ CTL_TAG_SIMPLE,
/*control*/ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, retries, io, __func__) != 0) {
retval = 1;
@ -2462,19 +2390,17 @@ cctl_req_sense(int fd, int target, int lun, int iid, int retries)
}
static int
cctl_report_target_port_group(int fd, int target, int lun, int initiator)
cctl_report_target_port_group(int fd, int lun, int iid)
{
union ctl_io *io;
struct ctl_id id;
uint32_t datalen;
uint8_t *dataptr;
int retval;
id.id = initiator;
dataptr = NULL;
retval = 0;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warn("%s: can't allocate memory", __func__);
return (1);
@ -2497,9 +2423,8 @@ cctl_report_target_port_group(int fd, int target, int lun, int initiator)
/*tag_type*/ CTL_TAG_SIMPLE,
/*control*/ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, 0, io, __func__) != 0) {
retval = 1;
@ -2530,19 +2455,17 @@ cctl_report_target_port_group(int fd, int target, int lun, int initiator)
}
static int
cctl_inquiry_vpd_devid(int fd, int target, int lun, int initiator)
cctl_inquiry_vpd_devid(int fd, int lun, int iid)
{
union ctl_io *io;
struct ctl_id id;
uint32_t datalen;
uint8_t *dataptr;
int retval;
id.id = initiator;
retval = 0;
dataptr = NULL;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warn("%s: can't allocate memory", __func__);
return (1);
@ -2566,9 +2489,8 @@ cctl_inquiry_vpd_devid(int fd, int target, int lun, int initiator)
/*tag_type*/ CTL_TAG_SIMPLE,
/*control*/ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, 0, io, __func__) != 0) {
retval = 1;
@ -2599,23 +2521,21 @@ cctl_inquiry_vpd_devid(int fd, int target, int lun, int initiator)
}
static int
cctl_persistent_reserve_in(int fd, int target, int lun, int initiator,
cctl_persistent_reserve_in(int fd, int lun, int iid,
int argc, char **argv, char *combinedopt,
int retry_count)
{
union ctl_io *io;
struct ctl_id id;
uint32_t datalen;
uint8_t *dataptr;
int action = -1;
int retval;
int c;
id.id = initiator;
retval = 0;
dataptr = NULL;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warn("%s: can't allocate memory", __func__);
return (1);
@ -2655,9 +2575,8 @@ cctl_persistent_reserve_in(int fd, int target, int lun, int initiator,
/*tag_type*/ CTL_TAG_SIMPLE,
/*control*/ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, retry_count, io, __func__) != 0) {
retval = 1;
@ -2705,12 +2624,11 @@ cctl_persistent_reserve_in(int fd, int target, int lun, int initiator,
}
static int
cctl_persistent_reserve_out(int fd, int target, int lun, int initiator,
cctl_persistent_reserve_out(int fd, int lun, int iid,
int argc, char **argv, char *combinedopt,
int retry_count)
{
union ctl_io *io;
struct ctl_id id;
uint32_t datalen;
uint64_t key = 0, sa_key = 0;
int action = -1, restype = -1;
@ -2718,11 +2636,10 @@ cctl_persistent_reserve_out(int fd, int target, int lun, int initiator,
int retval;
int c;
id.id = initiator;
retval = 0;
dataptr = NULL;
io = ctl_scsi_alloc_io(id);
io = ctl_scsi_alloc_io(iid);
if (io == NULL) {
warn("%s: can't allocate memory", __func__);
return (1);
@ -2780,9 +2697,8 @@ cctl_persistent_reserve_out(int fd, int target, int lun, int initiator,
/*tag_type*/ CTL_TAG_SIMPLE,
/*control*/ 0);
io->io_hdr.nexus.targ_target.id = target;
io->io_hdr.nexus.targ_lun = lun;
io->io_hdr.nexus.initid = id;
io->io_hdr.nexus.initid = iid;
if (cctl_do_io(fd, retry_count, io, __func__) != 0) {
retval = 1;
@ -4512,7 +4428,7 @@ main(int argc, char **argv)
const char *mainopt = "C:D:I:";
const char *subopt = NULL;
char combinedopt[256];
int target, lun;
int lun;
int optstart = 2;
int retval, fd;
int retries;
@ -4525,7 +4441,6 @@ main(int argc, char **argv)
device = NULL;
fd = -1;
retries = 0;
target = 0;
lun = 0;
initid = 7;
@ -4551,16 +4466,13 @@ main(int argc, char **argv)
}
if (cmdargs & CTLADM_ARG_NEED_TL) {
if ((argc < 3)
|| (!isdigit(argv[2][0]))) {
warnx("option %s requires a target:lun argument",
if ((argc < 3) || (!isdigit(argv[2][0]))) {
warnx("option %s requires a lun argument",
argv[1]);
usage(0);
exit(1);
}
retval = cctl_parse_tl(argv[2], &target, &lun);
if (retval != 0)
errx(1, "invalid target:lun argument %s", argv[2]);
lun = strtol(argv[2], NULL, 0);
cmdargs |= CTLADM_ARG_TARG_LUN;
optstart++;
@ -4691,16 +4603,16 @@ main(int argc, char **argv)
switch (command) {
case CTLADM_CMD_TUR:
retval = cctl_tur(fd, target, lun, initid, retries);
retval = cctl_tur(fd, lun, initid, retries);
break;
case CTLADM_CMD_INQUIRY:
retval = cctl_inquiry(fd, target, lun, initid, retries);
retval = cctl_inquiry(fd, lun, initid, retries);
break;
case CTLADM_CMD_REQ_SENSE:
retval = cctl_req_sense(fd, target, lun, initid, retries);
retval = cctl_req_sense(fd, lun, initid, retries);
break;
case CTLADM_CMD_REPORT_LUNS:
retval = cctl_report_luns(fd, target, lun, initid, retries);
retval = cctl_report_luns(fd, lun, initid, retries);
break;
case CTLADM_CMD_CREATE:
retval = cctl_create_lun(fd, argc, argv, combinedopt);
@ -4713,7 +4625,7 @@ main(int argc, char **argv)
break;
case CTLADM_CMD_READ:
case CTLADM_CMD_WRITE:
retval = cctl_read_write(fd, target, lun, initid, retries,
retval = cctl_read_write(fd, lun, initid, retries,
argc, argv, combinedopt, command);
break;
case CTLADM_CMD_PORT:
@ -4726,44 +4638,44 @@ main(int argc, char **argv)
retval = cctl_lunmap(fd, argc, argv, combinedopt);
break;
case CTLADM_CMD_READCAPACITY:
retval = cctl_read_capacity(fd, target, lun, initid, retries,
retval = cctl_read_capacity(fd, lun, initid, retries,
argc, argv, combinedopt);
break;
case CTLADM_CMD_MODESENSE:
retval = cctl_mode_sense(fd, target, lun, initid, retries,
retval = cctl_mode_sense(fd, lun, initid, retries,
argc, argv, combinedopt);
break;
case CTLADM_CMD_START:
case CTLADM_CMD_STOP:
retval = cctl_start_stop(fd, target, lun, initid, retries,
retval = cctl_start_stop(fd, lun, initid, retries,
(command == CTLADM_CMD_START) ? 1 : 0,
argc, argv, combinedopt);
break;
case CTLADM_CMD_SYNC_CACHE:
retval = cctl_sync_cache(fd, target, lun, initid, retries,
retval = cctl_sync_cache(fd, lun, initid, retries,
argc, argv, combinedopt);
break;
case CTLADM_CMD_SHUTDOWN:
case CTLADM_CMD_STARTUP:
retval = cctl_startup_shutdown(fd, target, lun, initid,
retval = cctl_startup_shutdown(fd, lun, initid,
command);
break;
case CTLADM_CMD_LUNLIST:
retval = cctl_lunlist(fd);
break;
case CTLADM_CMD_DELAY:
retval = cctl_delay(fd, target, lun, argc, argv, combinedopt);
retval = cctl_delay(fd, lun, argc, argv, combinedopt);
break;
case CTLADM_CMD_REALSYNC:
retval = cctl_realsync(fd, argc, argv);
break;
case CTLADM_CMD_SETSYNC:
case CTLADM_CMD_GETSYNC:
retval = cctl_getsetsync(fd, target, lun, command,
retval = cctl_getsetsync(fd, lun, command,
argc, argv, combinedopt);
break;
case CTLADM_CMD_ERR_INJECT:
retval = cctl_error_inject(fd, target, lun, argc, argv,
retval = cctl_error_inject(fd, lun, argc, argv,
combinedopt);
break;
case CTLADM_CMD_DUMPOOA:
@ -4773,20 +4685,20 @@ main(int argc, char **argv)
retval = cctl_dump_structs(fd, cmdargs);
break;
case CTLADM_CMD_PRES_IN:
retval = cctl_persistent_reserve_in(fd, target, lun, initid,
retval = cctl_persistent_reserve_in(fd, lun, initid,
argc, argv, combinedopt,
retries);
break;
case CTLADM_CMD_PRES_OUT:
retval = cctl_persistent_reserve_out(fd, target, lun, initid,
retval = cctl_persistent_reserve_out(fd, lun, initid,
argc, argv, combinedopt,
retries);
break;
case CTLADM_CMD_INQ_VPD_DEVID:
retval = cctl_inquiry_vpd_devid(fd, target, lun, initid);
retval = cctl_inquiry_vpd_devid(fd, lun, initid);
break;
case CTLADM_CMD_RTPG:
retval = cctl_report_target_port_group(fd, target, lun, initid);
retval = cctl_report_target_port_group(fd, lun, initid);
break;
case CTLADM_CMD_MODIFY:
retval = cctl_modify_lun(fd, argc, argv, combinedopt);