blob: 40fd28715e59baa0d6be9b84af0a4b9e0a8dc9bd [file] [log] [blame]
#include <linux/spinlock.h>
#include "iscsi_trace_flag.h"
#ifdef INSIDE_KERNEL_TREE
#include <scst/iscsit_transport.h>
#else
#include "iscsit_transport.h"
#endif
#include "iscsi.h"
static LIST_HEAD(transport_list);
static DEFINE_MUTEX(transport_mutex);
static struct iscsit_transport *__iscsit_get_transport(enum iscsit_transport_type type)
{
struct iscsit_transport *t;
list_for_each_entry(t, &transport_list, transport_list_entry) {
if (t->transport_type == type)
return t;
}
return NULL;
}
struct iscsit_transport *iscsit_get_transport(enum iscsit_transport_type type)
{
struct iscsit_transport *t;
mutex_lock(&transport_mutex);
t = __iscsit_get_transport(type);
mutex_unlock(&transport_mutex);
return t;
}
int iscsit_reg_transport(struct iscsit_transport *t)
{
struct iscsit_transport *tmp;
int ret = 0;
INIT_LIST_HEAD(&t->transport_list_entry);
mutex_lock(&transport_mutex);
tmp = __iscsit_get_transport(t->transport_type);
if (tmp) {
PRINT_ERROR("Unable to register transport type %d - Already registered",
t->transport_type);
ret = -EEXIST;
} else {
list_add_tail(&t->transport_list_entry, &transport_list);
PRINT_INFO("Registered iSCSI transport: %s", t->name);
}
mutex_unlock(&transport_mutex);
return ret;
}
EXPORT_SYMBOL(iscsit_reg_transport);
void iscsit_unreg_transport(struct iscsit_transport *t)
{
mutex_lock(&transport_mutex);
list_del(&t->transport_list_entry);
mutex_unlock(&transport_mutex);
PRINT_INFO("Unregistered iSCSI transport: %s", t->name);
}
EXPORT_SYMBOL(iscsit_unreg_transport);