Commit | Line | Data |
---|---|---|
3f993063 NB |
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 | { | |
2ed37f6c | 29 | module_put(t->owner); |
3f993063 NB |
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); |