iscsi_target_transport.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. static LIST_HEAD(g_transport_list);
  7. static DEFINE_MUTEX(transport_mutex);
  8. struct iscsit_transport *iscsit_get_transport(int type)
  9. {
  10. struct iscsit_transport *t;
  11. mutex_lock(&transport_mutex);
  12. list_for_each_entry(t, &g_transport_list, t_node) {
  13. if (t->transport_type == type) {
  14. if (t->owner && !try_module_get(t->owner)) {
  15. t = NULL;
  16. }
  17. mutex_unlock(&transport_mutex);
  18. return t;
  19. }
  20. }
  21. mutex_unlock(&transport_mutex);
  22. return NULL;
  23. }
  24. void iscsit_put_transport(struct iscsit_transport *t)
  25. {
  26. module_put(t->owner);
  27. }
  28. void iscsit_register_transport(struct iscsit_transport *t)
  29. {
  30. INIT_LIST_HEAD(&t->t_node);
  31. mutex_lock(&transport_mutex);
  32. list_add_tail(&t->t_node, &g_transport_list);
  33. mutex_unlock(&transport_mutex);
  34. pr_debug("Registered iSCSI transport: %s\n", t->name);
  35. }
  36. EXPORT_SYMBOL(iscsit_register_transport);
  37. void iscsit_unregister_transport(struct iscsit_transport *t)
  38. {
  39. mutex_lock(&transport_mutex);
  40. list_del(&t->t_node);
  41. mutex_unlock(&transport_mutex);
  42. pr_debug("Unregistered iSCSI transport: %s\n", t->name);
  43. }
  44. EXPORT_SYMBOL(iscsit_unregister_transport);