| // SPDX-License-Identifier: GPL-2.0 |
| #include <linux/spinlock.h> |
| #include <linux/list.h> |
| #include <linux/module.h> |
| #include <target/iscsi/iscsi_transport.h> |
| |
| static LIST_HEAD(g_transport_list); |
| static DEFINE_MUTEX(transport_mutex); |
| |
| struct iscsit_transport *iscsit_get_transport(int type) |
| { |
| struct iscsit_transport *t; |
| |
| mutex_lock(&transport_mutex); |
| list_for_each_entry(t, &g_transport_list, t_node) { |
| if (t->transport_type == type) { |
| if (t->owner && !try_module_get(t->owner)) { |
| t = NULL; |
| } |
| mutex_unlock(&transport_mutex); |
| return t; |
| } |
| } |
| mutex_unlock(&transport_mutex); |
| |
| return NULL; |
| } |
| |
| void iscsit_put_transport(struct iscsit_transport *t) |
| { |
| module_put(t->owner); |
| } |
| |
| int iscsit_register_transport(struct iscsit_transport *t) |
| { |
| INIT_LIST_HEAD(&t->t_node); |
| |
| mutex_lock(&transport_mutex); |
| list_add_tail(&t->t_node, &g_transport_list); |
| mutex_unlock(&transport_mutex); |
| |
| pr_debug("Registered iSCSI transport: %s\n", t->name); |
| |
| return 0; |
| } |
| EXPORT_SYMBOL(iscsit_register_transport); |
| |
| void iscsit_unregister_transport(struct iscsit_transport *t) |
| { |
| mutex_lock(&transport_mutex); |
| list_del(&t->t_node); |
| mutex_unlock(&transport_mutex); |
| |
| pr_debug("Unregistered iSCSI transport: %s\n", t->name); |
| } |
| EXPORT_SYMBOL(iscsit_unregister_transport); |