svn commit: r268307 - head/sys/cam/ctl
Alexander Motin
mav at FreeBSD.org
Sun Jul 6 06:21:35 UTC 2014
Author: mav
Date: Sun Jul 6 06:21:34 2014
New Revision: 268307
URL: http://svnweb.freebsd.org/changeset/base/268307
Log:
Move lun_map() method from command nexus to port.
Previous implementation made impossible to do some things, such as calling
it for ports other then one through which command arrived.
Modified:
head/sys/cam/ctl/ctl.c
head/sys/cam/ctl/ctl_frontend.h
head/sys/cam/ctl/ctl_frontend_iscsi.c
head/sys/cam/ctl/ctl_frontend_iscsi.h
head/sys/cam/ctl/ctl_io.h
Modified: head/sys/cam/ctl/ctl.c
==============================================================================
--- head/sys/cam/ctl/ctl.c Sun Jul 6 06:12:29 2014 (r268306)
+++ head/sys/cam/ctl/ctl.c Sun Jul 6 06:21:34 2014 (r268307)
@@ -346,6 +346,7 @@ static int ctl_ioctl(struct cdev *dev, u
struct thread *td);
uint32_t ctl_get_resindex(struct ctl_nexus *nexus);
uint32_t ctl_port_idx(int port_num);
+static uint32_t ctl_map_lun(int port_num, uint32_t lun);
#ifdef unused
static union ctl_io *ctl_malloc_io(ctl_io_type io_type, uint32_t targ_port,
uint32_t targ_target, uint32_t targ_lun,
@@ -3345,6 +3346,19 @@ ctl_port_idx(int port_num)
return(port_num - CTL_MAX_PORTS);
}
+static uint32_t
+ctl_map_lun(int port_num, uint32_t lun_id)
+{
+ struct ctl_port *port;
+
+ port = control_softc->ctl_ports[ctl_port_idx(port_num)];
+ if (port == NULL)
+ return (UINT32_MAX);
+ if (port->lun_map == NULL)
+ return (lun_id);
+ return (port->lun_map(port->targ_lun_arg, lun_id));
+}
+
/*
* Note: This only works for bitmask sizes that are at least 32 bits, and
* that are a power of 2.
@@ -9256,9 +9270,7 @@ ctl_report_luns(struct ctl_scsiio *ctsio
mtx_lock(&control_softc->ctl_lock);
for (targ_lun_id = 0, num_filled = 0; targ_lun_id < CTL_MAX_LUNS && num_filled < num_luns; targ_lun_id++) {
- lun_id = targ_lun_id;
- if (ctsio->io_hdr.nexus.lun_map_fn != NULL)
- lun_id = ctsio->io_hdr.nexus.lun_map_fn(ctsio->io_hdr.nexus.lun_map_arg, lun_id);
+ lun_id = ctl_map_lun(ctsio->io_hdr.nexus.targ_port, targ_lun_id);
if (lun_id >= CTL_MAX_LUNS)
continue;
lun = control_softc->ctl_luns[lun_id];
@@ -13240,8 +13252,7 @@ ctl_queue_sense(union ctl_io *io)
* information.
*/
targ_lun = io->io_hdr.nexus.targ_lun;
- if (io->io_hdr.nexus.lun_map_fn != NULL)
- targ_lun = io->io_hdr.nexus.lun_map_fn(io->io_hdr.nexus.lun_map_arg, targ_lun);
+ targ_lun = ctl_map_lun(io->io_hdr.nexus.targ_port, targ_lun);
if ((targ_lun < CTL_MAX_LUNS)
&& (ctl_softc->ctl_luns[targ_lun] != NULL))
lun = ctl_softc->ctl_luns[targ_lun];
@@ -13292,11 +13303,8 @@ ctl_queue(union ctl_io *io)
#endif /* CTL_TIME_IO */
/* Map FE-specific LUN ID into global one. */
- if (io->io_hdr.nexus.lun_map_fn != NULL)
- io->io_hdr.nexus.targ_mapped_lun = io->io_hdr.nexus.lun_map_fn(
- io->io_hdr.nexus.lun_map_arg, io->io_hdr.nexus.targ_lun);
- else
- io->io_hdr.nexus.targ_mapped_lun = io->io_hdr.nexus.targ_lun;
+ io->io_hdr.nexus.targ_mapped_lun =
+ ctl_map_lun(io->io_hdr.nexus.targ_port, io->io_hdr.nexus.targ_lun);
switch (io->io_hdr.io_type) {
case CTL_IO_SCSI:
Modified: head/sys/cam/ctl/ctl_frontend.h
==============================================================================
--- head/sys/cam/ctl/ctl_frontend.h Sun Jul 6 06:12:29 2014 (r268306)
+++ head/sys/cam/ctl/ctl_frontend.h Sun Jul 6 06:21:34 2014 (r268307)
@@ -49,8 +49,8 @@ typedef enum {
typedef int (*fe_init_t)(void);
typedef void (*fe_shutdown_t)(void);
typedef void (*port_func_t)(void *onoff_arg);
-typedef int (*targ_func_t)(void *arg, struct ctl_id targ_id);
typedef int (*lun_func_t)(void *arg, struct ctl_id targ_id, int lun_id);
+typedef uint32_t (*lun_map_func_t)(void *arg, uint32_t lun_id);
typedef int (*fe_ioctl_t)(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
struct thread *td);
@@ -217,6 +217,7 @@ struct ctl_port {
void *onoff_arg; /* passed to CTL */
lun_func_t lun_enable; /* passed to CTL */
lun_func_t lun_disable; /* passed to CTL */
+ lun_map_func_t lun_map; /* passed to CTL */
void *targ_lun_arg; /* passed to CTL */
void (*fe_datamove)(union ctl_io *io); /* passed to CTL */
void (*fe_done)(union ctl_io *io); /* passed to CTL */
Modified: head/sys/cam/ctl/ctl_frontend_iscsi.c
==============================================================================
--- head/sys/cam/ctl/ctl_frontend_iscsi.c Sun Jul 6 06:12:29 2014 (r268306)
+++ head/sys/cam/ctl/ctl_frontend_iscsi.c Sun Jul 6 06:21:34 2014 (r268307)
@@ -149,11 +149,11 @@ static int cfiscsi_lun_enable(void *arg,
struct ctl_id target_id, int lun_id);
static int cfiscsi_lun_disable(void *arg,
struct ctl_id target_id, int lun_id);
+static uint32_t cfiscsi_lun_map(void *arg, uint32_t lun);
static int cfiscsi_ioctl(struct cdev *dev,
u_long cmd, caddr_t addr, int flag, struct thread *td);
static void cfiscsi_datamove(union ctl_io *io);
static void cfiscsi_done(union ctl_io *io);
-static uint32_t cfiscsi_map_lun(void *arg, uint32_t lun);
static bool cfiscsi_pdu_update_cmdsn(const struct icl_pdu *request);
static void cfiscsi_pdu_handle_nop_out(struct icl_pdu *request);
static void cfiscsi_pdu_handle_scsi_command(struct icl_pdu *request);
@@ -552,8 +552,6 @@ cfiscsi_pdu_handle_scsi_command(struct i
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->io_hdr.nexus.lun_map_fn = cfiscsi_map_lun;
- io->io_hdr.nexus.lun_map_arg = cs;
io->scsiio.tag_num = bhssc->bhssc_initiator_task_tag;
switch ((bhssc->bhssc_flags & BHSSC_FLAGS_ATTR)) {
case BHSSC_FLAGS_ATTR_UNTAGGED:
@@ -618,8 +616,6 @@ cfiscsi_pdu_handle_task_request(struct i
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->io_hdr.nexus.lun_map_fn = cfiscsi_map_lun;
- io->io_hdr.nexus.lun_map_arg = cs;
io->taskio.tag_type = CTL_TAG_SIMPLE; /* XXX */
switch (bhstmr->bhstmr_function & ~0x80) {
@@ -2000,6 +1996,7 @@ cfiscsi_ioctl_port_create(struct ctl_req
port->onoff_arg = ct;
port->lun_enable = cfiscsi_lun_enable;
port->lun_disable = cfiscsi_lun_disable;
+ port->lun_map = cfiscsi_lun_map;
port->targ_lun_arg = ct;
port->fe_datamove = cfiscsi_datamove;
port->fe_done = cfiscsi_done;
@@ -2246,7 +2243,7 @@ cfiscsi_target_find_or_create(struct cfi
}
for (i = 0; i < CTL_MAX_LUNS; i++)
- newct->ct_luns[i] = -1;
+ newct->ct_luns[i] = UINT32_MAX;
strlcpy(newct->ct_name, name, sizeof(newct->ct_name));
if (alias != NULL)
@@ -2263,22 +2260,16 @@ cfiscsi_target_find_or_create(struct cfi
* Takes LUN from the target space and returns LUN from the CTL space.
*/
static uint32_t
-cfiscsi_map_lun(void *arg, uint32_t lun)
+cfiscsi_lun_map(void *arg, uint32_t lun)
{
- struct cfiscsi_session *cs;
-
- cs = arg;
+ struct cfiscsi_target *ct = arg;
if (lun >= CTL_MAX_LUNS) {
CFISCSI_DEBUG("requested lun number %d is higher "
"than maximum %d", lun, CTL_MAX_LUNS - 1);
- return (0xffffffff);
+ return (UINT32_MAX);
}
-
- if (cs->cs_target->ct_luns[lun] < 0)
- return (0xffffffff);
-
- return (cs->cs_target->ct_luns[lun]);
+ return (ct->ct_luns[lun]);
}
static int
@@ -2292,7 +2283,7 @@ cfiscsi_target_set_lun(struct cfiscsi_ta
return (-1);
}
- if (ct->ct_luns[lun_id] >= 0) {
+ if (ct->ct_luns[lun_id] < CTL_MAX_LUNS) {
/*
* CTL calls cfiscsi_lun_enable() twice for each LUN - once
* when the LUN is created, and a second time just before
@@ -2361,11 +2352,9 @@ cfiscsi_lun_disable(void *arg, struct ct
mtx_lock(&softc->lock);
for (i = 0; i < CTL_MAX_LUNS; i++) {
- if (ct->ct_luns[i] < 0)
- continue;
if (ct->ct_luns[i] != lun_id)
continue;
- ct->ct_luns[lun_id] = -1;
+ ct->ct_luns[i] = UINT32_MAX;
break;
}
mtx_unlock(&softc->lock);
Modified: head/sys/cam/ctl/ctl_frontend_iscsi.h
==============================================================================
--- head/sys/cam/ctl/ctl_frontend_iscsi.h Sun Jul 6 06:12:29 2014 (r268306)
+++ head/sys/cam/ctl/ctl_frontend_iscsi.h Sun Jul 6 06:21:34 2014 (r268307)
@@ -38,7 +38,7 @@
struct cfiscsi_target {
TAILQ_ENTRY(cfiscsi_target) ct_next;
- int ct_luns[CTL_MAX_LUNS];
+ uint32_t ct_luns[CTL_MAX_LUNS];
struct cfiscsi_softc *ct_softc;
volatile u_int ct_refcount;
char ct_name[CTL_ISCSI_NAME_LEN];
Modified: head/sys/cam/ctl/ctl_io.h
==============================================================================
--- head/sys/cam/ctl/ctl_io.h Sun Jul 6 06:12:29 2014 (r268306)
+++ head/sys/cam/ctl/ctl_io.h Sun Jul 6 06:21:34 2014 (r268307)
@@ -221,8 +221,6 @@ struct ctl_nexus {
struct ctl_id targ_target; /* Destination target */
uint32_t targ_lun; /* Destination lun */
uint32_t targ_mapped_lun; /* Destination lun CTL-wide */
- uint32_t (*lun_map_fn)(void *arg, uint32_t lun);
- void *lun_map_arg;
};
typedef enum {
More information about the svn-src-head
mailing list