diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-03-07 00:54:13 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-04-25 04:05:26 -0400 |
commit | baa4d64b147a4064626f6597646ae8a330d9e2ed (patch) | |
tree | 5d017ffcfc1372d112f3f54ccd8621f703c91f25 /drivers/target/iscsi/iscsi_target.c | |
parent | 3f99306337ba1871afc8568e8b36004ce3cee039 (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.c | 35 |
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 | |||
52 | static LIST_HEAD(g_tiqn_list); | 54 | static LIST_HEAD(g_tiqn_list); |
53 | static LIST_HEAD(g_np_list); | 55 | static LIST_HEAD(g_np_list); |
54 | static DEFINE_SPINLOCK(tiqn_lock); | 56 | static 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 | ||
444 | static int iscsit_del_np_comm(struct iscsi_np *np) | 445 | static 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 | ||
451 | int iscsit_del_np(struct iscsi_np *np) | 451 | int 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 | ||
485 | static 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 | |||
484 | static int __init iscsi_target_init_module(void) | 496 | static 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"); |