iscsi_target_transport.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. int 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. return 0;
  36. }
  37. EXPORT_SYMBOL(iscsit_register_transport);
  38. void iscsit_unregister_transport(struct iscsit_transport *t)
  39. {
  40. mutex_lock(&transport_mutex);
  41. list_del(&t->t_node);
  42. mutex_unlock(&transport_mutex);
  43. pr_debug("Unregistered iSCSI transport: %s\n", t->name);
  44. }
  45. EXPORT_SYMBOL(iscsit_unregister_transport);