iscsi_target_transport.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include <linux/spinlock.h>
  2. #include <linux/list.h>
  3. #include <linux/module.h>
  4. #include <target/iscsi/iscsi_transport.h>
  5. static LIST_HEAD(g_transport_list);
  6. static DEFINE_MUTEX(transport_mutex);
  7. struct iscsit_transport *iscsit_get_transport(int type)
  8. {
  9. struct iscsit_transport *t;
  10. mutex_lock(&transport_mutex);
  11. list_for_each_entry(t, &g_transport_list, t_node) {
  12. if (t->transport_type == type) {
  13. if (t->owner && !try_module_get(t->owner)) {
  14. t = NULL;
  15. }
  16. mutex_unlock(&transport_mutex);
  17. return t;
  18. }
  19. }
  20. mutex_unlock(&transport_mutex);
  21. return NULL;
  22. }
  23. void iscsit_put_transport(struct iscsit_transport *t)
  24. {
  25. module_put(t->owner);
  26. }
  27. int iscsit_register_transport(struct iscsit_transport *t)
  28. {
  29. INIT_LIST_HEAD(&t->t_node);
  30. mutex_lock(&transport_mutex);
  31. list_add_tail(&t->t_node, &g_transport_list);
  32. mutex_unlock(&transport_mutex);
  33. pr_debug("Registered iSCSI transport: %s\n", t->name);
  34. return 0;
  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);