aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/iscsi/iscsi_target.c
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2013-03-07 00:54:13 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2013-04-25 04:05:26 -0400
commitbaa4d64b147a4064626f6597646ae8a330d9e2ed (patch)
tree5d017ffcfc1372d112f3f54ccd8621f703c91f25 /drivers/target/iscsi/iscsi_target.c
parent3f99306337ba1871afc8568e8b36004ce3cee039 (diff)
iscsi-target: Initial traditional TCP conversion to iscsit_transport
This patch performs the initial conversion of existing traditional iscsi to use iscsit_transport API callers. This includes: - iscsi-np cleanups for iscsit_transport_type - Add iscsi-np transport calls w/ ->iscsit_setup_up() and ->iscsit_free_np() - Convert login thread process context to use ->iscsit_accept_np() for connections with pre-allocated struct iscsi_conn - Convert existing socket accept code to iscsit_accept_np() - Convert login RX/TX callers to use ->iscsit_get_login_rx() and ->iscsit_put_login_tx() to exchange request/response PDUs - Convert existing socket login RX/TX calls into iscsit_get_login_rx() and iscsit_put_login_tx() - Change iscsit_close_connection() to invoke ->iscsit_free_conn() + iscsit_put_transport() calls. - Add iscsit_register_transport() + iscsit_unregister_transport() calls to module init/exit v4 changes: - Add missing iscsit_put_transport() call in iscsi_target_setup_login_socket() failure case v2 changes: - Update module init/exit to use register_transport() + unregister_transport() Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/iscsi/iscsi_target.c')
-rw-r--r--drivers/target/iscsi/iscsi_target.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index 7ea246a07731..8203bf3de848 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -49,6 +49,8 @@
49#include "iscsi_target_device.h" 49#include "iscsi_target_device.h"
50#include "iscsi_target_stat.h" 50#include "iscsi_target_stat.h"
51 51
52#include <target/iscsi/iscsi_transport.h>
53
52static LIST_HEAD(g_tiqn_list); 54static LIST_HEAD(g_tiqn_list);
53static LIST_HEAD(g_np_list); 55static LIST_HEAD(g_np_list);
54static DEFINE_SPINLOCK(tiqn_lock); 56static DEFINE_SPINLOCK(tiqn_lock);
@@ -401,8 +403,7 @@ struct iscsi_np *iscsit_add_np(
401 spin_unlock_bh(&np_lock); 403 spin_unlock_bh(&np_lock);
402 404
403 pr_debug("CORE[0] - Added Network Portal: %s:%hu on %s\n", 405 pr_debug("CORE[0] - Added Network Portal: %s:%hu on %s\n",
404 np->np_ip, np->np_port, (np->np_network_transport == ISCSI_TCP) ? 406 np->np_ip, np->np_port, np->np_transport->name);
405 "TCP" : "SCTP");
406 407
407 return np; 408 return np;
408} 409}
@@ -441,11 +442,10 @@ int iscsit_reset_np_thread(
441 return 0; 442 return 0;
442} 443}
443 444
444static int iscsit_del_np_comm(struct iscsi_np *np) 445static void iscsit_free_np(struct iscsi_np *np)
445{ 446{
446 if (np->np_socket) 447 if (np->np_socket)
447 sock_release(np->np_socket); 448 sock_release(np->np_socket);
448 return 0;
449} 449}
450 450
451int iscsit_del_np(struct iscsi_np *np) 451int iscsit_del_np(struct iscsi_np *np)
@@ -467,20 +467,32 @@ int iscsit_del_np(struct iscsi_np *np)
467 send_sig(SIGINT, np->np_thread, 1); 467 send_sig(SIGINT, np->np_thread, 1);
468 kthread_stop(np->np_thread); 468 kthread_stop(np->np_thread);
469 } 469 }
470 iscsit_del_np_comm(np); 470
471 np->np_transport->iscsit_free_np(np);
471 472
472 spin_lock_bh(&np_lock); 473 spin_lock_bh(&np_lock);
473 list_del(&np->np_list); 474 list_del(&np->np_list);
474 spin_unlock_bh(&np_lock); 475 spin_unlock_bh(&np_lock);
475 476
476 pr_debug("CORE[0] - Removed Network Portal: %s:%hu on %s\n", 477 pr_debug("CORE[0] - Removed Network Portal: %s:%hu on %s\n",
477 np->np_ip, np->np_port, (np->np_network_transport == ISCSI_TCP) ? 478 np->np_ip, np->np_port, np->np_transport->name);
478 "TCP" : "SCTP");
479 479
480 iscsit_put_transport(np->np_transport);
480 kfree(np); 481 kfree(np);
481 return 0; 482 return 0;
482} 483}
483 484
485static struct iscsit_transport iscsi_target_transport = {
486 .name = "iSCSI/TCP",
487 .transport_type = ISCSI_TCP,
488 .owner = NULL,
489 .iscsit_setup_np = iscsit_setup_np,
490 .iscsit_accept_np = iscsit_accept_np,
491 .iscsit_free_np = iscsit_free_np,
492 .iscsit_get_login_rx = iscsit_get_login_rx,
493 .iscsit_put_login_tx = iscsit_put_login_tx,
494};
495
484static int __init iscsi_target_init_module(void) 496static int __init iscsi_target_init_module(void)
485{ 497{
486 int ret = 0; 498 int ret = 0;
@@ -557,6 +569,8 @@ static int __init iscsi_target_init_module(void)
557 goto ooo_out; 569 goto ooo_out;
558 } 570 }
559 571
572 iscsit_register_transport(&iscsi_target_transport);
573
560 if (iscsit_load_discovery_tpg() < 0) 574 if (iscsit_load_discovery_tpg() < 0)
561 goto r2t_out; 575 goto r2t_out;
562 576
@@ -587,6 +601,7 @@ static void __exit iscsi_target_cleanup_module(void)
587 iscsi_deallocate_thread_sets(); 601 iscsi_deallocate_thread_sets();
588 iscsi_thread_set_free(); 602 iscsi_thread_set_free();
589 iscsit_release_discovery_tpg(); 603 iscsit_release_discovery_tpg();
604 iscsit_unregister_transport(&iscsi_target_transport);
590 kmem_cache_destroy(lio_cmd_cache); 605 kmem_cache_destroy(lio_cmd_cache);
591 kmem_cache_destroy(lio_qr_cache); 606 kmem_cache_destroy(lio_qr_cache);
592 kmem_cache_destroy(lio_dr_cache); 607 kmem_cache_destroy(lio_dr_cache);
@@ -4053,6 +4068,12 @@ int iscsit_close_connection(
4053 4068
4054 if (conn->sock) 4069 if (conn->sock)
4055 sock_release(conn->sock); 4070 sock_release(conn->sock);
4071
4072 if (conn->conn_transport->iscsit_free_conn)
4073 conn->conn_transport->iscsit_free_conn(conn);
4074
4075 iscsit_put_transport(conn->conn_transport);
4076
4056 conn->thread_set = NULL; 4077 conn->thread_set = NULL;
4057 4078
4058 pr_debug("Moving to TARG_CONN_STATE_FREE.\n"); 4079 pr_debug("Moving to TARG_CONN_STATE_FREE.\n");