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