57 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // 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);
 | 
