1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 23f993063SNicholas Bellinger #include <linux/spinlock.h> 33f993063SNicholas Bellinger #include <linux/list.h> 48dcf07beSBart Van Assche #include <linux/module.h> 53f993063SNicholas Bellinger #include <target/iscsi/iscsi_transport.h> 63f993063SNicholas Bellinger 73f993063SNicholas Bellinger static LIST_HEAD(g_transport_list); 83f993063SNicholas Bellinger static DEFINE_MUTEX(transport_mutex); 93f993063SNicholas Bellinger iscsit_get_transport(int type)103f993063SNicholas Bellingerstruct iscsit_transport *iscsit_get_transport(int type) 113f993063SNicholas Bellinger { 123f993063SNicholas Bellinger struct iscsit_transport *t; 133f993063SNicholas Bellinger 143f993063SNicholas Bellinger mutex_lock(&transport_mutex); 153f993063SNicholas Bellinger list_for_each_entry(t, &g_transport_list, t_node) { 163f993063SNicholas Bellinger if (t->transport_type == type) { 173f993063SNicholas Bellinger if (t->owner && !try_module_get(t->owner)) { 183f993063SNicholas Bellinger t = NULL; 193f993063SNicholas Bellinger } 203f993063SNicholas Bellinger mutex_unlock(&transport_mutex); 213f993063SNicholas Bellinger return t; 223f993063SNicholas Bellinger } 233f993063SNicholas Bellinger } 243f993063SNicholas Bellinger mutex_unlock(&transport_mutex); 253f993063SNicholas Bellinger 263f993063SNicholas Bellinger return NULL; 273f993063SNicholas Bellinger } 283f993063SNicholas Bellinger iscsit_put_transport(struct iscsit_transport * t)293f993063SNicholas Bellingervoid iscsit_put_transport(struct iscsit_transport *t) 303f993063SNicholas Bellinger { 313f993063SNicholas Bellinger module_put(t->owner); 323f993063SNicholas Bellinger } 333f993063SNicholas Bellinger iscsit_register_transport(struct iscsit_transport * t)34a8ac7835SMax Gurtovoyvoid iscsit_register_transport(struct iscsit_transport *t) 353f993063SNicholas Bellinger { 363f993063SNicholas Bellinger INIT_LIST_HEAD(&t->t_node); 373f993063SNicholas Bellinger 383f993063SNicholas Bellinger mutex_lock(&transport_mutex); 393f993063SNicholas Bellinger list_add_tail(&t->t_node, &g_transport_list); 403f993063SNicholas Bellinger mutex_unlock(&transport_mutex); 413f993063SNicholas Bellinger 423f993063SNicholas Bellinger pr_debug("Registered iSCSI transport: %s\n", t->name); 433f993063SNicholas Bellinger } 443f993063SNicholas Bellinger EXPORT_SYMBOL(iscsit_register_transport); 453f993063SNicholas Bellinger iscsit_unregister_transport(struct iscsit_transport * t)463f993063SNicholas Bellingervoid iscsit_unregister_transport(struct iscsit_transport *t) 473f993063SNicholas Bellinger { 483f993063SNicholas Bellinger mutex_lock(&transport_mutex); 493f993063SNicholas Bellinger list_del(&t->t_node); 503f993063SNicholas Bellinger mutex_unlock(&transport_mutex); 513f993063SNicholas Bellinger 523f993063SNicholas Bellinger pr_debug("Unregistered iSCSI transport: %s\n", t->name); 533f993063SNicholas Bellinger } 543f993063SNicholas Bellinger EXPORT_SYMBOL(iscsit_unregister_transport); 55