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