mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
iscsi-target: Add iscsit_transport API template
Add basic struct iscsit_transport API template to allow iscsi-target for running with external transport modules using existing iscsi_target_core.h code. For all external modules, this calls try_module_get() and module_put() to obtain + release an external iscsit_transport module reference count. Also include the iscsi-target symbols necessary in iscsi_transport.h to allow external transport modules to function. v3 changes: - Add iscsit_build_reject export for ISTATE_SEND_REJECT usage v2 changes: - Drop unnecessary export of iscsit_get_transport + iscsit_put_transport (roland) - Add ->iscsit_queue_data_in() to remove extra context switch on RDMA_WRITE - Add ->iscsit_queue_status() to remove extra context switch on IB_SEND status - Add ->iscsit_get_dataout() to remove extra context switch on RDMA_READ - Drop ->iscsit_free_cmd() - Drop ->iscsit_unmap_cmd() - Rename iscsit_create_transport() -> iscsit_register_transport() (andy) - Rename iscsit_destroy_transport() -> iscsit_unregister_transport() (andy) Signed-off-by: Nicholas Bellinger <[email protected]>
This commit is contained in:
parent
20361e69ba
commit
3f99306337
3 changed files with 140 additions and 1 deletions
|
|
@ -15,6 +15,7 @@ iscsi_target_mod-y += iscsi_target_parameters.o \
|
|||
iscsi_target_util.o \
|
||||
iscsi_target.o \
|
||||
iscsi_target_configfs.o \
|
||||
iscsi_target_stat.o
|
||||
iscsi_target_stat.o \
|
||||
iscsi_target_transport.o
|
||||
|
||||
obj-$(CONFIG_ISCSI_TARGET) += iscsi_target_mod.o
|
||||
|
|
|
|||
55
drivers/target/iscsi/iscsi_target_transport.c
Normal file
55
drivers/target/iscsi/iscsi_target_transport.c
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/list.h>
|
||||
#include <target/iscsi/iscsi_transport.h>
|
||||
|
||||
static LIST_HEAD(g_transport_list);
|
||||
static DEFINE_MUTEX(transport_mutex);
|
||||
|
||||
struct iscsit_transport *iscsit_get_transport(int type)
|
||||
{
|
||||
struct iscsit_transport *t;
|
||||
|
||||
mutex_lock(&transport_mutex);
|
||||
list_for_each_entry(t, &g_transport_list, t_node) {
|
||||
if (t->transport_type == type) {
|
||||
if (t->owner && !try_module_get(t->owner)) {
|
||||
t = NULL;
|
||||
}
|
||||
mutex_unlock(&transport_mutex);
|
||||
return t;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&transport_mutex);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void iscsit_put_transport(struct iscsit_transport *t)
|
||||
{
|
||||
if (t->owner)
|
||||
module_put(t->owner);
|
||||
}
|
||||
|
||||
int iscsit_register_transport(struct iscsit_transport *t)
|
||||
{
|
||||
INIT_LIST_HEAD(&t->t_node);
|
||||
|
||||
mutex_lock(&transport_mutex);
|
||||
list_add_tail(&t->t_node, &g_transport_list);
|
||||
mutex_unlock(&transport_mutex);
|
||||
|
||||
pr_debug("Registered iSCSI transport: %s\n", t->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(iscsit_register_transport);
|
||||
|
||||
void iscsit_unregister_transport(struct iscsit_transport *t)
|
||||
{
|
||||
mutex_lock(&transport_mutex);
|
||||
list_del(&t->t_node);
|
||||
mutex_unlock(&transport_mutex);
|
||||
|
||||
pr_debug("Unregistered iSCSI transport: %s\n", t->name);
|
||||
}
|
||||
EXPORT_SYMBOL(iscsit_unregister_transport);
|
||||
Loading…
Reference in a new issue