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