iscsi_target_transport.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include <linux/spinlock.h>
  2. #include <linux/list.h>
  3. #include <target/iscsi/iscsi_transport.h>
  4. static LIST_HEAD(g_transport_list);
  5. static DEFINE_MUTEX(transport_mutex);
  6. struct iscsit_transport *iscsit_get_transport(int type)
  7. {
  8. struct iscsit_transport *t;
  9. mutex_lock(&transport_mutex);
  10. list_for_each_entry(t, &g_transport_list, t_node) {
  11. if (t->transport_type == type) {
  12. if (t->owner && !try_module_get(t->owner)) {
  13. t = NULL;
  14. }
  15. mutex_unlock(&transport_mutex);
  16. return t;
  17. }
  18. }
  19. mutex_unlock(&transport_mutex);
  20. return NULL;
  21. }
  22. void iscsit_put_transport(struct iscsit_transport *t)
  23. {
  24. if (t->owner)
  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);