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