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>
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
#include <scsi/iscsi_proto.h>
|
||||
#include <target/target_core_base.h>
|
||||
#include <target/target_core_fabric.h>
|
||||
#include <target/iscsi/iscsi_transport.h>
|
||||
|
||||
#include "iscsi_target_core.h"
|
||||
#include "iscsi_target_parameters.h"
|
||||
@@ -169,7 +170,7 @@ static void iscsi_remove_failed_auth_entry(struct iscsi_conn *conn)
|
||||
kfree(conn->auth_protocol);
|
||||
}
|
||||
|
||||
static int iscsi_target_check_login_request(
|
||||
int iscsi_target_check_login_request(
|
||||
struct iscsi_conn *conn,
|
||||
struct iscsi_login *login)
|
||||
{
|
||||
@@ -352,11 +353,8 @@ static int iscsi_target_do_tx_login_io(struct iscsi_conn *conn, struct iscsi_log
|
||||
|
||||
padding = ((-login->rsp_length) & 3);
|
||||
|
||||
if (iscsi_login_tx_data(
|
||||
conn,
|
||||
login->rsp,
|
||||
login->rsp_buf,
|
||||
login->rsp_length + padding) < 0)
|
||||
if (conn->conn_transport->iscsit_put_login_tx(conn, login,
|
||||
login->rsp_length + padding) < 0)
|
||||
return -1;
|
||||
|
||||
login->rsp_length = 0;
|
||||
@@ -368,72 +366,12 @@ static int iscsi_target_do_tx_login_io(struct iscsi_conn *conn, struct iscsi_log
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iscsi_target_do_rx_login_io(struct iscsi_conn *conn, struct iscsi_login *login)
|
||||
{
|
||||
u32 padding = 0, payload_length;
|
||||
struct iscsi_login_req *login_req;
|
||||
|
||||
if (iscsi_login_rx_data(conn, login->req, ISCSI_HDR_LEN) < 0)
|
||||
return -1;
|
||||
|
||||
login_req = (struct iscsi_login_req *) login->req;
|
||||
payload_length = ntoh24(login_req->dlength);
|
||||
|
||||
pr_debug("Got Login Command, Flags 0x%02x, ITT: 0x%08x,"
|
||||
" CmdSN: 0x%08x, ExpStatSN: 0x%08x, CID: %hu, Length: %u\n",
|
||||
login_req->flags, login_req->itt, login_req->cmdsn,
|
||||
login_req->exp_statsn, login_req->cid, payload_length);
|
||||
|
||||
if (iscsi_target_check_login_request(conn, login) < 0)
|
||||
return -1;
|
||||
|
||||
padding = ((-payload_length) & 3);
|
||||
memset(login->req_buf, 0, MAX_KEY_VALUE_PAIRS);
|
||||
|
||||
if (iscsi_login_rx_data(
|
||||
conn,
|
||||
login->req_buf,
|
||||
payload_length + padding) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iscsi_target_do_login_io(struct iscsi_conn *conn, struct iscsi_login *login)
|
||||
{
|
||||
if (iscsi_target_do_tx_login_io(conn, login) < 0)
|
||||
return -1;
|
||||
|
||||
if (iscsi_target_do_rx_login_io(conn, login) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iscsi_target_get_initial_payload(
|
||||
struct iscsi_conn *conn,
|
||||
struct iscsi_login *login)
|
||||
{
|
||||
u32 padding = 0, payload_length;
|
||||
struct iscsi_login_req *login_req;
|
||||
|
||||
login_req = (struct iscsi_login_req *) login->req;
|
||||
payload_length = ntoh24(login_req->dlength);
|
||||
|
||||
pr_debug("Got Login Command, Flags 0x%02x, ITT: 0x%08x,"
|
||||
" CmdSN: 0x%08x, ExpStatSN: 0x%08x, Length: %u\n",
|
||||
login_req->flags, login_req->itt, login_req->cmdsn,
|
||||
login_req->exp_statsn, payload_length);
|
||||
|
||||
if (iscsi_target_check_login_request(conn, login) < 0)
|
||||
return -1;
|
||||
|
||||
padding = ((-payload_length) & 3);
|
||||
|
||||
if (iscsi_login_rx_data(
|
||||
conn,
|
||||
login->req_buf,
|
||||
payload_length + padding) < 0)
|
||||
if (conn->conn_transport->iscsit_get_login_rx(conn, login) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
@@ -693,6 +631,7 @@ static int iscsi_target_do_login(struct iscsi_conn *conn, struct iscsi_login *lo
|
||||
return -1;
|
||||
if (login_rsp->flags & ISCSI_FLAG_LOGIN_TRANSIT) {
|
||||
login->tsih = conn->sess->tsih;
|
||||
login->login_complete = 1;
|
||||
if (iscsi_target_do_tx_login_io(conn,
|
||||
login) < 0)
|
||||
return -1;
|
||||
@@ -736,7 +675,7 @@ static void iscsi_initiatorname_tolower(
|
||||
/*
|
||||
* Processes the first Login Request..
|
||||
*/
|
||||
static int iscsi_target_locate_portal(
|
||||
int iscsi_target_locate_portal(
|
||||
struct iscsi_np *np,
|
||||
struct iscsi_conn *conn,
|
||||
struct iscsi_login *login)
|
||||
@@ -798,6 +737,8 @@ static int iscsi_target_locate_portal(
|
||||
start += strlen(key) + strlen(value) + 2;
|
||||
}
|
||||
|
||||
printk("i_buf: %s, s_buf: %s, t_buf: %s\n", i_buf, s_buf, t_buf);
|
||||
|
||||
/*
|
||||
* See 5.3. Login Phase.
|
||||
*/
|
||||
@@ -956,100 +897,30 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct iscsi_login *iscsi_target_init_negotiation(
|
||||
struct iscsi_np *np,
|
||||
struct iscsi_conn *conn,
|
||||
char *login_pdu)
|
||||
{
|
||||
struct iscsi_login *login;
|
||||
|
||||
login = kzalloc(sizeof(struct iscsi_login), GFP_KERNEL);
|
||||
if (!login) {
|
||||
pr_err("Unable to allocate memory for struct iscsi_login.\n");
|
||||
iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
|
||||
ISCSI_LOGIN_STATUS_NO_RESOURCES);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
login->req = kmemdup(login_pdu, ISCSI_HDR_LEN, GFP_KERNEL);
|
||||
if (!login->req) {
|
||||
pr_err("Unable to allocate memory for Login Request.\n");
|
||||
iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
|
||||
ISCSI_LOGIN_STATUS_NO_RESOURCES);
|
||||
goto out;
|
||||
}
|
||||
|
||||
login->req_buf = kzalloc(MAX_KEY_VALUE_PAIRS, GFP_KERNEL);
|
||||
if (!login->req_buf) {
|
||||
pr_err("Unable to allocate memory for response buffer.\n");
|
||||
iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
|
||||
ISCSI_LOGIN_STATUS_NO_RESOURCES);
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
* SessionType: Discovery
|
||||
*
|
||||
* Locates Default Portal
|
||||
*
|
||||
* SessionType: Normal
|
||||
*
|
||||
* Locates Target Portal from NP -> Target IQN
|
||||
*/
|
||||
if (iscsi_target_locate_portal(np, conn, login) < 0) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
return login;
|
||||
out:
|
||||
kfree(login->req);
|
||||
kfree(login->req_buf);
|
||||
kfree(login);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int iscsi_target_start_negotiation(
|
||||
struct iscsi_login *login,
|
||||
struct iscsi_conn *conn)
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
login->rsp = kzalloc(ISCSI_HDR_LEN, GFP_KERNEL);
|
||||
if (!login->rsp) {
|
||||
pr_err("Unable to allocate memory for"
|
||||
" Login Response.\n");
|
||||
iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
|
||||
ISCSI_LOGIN_STATUS_NO_RESOURCES);
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
login->rsp_buf = kzalloc(MAX_KEY_VALUE_PAIRS, GFP_KERNEL);
|
||||
if (!login->rsp_buf) {
|
||||
pr_err("Unable to allocate memory for"
|
||||
" request buffer.\n");
|
||||
iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
|
||||
ISCSI_LOGIN_STATUS_NO_RESOURCES);
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
int ret;
|
||||
|
||||
ret = iscsi_target_do_login(conn, login);
|
||||
out:
|
||||
if (ret != 0)
|
||||
iscsi_remove_failed_auth_entry(conn);
|
||||
|
||||
iscsi_target_nego_release(login, conn);
|
||||
iscsi_target_nego_release(conn);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void iscsi_target_nego_release(
|
||||
struct iscsi_login *login,
|
||||
struct iscsi_conn *conn)
|
||||
void iscsi_target_nego_release(struct iscsi_conn *conn)
|
||||
{
|
||||
kfree(login->req);
|
||||
kfree(login->rsp);
|
||||
struct iscsi_login *login = conn->conn_login;
|
||||
|
||||
if (!login)
|
||||
return;
|
||||
|
||||
kfree(login->req_buf);
|
||||
kfree(login->rsp_buf);
|
||||
kfree(login);
|
||||
|
||||
conn->conn_login = NULL;
|
||||
}
|
||||
|
مرجع در شماره جدید
Block a user