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