summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-07-06 06:21:34 +0000
committermav <mav@FreeBSD.org>2014-07-06 06:21:34 +0000
commita50500ead5f0e5703333d6f631e2ba9508b56f5b (patch)
treee7184877d6fe0b8698119d55b9ff68a838c2e4c7
parent1bf007c8086750123e3746021e59b6022ec7ae97 (diff)
downloadFreeBSD-src-a50500ead5f0e5703333d6f631e2ba9508b56f5b.zip
FreeBSD-src-a50500ead5f0e5703333d6f631e2ba9508b56f5b.tar.gz
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.
-rw-r--r--sys/cam/ctl/ctl.c28
-rw-r--r--sys/cam/ctl/ctl_frontend.h3
-rw-r--r--sys/cam/ctl/ctl_frontend_iscsi.c29
-rw-r--r--sys/cam/ctl/ctl_frontend_iscsi.h2
-rw-r--r--sys/cam/ctl/ctl_io.h2
5 files changed, 30 insertions, 34 deletions
diff --git a/sys/cam/ctl/ctl.c b/sys/cam/ctl/ctl.c
index 4a5e40a..593567b 100644
--- a/sys/cam/ctl/ctl.c
+++ b/sys/cam/ctl/ctl.c
@@ -346,6 +346,7 @@ static int ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
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:
diff --git a/sys/cam/ctl/ctl_frontend.h b/sys/cam/ctl/ctl_frontend.h
index b246a22..cb08962 100644
--- a/sys/cam/ctl/ctl_frontend.h
+++ b/sys/cam/ctl/ctl_frontend.h
@@ -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 */
diff --git a/sys/cam/ctl/ctl_frontend_iscsi.c b/sys/cam/ctl/ctl_frontend_iscsi.c
index 31f914b..fa8bd82 100644
--- a/sys/cam/ctl/ctl_frontend_iscsi.c
+++ b/sys/cam/ctl/ctl_frontend_iscsi.c
@@ -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 icl_pdu *request)
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 icl_pdu *request)
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 *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 cfiscsi_softc *softc, const char *name,
}
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 cfiscsi_softc *softc, const char *name,
* 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_target *ct,
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 ctl_id target_id, int lun_id)
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);
diff --git a/sys/cam/ctl/ctl_frontend_iscsi.h b/sys/cam/ctl/ctl_frontend_iscsi.h
index 886e8ac..2ef2c9a 100644
--- a/sys/cam/ctl/ctl_frontend_iscsi.h
+++ b/sys/cam/ctl/ctl_frontend_iscsi.h
@@ -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];
diff --git a/sys/cam/ctl/ctl_io.h b/sys/cam/ctl/ctl_io.h
index aedd8e4..dc42dbb 100644
--- a/sys/cam/ctl/ctl_io.h
+++ b/sys/cam/ctl/ctl_io.h
@@ -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 {
OpenPOWER on IntegriCloud