linux/drivers/target/iscsi/iscsi_target_transport.c
<<
>>
Prefs
   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);
  55