Loading...
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/spinlock.h>
3#include <linux/list.h>
4#include <linux/module.h>
5#include <target/iscsi/iscsi_transport.h>
6
7static LIST_HEAD(g_transport_list);
8static DEFINE_MUTEX(transport_mutex);
9
10struct iscsit_transport *iscsit_get_transport(int type)
11{
12 struct iscsit_transport *t;
13
14 mutex_lock(&transport_mutex);
15 list_for_each_entry(t, &g_transport_list, t_node) {
16 if (t->transport_type == type) {
17 if (t->owner && !try_module_get(t->owner)) {
18 t = NULL;
19 }
20 mutex_unlock(&transport_mutex);
21 return t;
22 }
23 }
24 mutex_unlock(&transport_mutex);
25
26 return NULL;
27}
28
29void iscsit_put_transport(struct iscsit_transport *t)
30{
31 module_put(t->owner);
32}
33
34void iscsit_register_transport(struct iscsit_transport *t)
35{
36 INIT_LIST_HEAD(&t->t_node);
37
38 mutex_lock(&transport_mutex);
39 list_add_tail(&t->t_node, &g_transport_list);
40 mutex_unlock(&transport_mutex);
41
42 pr_debug("Registered iSCSI transport: %s\n", t->name);
43}
44EXPORT_SYMBOL(iscsit_register_transport);
45
46void 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}
54EXPORT_SYMBOL(iscsit_unregister_transport);
1#include <linux/spinlock.h>
2#include <linux/list.h>
3#include <target/iscsi/iscsi_transport.h>
4
5static LIST_HEAD(g_transport_list);
6static DEFINE_MUTEX(transport_mutex);
7
8struct 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
27void iscsit_put_transport(struct iscsit_transport *t)
28{
29 module_put(t->owner);
30}
31
32int 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}
44EXPORT_SYMBOL(iscsit_register_transport);
45
46void 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}
54EXPORT_SYMBOL(iscsit_unregister_transport);