1 #include <linux/spinlock.h> 2 #include <linux/list.h> 3 #include <target/iscsi/iscsi_transport.h> 4 5 static LIST_HEAD(g_transport_list); 6 static DEFINE_MUTEX(transport_mutex); 7 8 struct iscsit_transport *iscsit_get_transport(int type) 9 { 10 struct iscsit_transport *t; 11 12 mutex_lock(&transport_mutex); 13 list_for_each_entry(t, &g_transport_list, t_node) { 14 if (t->transport_type == type) { 15 if (t->owner && !try_module_get(t->owner)) { 16 t = NULL; 17 } 18 mutex_unlock(&transport_mutex); 19 return t; 20 } 21 } 22 mutex_unlock(&transport_mutex); 23 24 return NULL; 25 } 26 27 void iscsit_put_transport(struct iscsit_transport *t) 28 { 29 module_put(t->owner); 30 } 31 32 int iscsit_register_transport(struct iscsit_transport *t) 33 { 34 INIT_LIST_HEAD(&t->t_node); 35 36 mutex_lock(&transport_mutex); 37 list_add_tail(&t->t_node, &g_transport_list); 38 mutex_unlock(&transport_mutex); 39 40 pr_debug("Registered iSCSI transport: %s\n", t->name); 41 42 return 0; 43 } 44 EXPORT_SYMBOL(iscsit_register_transport); 45 46 void iscsit_unregister_transport(struct iscsit_transport *t) 47 { 48 mutex_lock(&transport_mutex); 49 list_del(&t->t_node); 50 mutex_unlock(&transport_mutex); 51 52 pr_debug("Unregistered iSCSI transport: %s\n", t->name); 53 } 54 EXPORT_SYMBOL(iscsit_unregister_transport); 55