0001
0002 #include <linux/spinlock.h>
0003 #include <linux/list.h>
0004 #include <linux/module.h>
0005 #include <target/iscsi/iscsi_transport.h>
0006
0007 static LIST_HEAD(g_transport_list);
0008 static DEFINE_MUTEX(transport_mutex);
0009
0010 struct iscsit_transport *iscsit_get_transport(int type)
0011 {
0012 struct iscsit_transport *t;
0013
0014 mutex_lock(&transport_mutex);
0015 list_for_each_entry(t, &g_transport_list, t_node) {
0016 if (t->transport_type == type) {
0017 if (t->owner && !try_module_get(t->owner)) {
0018 t = NULL;
0019 }
0020 mutex_unlock(&transport_mutex);
0021 return t;
0022 }
0023 }
0024 mutex_unlock(&transport_mutex);
0025
0026 return NULL;
0027 }
0028
0029 void iscsit_put_transport(struct iscsit_transport *t)
0030 {
0031 module_put(t->owner);
0032 }
0033
0034 void iscsit_register_transport(struct iscsit_transport *t)
0035 {
0036 INIT_LIST_HEAD(&t->t_node);
0037
0038 mutex_lock(&transport_mutex);
0039 list_add_tail(&t->t_node, &g_transport_list);
0040 mutex_unlock(&transport_mutex);
0041
0042 pr_debug("Registered iSCSI transport: %s\n", t->name);
0043 }
0044 EXPORT_SYMBOL(iscsit_register_transport);
0045
0046 void iscsit_unregister_transport(struct iscsit_transport *t)
0047 {
0048 mutex_lock(&transport_mutex);
0049 list_del(&t->t_node);
0050 mutex_unlock(&transport_mutex);
0051
0052 pr_debug("Unregistered iSCSI transport: %s\n", t->name);
0053 }
0054 EXPORT_SYMBOL(iscsit_unregister_transport);