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 Bellinger struct 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 Bellinger void 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 Gurtovoy void 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 Bellinger void 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