[PATCH 2/3] tcm: Remove remaining code out of target_core_seobj.c

From: Nicholas A. Bellinger
Date: Thu Aug 19 2010 - 18:13:21 EST


From: Nicholas Bellinger <nab@xxxxxxxxxxxxxxx>

This patch removes the remaining code in target_core_seobj.c into target_core_device.c
and target_core_transport.c. It changes the 'void *p' pointer for these functions to
'struct se_device *dev', and also changes the function names to the following:

dev_obj_export() -> core_dev_export()
dev_obj_unexport() -> core_dev_unexport()
dev_obj_max_sectors() -> transport_dev_max_sectors() (static inline)
dev_obj_end_lba() -> transport_dev_end_lba() (static inline)
dev_obj_do_se_mem_map() -> transport_do_se_mem_map() (static)
dev_obj_get_mem_buf() -> transport_dev_get_mem_buf() (static inline)
dev_obj_get_mem_SG() -> transport_dev_get_mem_SG() (static inline)
dev_obj_get_map_SG() -> transport_dev_get_map_SG() (static inline)
dev_obj_get_map_non_SG() -> transport_dev_get_map_non_SG() (static inline)
dev_obj_get_map_none() -> transport_dev_get_map_none() (static inline)
dev_obj_check_online() -> se_dev_check_online()
dev_obj_check_shutdown() -> se_dev_check_shutdown()

The existing logic is left untouched, with the expection of one item in core_dev_export().
The original code in dev_obj_export() would obtain struct se_dev->se_port_lock
then struct se_lun->lun_sep_lock, and since there is no reason to be doing this with
a configfs control path which is enforcing individual LUN context control with
struct se_lun->lun_group, the order of the locks has been changed to be held individually.

Signed-off-by: Nicholas A. Bellinger <nab@xxxxxxxxxxxxxxx>
---
drivers/target/Kbuild | 1 -
drivers/target/target_core_configfs.c | 1 -
drivers/target/target_core_device.c | 70 ++++++++-
drivers/target/target_core_fabric_configfs.c | 1 -
drivers/target/target_core_seobj.c | 214 -------------------------
drivers/target/target_core_seobj.h | 47 ------
drivers/target/target_core_tpg.c | 5 +-
drivers/target/target_core_transport.c | 222 +++++++++++++++++++-------
include/target/target_core_device.h | 6 +
9 files changed, 239 insertions(+), 328 deletions(-)
delete mode 100644 drivers/target/target_core_seobj.c
delete mode 100644 drivers/target/target_core_seobj.h

diff --git a/drivers/target/Kbuild b/drivers/target/Kbuild
index 7a1b473..3626934 100644
--- a/drivers/target/Kbuild
+++ b/drivers/target/Kbuild
@@ -8,7 +8,6 @@ target_core_mod-y := target_core_configfs.o \
target_core_pr.o \
target_core_alua.o \
target_core_scdb.o \
- target_core_seobj.o \
target_core_tmr.o \
target_core_tpg.o \
target_core_transport.o \
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c
index f3635c4..b48340a 100644
--- a/drivers/target/target_core_configfs.c
+++ b/drivers/target/target_core_configfs.c
@@ -49,7 +49,6 @@
#include "target_core_alua.h"
#include "target_core_hba.h"
#include "target_core_pr.h"
-#include "target_core_seobj.h"
#include "target_core_rd.h"

struct list_head g_tf_list;
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
index 082c914..ec30ddf 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -48,7 +48,6 @@
#include "target_core_alua.h"
#include "target_core_hba.h"
#include "target_core_pr.h"
-#include "target_core_seobj.h"
#include "target_core_ua.h"

struct block_device *__linux_blockdevice_claim(
@@ -276,7 +275,7 @@ out:
* Determine if the struct se_lun is online.
*/
/* #warning FIXME: Check for LUN_RESET + UNIT Attention */
- if (dev_obj_check_online(se_lun->lun_type_ptr) != 0) {
+ if (se_dev_check_online(se_lun->lun_type_ptr) != 0) {
se_cmd->scsi_sense_reason = NON_EXISTENT_LUN;
se_cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
return -1;
@@ -344,7 +343,7 @@ extern int transport_get_lun_for_tmr(
* Determine if the struct se_lun is online.
*/
/* #warning FIXME: Check for LUN_RESET + UNIT Attention */
- if (dev_obj_check_online(se_lun->lun_type_ptr) != 0) {
+ if (se_dev_check_online(se_lun->lun_type_ptr) != 0) {
se_cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
return -1;
}
@@ -732,6 +731,48 @@ void core_release_port(struct se_device *dev, struct se_port *port)
return;
}

+int core_dev_export(
+ struct se_device *dev,
+ struct se_portal_group *tpg,
+ struct se_lun *lun)
+{
+ struct se_port *port;
+
+ port = core_alloc_port(dev);
+ if (!(port))
+ return -1;
+
+ lun->se_dev = dev;
+ se_dev_start(dev);
+
+ atomic_inc(&dev->dev_export_obj.obj_access_count);
+ core_export_port(dev, tpg, port, lun);
+ return 0;
+}
+
+void core_dev_unexport(
+ struct se_device *dev,
+ struct se_portal_group *tpg,
+ struct se_lun *lun)
+{
+ struct se_port *port = lun->lun_sep;
+
+ spin_lock(&lun->lun_sep_lock);
+ if (lun->lun_type_ptr == NULL) {
+ spin_unlock(&lun->lun_sep_lock);
+ return;
+ }
+ spin_unlock(&lun->lun_sep_lock);
+
+ spin_lock(&dev->se_port_lock);
+ atomic_dec(&dev->dev_export_obj.obj_access_count);
+ core_release_port(dev, port);
+ spin_unlock(&dev->se_port_lock);
+
+ se_dev_stop(dev);
+ lun->se_dev = NULL;
+}
+
int transport_core_report_lun_response(struct se_cmd *se_cmd)
{
struct se_dev_entry *deve;
@@ -959,6 +1000,29 @@ void se_dev_stop(struct se_device *dev)
msleep(10);
}

+int se_dev_check_online(struct se_device *dev)
+{
+ int ret;
+
+ spin_lock(&dev->dev_status_lock);
+ ret = ((dev->dev_status & TRANSPORT_DEVICE_ACTIVATED) ||
+ (dev->dev_status & TRANSPORT_DEVICE_DEACTIVATED)) ? 0 : 1;
+ spin_unlock(&dev->dev_status_lock);
+
+ return ret;
+}
+
+int se_dev_check_shutdown(struct se_device *dev)
+{
+ int ret;
+
+ spin_lock(&dev->dev_status_lock);
+ ret = (dev->dev_status & TRANSPORT_DEVICE_SHUTDOWN);
+ spin_unlock(&dev->dev_status_lock);
+
+ return ret;
+}
+
void se_dev_set_default_attribs(struct se_device *dev)
{
DEV_ATTRIB(dev)->emulate_ua_intlck_ctrl = DA_EMULATE_UA_INTLLCK_CTRL;
diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c
index f6015f7..d5eb1ad 100644
--- a/drivers/target/target_core_fabric_configfs.c
+++ b/drivers/target/target_core_fabric_configfs.c
@@ -48,7 +48,6 @@
#include "target_core_alua.h"
#include "target_core_hba.h"
#include "target_core_pr.h"
-#include "target_core_seobj.h"

#define TF_CIT_SETUP(_name, _item_ops, _group_ops, _attrs) \
static void target_fabric_setup_##_name##_cit(struct target_fabric_configfs *tf) \
diff --git a/drivers/target/target_core_seobj.c b/drivers/target/target_core_seobj.c
deleted file mode 100644
index 7ba4512..0000000
--- a/drivers/target/target_core_seobj.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Filename: target_core_seobj.c
- *
- * Copyright (c) 2006-2007 SBE, Inc. All Rights Reserved.
- * Copyright (c) 2007-2009 Rising Tide Software, Inc.
- * Copyright (c) 2008-2009 Linux-iSCSI.org
- *
- * Nicholas A. Bellinger <nab@xxxxxxxxxx>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- ******************************************************************************/
-
-
-#include <linux/string.h>
-#include <linux/timer.h>
-#include <linux/slab.h>
-#include <linux/blkdev.h>
-#include <linux/spinlock.h>
-#include <linux/smp_lock.h>
-#include <linux/in.h>
-
-#include <target/target_core_base.h>
-#include <target/target_core_device.h>
-#include <target/target_core_tpg.h>
-#include <target/target_core_transport.h>
-#include <target/target_core_fabric_ops.h>
-#include <target/target_core_configfs.h>
-
-#include "target_core_seobj.h"
-
-int dev_obj_export(void *p, struct se_portal_group *tpg, struct se_lun *lun)
-{
- struct se_device *dev = (struct se_device *)p;
- struct se_port *port;
-
- port = core_alloc_port(dev);
- if (!(port))
- return -1;
-
- lun->se_dev = dev;
- se_dev_start(p);
-
- atomic_inc(&dev->dev_export_obj.obj_access_count);
- core_export_port(dev, tpg, port, lun);
- return 0;
-}
-
-void dev_obj_unexport(void *p, struct se_portal_group *tpg, struct se_lun *lun)
-{
- struct se_device *dev = (struct se_device *)p;
- struct se_port *port = lun->lun_sep;
-
- spin_lock(&dev->se_port_lock);
- spin_lock(&lun->lun_sep_lock);
- if (lun->lun_type_ptr == NULL) {
- spin_unlock(&dev->se_port_lock);
- spin_unlock(&lun->lun_sep_lock);
- return;
- }
- spin_unlock(&lun->lun_sep_lock);
-
- atomic_dec(&dev->dev_export_obj.obj_access_count);
- core_release_port(dev, port);
- spin_unlock(&dev->se_port_lock);
-
- se_dev_stop(p);
- lun->se_dev = NULL;
-}
-
-int dev_obj_max_sectors(void *p)
-{
- struct se_device *dev = (struct se_device *)p;
-
- if (TRANSPORT(dev)->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV) {
- return (DEV_ATTRIB(dev)->max_sectors >
- TRANSPORT(dev)->get_max_sectors(dev) ?
- TRANSPORT(dev)->get_max_sectors(dev) :
- DEV_ATTRIB(dev)->max_sectors);
- } else
- return DEV_ATTRIB(dev)->max_sectors;
-}
-
-unsigned long long dev_obj_end_lba(void *p)
-{
- struct se_device *dev = (struct se_device *)p;
-
- return dev->dev_sectors_total + 1;
-}
-
-int dev_obj_do_se_mem_map(
- void *p,
- struct se_task *task,
- struct list_head *se_mem_list,
- void *in_mem,
- struct se_mem *in_se_mem,
- struct se_mem **out_se_mem,
- u32 *se_mem_cnt,
- u32 *task_offset_in)
-{
- struct se_device *dev = (struct se_device *)p;
- u32 task_offset = *task_offset_in;
- int ret = 0;
- /*
- * se_subsystem_api_t->do_se_mem_map is used when internal allocation
- * has been done by the transport plugin.
- */
- if (TRANSPORT(dev)->do_se_mem_map) {
- ret = TRANSPORT(dev)->do_se_mem_map(task, se_mem_list,
- in_mem, in_se_mem, out_se_mem, se_mem_cnt,
- task_offset_in);
- if (ret == 0)
- T_TASK(task->task_se_cmd)->t_task_se_num += *se_mem_cnt;
-
- return ret;
- }
-
- /*
- * Assume default that transport plugin speaks preallocated
- * scatterlists.
- */
- if (!(transport_calc_sg_num(task, in_se_mem, task_offset)))
- return -1;
-
- /*
- * struct se_task->task_sg now contains the struct scatterlist array.
- */
- return transport_map_mem_to_sg(task, se_mem_list, task->task_sg,
- in_se_mem, out_se_mem, se_mem_cnt, task_offset_in);
-}
-
-int dev_obj_get_mem_buf(void *p, struct se_cmd *cmd)
-{
- struct se_device *dev = (struct se_device *)p;
-
- cmd->transport_allocate_resources = (TRANSPORT(dev)->allocate_buf) ?
- TRANSPORT(dev)->allocate_buf : &transport_generic_allocate_buf;
- cmd->transport_free_resources = (TRANSPORT(dev)->free_buf) ?
- TRANSPORT(dev)->free_buf : NULL;
-
- return 0;
-}
-
-int dev_obj_get_mem_SG(void *p, struct se_cmd *cmd)
-{
- struct se_device *dev = (struct se_device *)p;
-
- cmd->transport_allocate_resources = (TRANSPORT(dev)->allocate_DMA) ?
- TRANSPORT(dev)->allocate_DMA : &transport_generic_get_mem;
- cmd->transport_free_resources = (TRANSPORT(dev)->free_DMA) ?
- TRANSPORT(dev)->free_DMA : NULL;
-
- return 0;
-}
-
-map_func_t dev_obj_get_map_SG(void *p, int rw)
-{
- struct se_device *dev = (struct se_device *)p;
-
- return (rw == SE_DIRECTION_WRITE) ? dev->transport->cdb_write_SG :
- dev->transport->cdb_read_SG;
-}
-
-map_func_t dev_obj_get_map_non_SG(void *p, int rw)
-{
- struct se_device *dev = (struct se_device *)p;
-
- return (rw == SE_DIRECTION_WRITE) ? dev->transport->cdb_write_non_SG :
- dev->transport->cdb_read_non_SG;
-}
-
-map_func_t dev_obj_get_map_none(void *p)
-{
- struct se_device *dev = (struct se_device *)p;
-
- return dev->transport->cdb_none;
-}
-
-int dev_obj_check_online(void *p)
-{
- struct se_device *dev = (struct se_device *)p;
- int ret;
-
- spin_lock(&dev->dev_status_lock);
- ret = ((dev->dev_status & TRANSPORT_DEVICE_ACTIVATED) ||
- (dev->dev_status & TRANSPORT_DEVICE_DEACTIVATED)) ? 0 : 1;
- spin_unlock(&dev->dev_status_lock);
-
- return ret;
-}
-
-int dev_obj_check_shutdown(void *p)
-{
- struct se_device *dev = (struct se_device *)p;
- int ret;
-
- spin_lock(&dev->dev_status_lock);
- ret = (dev->dev_status & TRANSPORT_DEVICE_SHUTDOWN);
- spin_unlock(&dev->dev_status_lock);
-
- return ret;
-}
diff --git a/drivers/target/target_core_seobj.h b/drivers/target/target_core_seobj.h
deleted file mode 100644
index 4fbf4e7..0000000
--- a/drivers/target/target_core_seobj.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Filename: target_core_seobj.h
- *
- * Copyright (c) 2006-2007 SBE, Inc. All Rights Reserved.
- * Copyright (c) 2007-2009 Rising Tide Software, Inc.
- * Copyright (c) 2008-2009 Linux-iSCSI.org
- *
- * Nicholas A. Bellinger <nab@xxxxxxxxxx>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- ******************************************************************************/
-
-
-#ifndef TARGET_CORE_SEOBJ_H
-#define TARGET_CORE_SEOBJ_H
-
-typedef int (*map_func_t)(struct se_task *, u32);
-
-extern int dev_obj_export(void *, struct se_portal_group *, struct se_lun *);
-extern void dev_obj_unexport(void *, struct se_portal_group *, struct se_lun *);
-extern int dev_obj_max_sectors(void *);
-extern unsigned long long dev_obj_end_lba(void *);
-extern int dev_obj_do_se_mem_map(void *, struct se_task *, struct list_head *,
- void *, struct se_mem *, struct se_mem **,
- u32 *, u32 *);
-extern int dev_obj_get_mem_buf(void *, struct se_cmd *);
-extern int dev_obj_get_mem_SG(void *, struct se_cmd *);
-extern map_func_t dev_obj_get_map_SG(void *, int);
-extern map_func_t dev_obj_get_map_non_SG(void *, int);
-extern map_func_t dev_obj_get_map_none(void *);
-extern int dev_obj_check_online(void *);
-extern int dev_obj_check_shutdown(void *);
-
-#endif /* TARGET_CORE_SEOBJ_H */
diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c
index 925a486..d273698 100644
--- a/drivers/target/target_core_tpg.c
+++ b/drivers/target/target_core_tpg.c
@@ -45,7 +45,6 @@
#include <target/target_core_fabric_ops.h>

#include "target_core_hba.h"
-#include "target_core_seobj.h"

/* core_clear_initiator_node_from_tpg():
*
@@ -759,7 +758,7 @@ int core_tpg_post_addlun(
void *lun_ptr)
{
lun->lun_type_ptr = lun_ptr;
- if (dev_obj_export(lun_ptr, tpg, lun) < 0) {
+ if (core_dev_export(lun_ptr, tpg, lun) < 0) {
lun->lun_type_ptr = NULL;
return -1;
}
@@ -832,7 +831,7 @@ int core_tpg_post_dellun(

core_tpg_shutdown_lun(tpg, lun);

- dev_obj_unexport(lun->lun_type_ptr, tpg, lun);
+ core_dev_unexport(lun->lun_type_ptr, tpg, lun);

spin_lock(&tpg->tpg_lun_lock);
lun->lun_status = TRANSPORT_LUN_STATUS_FREE;
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 8e9a2b9..1e5bd70 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -57,7 +57,6 @@
#include "target_core_hba.h"
#include "target_core_pr.h"
#include "target_core_scdb.h"
-#include "target_core_seobj.h"
#include "target_core_ua.h"

/* #define DEBUG_CDB_HANDLER */
@@ -203,6 +202,9 @@ struct kmem_cache *t10_alua_lu_gp_mem_cache;
struct kmem_cache *t10_alua_tg_pt_gp_cache;
struct kmem_cache *t10_alua_tg_pt_gp_mem_cache;

+/* Used for transport_dev_get_map_*() */
+typedef int (*map_func_t)(struct se_task *, u32);
+
static int transport_generic_write_pending(struct se_cmd *);
static int transport_processing_thread(void *);

@@ -2448,6 +2450,20 @@ static inline void transport_generic_prepare_cdb(
}
}

+static inline u32 transport_dev_max_sectors(struct se_device *dev)
+{
+ /*
+ * Always enforce the underlying max_sectors for TCM/pSCSI
+ */
+ if (TRANSPORT(dev)->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV)
+ return (DEV_ATTRIB(dev)->max_sectors >
+ TRANSPORT(dev)->get_max_sectors(dev) ?
+ TRANSPORT(dev)->get_max_sectors(dev) :
+ DEV_ATTRIB(dev)->max_sectors);
+
+ return DEV_ATTRIB(dev)->max_sectors;
+}
+
/* transport_check_device_cdb_sector_count():
*
* returns:
@@ -2460,9 +2476,9 @@ static inline int transport_check_device_cdb_sector_count(
{
u32 max_sectors;

- max_sectors = dev_obj_max_sectors(se_obj_ptr);
+ max_sectors = transport_dev_max_sectors(se_obj_ptr);
if (!(max_sectors)) {
- printk(KERN_ERR "TRANSPORT->get_max_sectors returned zero!\n");
+ printk(KERN_ERR "transport_dev_max_sectors returned zero!\n");
return 1;
}

@@ -2527,6 +2543,28 @@ static inline int transport_generic_obj_start(
return 0;
}

+static inline map_func_t transport_dev_get_map_SG(
+ struct se_device *dev,
+ int rw)
+{
+ return (rw == SE_DIRECTION_WRITE) ? dev->transport->cdb_write_SG :
+ dev->transport->cdb_read_SG;
+}
+
+static inline map_func_t transport_dev_get_map_non_SG(
+ struct se_device *dev,
+ int rw)
+{
+ return (rw == SE_DIRECTION_WRITE) ? dev->transport->cdb_write_non_SG :
+ dev->transport->cdb_read_non_SG;
+}
+
+static inline map_func_t transport_dev_get_map_none(
+ struct se_device *dev)
+{
+ return dev->transport->cdb_none;
+}
+
static int transport_process_data_sg_transform(
struct se_cmd *cmd,
struct se_transform_info *ti)
@@ -2537,6 +2575,10 @@ static int transport_process_data_sg_transform(
return 0;
}

+static int transport_do_se_mem_map(struct se_device *, struct se_task *,
+ struct list_head *, void *, struct se_mem *, struct se_mem **,
+ u32 *, u32 *);
+
/* transport_process_control_sg_transform():
*
*
@@ -2564,7 +2606,7 @@ static int transport_process_control_sg_transform(
if (!(task))
return -1;

- task->transport_map_task = dev_obj_get_map_SG(ti->se_obj_ptr,
+ task->transport_map_task = transport_dev_get_map_SG(ti->se_obj_ptr,
cmd->data_direction);

cdb = TRANSPORT(dev)->get_cdb(task);
@@ -2577,7 +2619,7 @@ static int transport_process_control_sg_transform(
atomic_inc(&T_TASK(cmd)->t_fe_count);
atomic_inc(&T_TASK(cmd)->t_se_count);

- ret = dev_obj_do_se_mem_map(ti->se_obj_ptr, task,
+ ret = transport_do_se_mem_map(ti->se_obj_ptr, task,
T_TASK(cmd)->t_mem_list, NULL, se_mem, &se_mem_lout,
&se_mem_cnt, &task_offset);
if (ret < 0)
@@ -2604,7 +2646,7 @@ static int transport_process_control_nonsg_transform(
if (!(task))
return -1;

- task->transport_map_task = dev_obj_get_map_non_SG(ti->se_obj_ptr,
+ task->transport_map_task = transport_dev_get_map_non_SG(ti->se_obj_ptr,
cmd->data_direction);

cdb = TRANSPORT(dev)->get_cdb(task);
@@ -2638,7 +2680,7 @@ static int transport_process_non_data_transform(
if (!(task))
return -1;

- task->transport_map_task = dev_obj_get_map_none(ti->se_obj_ptr);
+ task->transport_map_task = transport_dev_get_map_none(ti->se_obj_ptr);

cdb = TRANSPORT(dev)->get_cdb(task);
if (cdb)
@@ -4007,7 +4049,7 @@ int transport_execute_tasks(struct se_cmd *cmd)
int add_tasks;

if (!(cmd->se_cmd_flags & SCF_SE_DISABLE_ONLINE_CHECK)) {
- if (dev_obj_check_online(cmd->se_orig_obj_ptr) != 0) {
+ if (se_dev_check_online(cmd->se_orig_obj_ptr) != 0) {
cmd->transport_error_status =
PYX_TRANSPORT_LU_COMM_FAILURE;
transport_generic_request_failure(cmd, NULL, 0, 1);
@@ -5110,6 +5152,26 @@ int transport_get_sense_data(struct se_cmd *cmd)
return -1;
}

+static inline void transport_dev_get_mem_buf(
+ struct se_device *dev,
+ struct se_cmd *cmd)
+{
+ cmd->transport_allocate_resources = (TRANSPORT(dev)->allocate_buf) ?
+ TRANSPORT(dev)->allocate_buf : &transport_generic_allocate_buf;
+ cmd->transport_free_resources = (TRANSPORT(dev)->free_buf) ?
+ TRANSPORT(dev)->free_buf : NULL;
+}
+
+static inline void transport_dev_get_mem_SG(
+ struct se_device *dev,
+ struct se_cmd *cmd)
+{
+ cmd->transport_allocate_resources = (TRANSPORT(dev)->allocate_DMA) ?
+ TRANSPORT(dev)->allocate_DMA : &transport_generic_get_mem;
+ cmd->transport_free_resources = (TRANSPORT(dev)->free_DMA) ?
+ TRANSPORT(dev)->free_DMA : NULL;
+}
+
/*
* Generic function pointers for target_core_mod/ConfigFS
*/
@@ -5198,7 +5260,7 @@ static int transport_generic_cmd_sequencer(
if (sector_ret)
return TGCS_UNSUPPORTED_CDB;
size = transport_get_size(sectors, cdb, cmd);
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
cmd->transport_split_cdb = &split_cdb_XX_6;
cmd->transport_get_lba = &transport_lba_21;
@@ -5210,7 +5272,7 @@ static int transport_generic_cmd_sequencer(
if (sector_ret)
return TGCS_UNSUPPORTED_CDB;
size = transport_get_size(sectors, cdb, cmd);
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
cmd->transport_split_cdb = &split_cdb_XX_10;
cmd->transport_get_lba = &transport_lba_32;
@@ -5222,7 +5284,7 @@ static int transport_generic_cmd_sequencer(
if (sector_ret)
return TGCS_UNSUPPORTED_CDB;
size = transport_get_size(sectors, cdb, cmd);
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
cmd->transport_split_cdb = &split_cdb_XX_12;
cmd->transport_get_lba = &transport_lba_32;
@@ -5234,7 +5296,7 @@ static int transport_generic_cmd_sequencer(
if (sector_ret)
return TGCS_UNSUPPORTED_CDB;
size = transport_get_size(sectors, cdb, cmd);
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
cmd->transport_split_cdb = &split_cdb_XX_16;
cmd->transport_get_long_lba = &transport_lba_64;
@@ -5246,7 +5308,7 @@ static int transport_generic_cmd_sequencer(
if (sector_ret)
return TGCS_UNSUPPORTED_CDB;
size = transport_get_size(sectors, cdb, cmd);
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
cmd->transport_split_cdb = &split_cdb_XX_6;
cmd->transport_get_lba = &transport_lba_21;
@@ -5258,7 +5320,7 @@ static int transport_generic_cmd_sequencer(
if (sector_ret)
return TGCS_UNSUPPORTED_CDB;
size = transport_get_size(sectors, cdb, cmd);
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
cmd->transport_split_cdb = &split_cdb_XX_10;
cmd->transport_get_lba = &transport_lba_32;
@@ -5270,7 +5332,7 @@ static int transport_generic_cmd_sequencer(
if (sector_ret)
return TGCS_UNSUPPORTED_CDB;
size = transport_get_size(sectors, cdb, cmd);
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
cmd->transport_split_cdb = &split_cdb_XX_12;
cmd->transport_get_lba = &transport_lba_32;
@@ -5282,7 +5344,7 @@ static int transport_generic_cmd_sequencer(
if (sector_ret)
return TGCS_UNSUPPORTED_CDB;
size = transport_get_size(sectors, cdb, cmd);
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
cmd->transport_split_cdb = &split_cdb_XX_16;
cmd->transport_get_long_lba = &transport_lba_64;
@@ -5308,28 +5370,28 @@ static int transport_generic_cmd_sequencer(
/* GPCMD_SEND_KEY from multi media commands */
size = (cdb[8] << 8) + cdb[9];
}
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
case MODE_SELECT:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = cdb[4];
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_SG_IO_CDB;
break;
case MODE_SELECT_10:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = (cdb[7] << 8) + cdb[8];
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_SG_IO_CDB;
break;
case MODE_SENSE:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = cdb[4];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
@@ -5340,14 +5402,14 @@ static int transport_generic_cmd_sequencer(
case LOG_SENSE:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = (cdb[7] << 8) + cdb[8];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
case READ_BLOCK_LIMITS:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = READ_BLOCK_LEN;
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
@@ -5357,7 +5419,7 @@ static int transport_generic_cmd_sequencer(
case GPCMD_READ_TRACK_RZONE_INFO:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = (cdb[7] << 8) + cdb[8];
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_SG_IO_CDB;
break;
@@ -5369,7 +5431,7 @@ static int transport_generic_cmd_sequencer(
SPC3_PERSISTENT_RESERVATIONS) ?
&core_scsi3_emulate_pr : NULL;
size = (cdb[7] << 8) + cdb[8];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
@@ -5377,14 +5439,14 @@ static int transport_generic_cmd_sequencer(
case GPCMD_READ_DVD_STRUCTURE:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = (cdb[8] << 8) + cdb[9];
- dev_obj_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_SG(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_SG_IO_CDB;
break;
case READ_POSITION:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = READ_POSITION_LEN;
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
@@ -5409,14 +5471,14 @@ static int transport_generic_cmd_sequencer(
/* GPCMD_REPORT_KEY from multi media commands */
size = (cdb[8] << 8) + cdb[9];
}
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
case INQUIRY:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = (cdb[3] << 8) + cdb[4];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
/*
* Do implict HEAD_OF_QUEUE processing for INQUIRY.
@@ -5429,14 +5491,14 @@ static int transport_generic_cmd_sequencer(
case READ_BUFFER:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
case READ_CAPACITY:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = READ_CAP_LEN;
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
@@ -5445,7 +5507,7 @@ static int transport_generic_cmd_sequencer(
case SECURITY_PROTOCOL_OUT:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
@@ -5459,14 +5521,14 @@ static int transport_generic_cmd_sequencer(
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = (cdb[10] << 24) | (cdb[11] << 16) |
(cdb[12] << 8) | cdb[13];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
case VARIABLE_LENGTH_CMD:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = (cdb[10] << 8) | cdb[11];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
@@ -5474,7 +5536,7 @@ static int transport_generic_cmd_sequencer(
case SEND_DIAGNOSTIC:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = (cdb[3] << 8) | cdb[4];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
@@ -5484,7 +5546,7 @@ static int transport_generic_cmd_sequencer(
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
sectors = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
size = (2336 * sectors);
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
@@ -5492,28 +5554,28 @@ static int transport_generic_cmd_sequencer(
case READ_TOC:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = cdb[8];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
case REQUEST_SENSE:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = cdb[4];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
case READ_ELEMENT_STATUS:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = 65536 * cdb[7] + 256 * cdb[8] + cdb[9];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
case WRITE_BUFFER:
SET_GENERIC_TRANSPORT_FUNCTIONS(cmd);
size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
ret = TGCS_CONTROL_NONSG_IO_CDB;
break;
@@ -5592,7 +5654,7 @@ static int transport_generic_cmd_sequencer(
cmd->transport_emulate_cdb =
&transport_core_report_lun_response;
size = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
- dev_obj_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
+ transport_dev_get_mem_buf(cmd->se_orig_obj_ptr, cmd);
transport_get_maps(cmd);
/*
* Do implict HEAD_OF_QUEUE processing for REPORT_LUNS
@@ -5695,8 +5757,8 @@ struct se_cmd *transport_allocate_passthrough(
/*
* Double check that the passed object is currently accepting CDBs
*/
- if (dev_obj_check_online(type_ptr) != 0) {
- DEBUG_SO("dev_obj_check_online() failed!\n");
+ if (se_dev_check_online(type_ptr) != 0) {
+ DEBUG_SO("se_dev_check_online() failed!\n");
goto fail;
}

@@ -5794,7 +5856,7 @@ EXPORT_SYMBOL(transport_passthrough_release);
int transport_passthrough_complete(
struct se_cmd *cmd)
{
- if (dev_obj_check_shutdown(cmd->se_orig_obj_ptr) != 0)
+ if (se_dev_check_shutdown(cmd->se_orig_obj_ptr) != 0)
return -2;

switch (cmd->scsi_status) {
@@ -6381,6 +6443,11 @@ int transport_generic_do_transform(struct se_cmd *cmd, struct se_transform_info
return 0;
}

+static inline long long transport_dev_end_lba(struct se_device *dev)
+{
+ return dev->dev_sectors_total + 1;
+}
+
int transport_get_sectors(
struct se_cmd *cmd,
void *obj_ptr)
@@ -6399,11 +6466,11 @@ int transport_get_sectors(
return 0;

if ((T_TASK(cmd)->t_task_lba + T_TASK(cmd)->t_task_sectors) >
- dev_obj_end_lba(obj_ptr)) {
+ transport_dev_end_lba(obj_ptr)) {
printk(KERN_ERR "LBA: %llu Sectors: %u exceeds"
- " dev_obj_end_lba(): %llu\n",
+ " transport_dev_end_lba(): %llu\n",
T_TASK(cmd)->t_task_lba, T_TASK(cmd)->t_task_sectors,
- dev_obj_end_lba(obj_ptr));
+ transport_dev_end_lba(obj_ptr));
cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
cmd->scsi_sense_reason = SECTOR_COUNT_TOO_MANY;
return PYX_TRANSPORT_REQ_TOO_MANY_SECTORS;
@@ -6630,16 +6697,16 @@ static inline int transport_set_task_sectors_disk(
u32 sectors,
int *max_sectors_set)
{
- if ((lba + sectors) > dev_obj_end_lba(obj_ptr)) {
- task->task_sectors = ((dev_obj_end_lba(obj_ptr) - lba) + 1);
+ if ((lba + sectors) > transport_dev_end_lba(obj_ptr)) {
+ task->task_sectors = ((transport_dev_end_lba(obj_ptr) - lba) + 1);

- if (task->task_sectors > dev_obj_max_sectors(obj_ptr)) {
- task->task_sectors = dev_obj_max_sectors(obj_ptr);
+ if (task->task_sectors > transport_dev_max_sectors(obj_ptr)) {
+ task->task_sectors = transport_dev_max_sectors(obj_ptr);
*max_sectors_set = 1;
}
} else {
- if (sectors > dev_obj_max_sectors(obj_ptr)) {
- task->task_sectors = dev_obj_max_sectors(obj_ptr);
+ if (sectors > transport_dev_max_sectors(obj_ptr)) {
+ task->task_sectors = transport_dev_max_sectors(obj_ptr);
*max_sectors_set = 1;
} else
task->task_sectors = sectors;
@@ -6655,8 +6722,8 @@ static inline int transport_set_task_sectors_non_disk(
u32 sectors,
int *max_sectors_set)
{
- if (sectors > dev_obj_max_sectors(obj_ptr)) {
- task->task_sectors = dev_obj_max_sectors(obj_ptr);
+ if (sectors > transport_dev_max_sectors(obj_ptr)) {
+ task->task_sectors = transport_dev_max_sectors(obj_ptr);
*max_sectors_set = 1;
} else
task->task_sectors = sectors;
@@ -6843,6 +6910,45 @@ next:
return 0;
}

+static int transport_do_se_mem_map(
+ struct se_device *dev,
+ struct se_task *task,
+ struct list_head *se_mem_list,
+ void *in_mem,
+ struct se_mem *in_se_mem,
+ struct se_mem **out_se_mem,
+ u32 *se_mem_cnt,
+ u32 *task_offset_in)
+{
+ u32 task_offset = *task_offset_in;
+ int ret = 0;
+ /*
+ * se_subsystem_api_t->do_se_mem_map is used when internal allocation
+ * has been done by the transport plugin.
+ */
+ if (TRANSPORT(dev)->do_se_mem_map) {
+ ret = TRANSPORT(dev)->do_se_mem_map(task, se_mem_list,
+ in_mem, in_se_mem, out_se_mem, se_mem_cnt,
+ task_offset_in);
+ if (ret == 0)
+ T_TASK(task->task_se_cmd)->t_task_se_num += *se_mem_cnt;
+
+ return ret;
+ }
+ /*
+ * Assume default that transport plugin speaks preallocated
+ * scatterlists.
+ */
+ if (!(transport_calc_sg_num(task, in_se_mem, task_offset)))
+ return -1;
+ /*
+ * struct se_task->task_sg now contains the struct scatterlist array.
+ */
+ return transport_map_mem_to_sg(task, se_mem_list, task->task_sg,
+ in_se_mem, out_se_mem, se_mem_cnt,
+ task_offset_in);
+}
+
u32 transport_generic_get_cdb_count(
struct se_cmd *cmd,
struct se_transform_info *ti,
@@ -6890,7 +6996,7 @@ u32 transport_generic_get_cdb_count(

DEBUG_VOL("ITT[0x%08x] LBA(%llu) SectorsLeft(%u) EOBJ(%llu)\n",
CMD_TFO(cmd)->get_task_tag(cmd), lba, sectors,
- dev_obj_end_lba(obj_ptr));
+ transport_dev_end_lba(obj_ptr));

task = cmd->transport_get_task(ti, cmd, obj_ptr);
if (!(task))
@@ -6904,8 +7010,8 @@ u32 transport_generic_get_cdb_count(
sectors -= task->task_sectors;
task->task_size = (task->task_sectors *
DEV_ATTRIB(dev)->block_size);
- task->transport_map_task = dev_obj_get_map_SG(
- obj_ptr, cmd->data_direction);
+ task->transport_map_task = transport_dev_get_map_SG(obj_ptr,
+ cmd->data_direction);

cdb = TRANSPORT(dev)->get_cdb(task);
if ((cdb)) {
@@ -6918,7 +7024,7 @@ u32 transport_generic_get_cdb_count(
* Perform the SE OBJ plugin and/or Transport plugin specific
* mapping for T_TASK(cmd)->t_mem_list.
*/
- ret = dev_obj_do_se_mem_map(obj_ptr, task,
+ ret = transport_do_se_mem_map((struct se_device *)obj_ptr, task,
T_TASK(cmd)->t_mem_list, NULL, se_mem,
&se_mem_lout, &se_mem_cnt, &task_offset_in);
if (ret < 0)
diff --git a/include/target/target_core_device.h b/include/target/target_core_device.h
index aebfb4e..e895604 100644
--- a/include/target/target_core_device.h
+++ b/include/target/target_core_device.h
@@ -51,6 +51,10 @@ extern struct se_port *core_alloc_port(struct se_device *);
extern void core_export_port(struct se_device *, struct se_portal_group *,
struct se_port *, struct se_lun *);
extern void core_release_port(struct se_device *, struct se_port *);
+extern int core_dev_export(struct se_device *, struct se_portal_group *,
+ struct se_lun *);
+extern void core_dev_unexport(struct se_device *, struct se_portal_group *,
+ struct se_lun *);
extern int transport_core_report_lun_response(struct se_cmd *);
extern void se_release_device_for_hba(struct se_device *);
extern void se_release_vpd_for_dev(struct se_device *);
@@ -58,6 +62,8 @@ extern void se_clear_dev_ports(struct se_device *);
extern int se_free_virtual_device(struct se_device *, struct se_hba *);
extern void se_dev_start(struct se_device *);
extern void se_dev_stop(struct se_device *);
+extern int se_dev_check_online(struct se_device *);
+extern int se_dev_check_shutdown(struct se_device *);
extern void se_dev_set_default_attribs(struct se_device *);
extern int se_dev_set_task_timeout(struct se_device *, u32);
extern int se_dev_set_emulate_ua_intlck_ctrl(struct se_device *, int);
--
1.5.6.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/