mirror of
https://github.com/armbian/linux.git
synced 2026-01-06 10:13:00 -08:00
iscsi-target: Refactor RX PDU logic + export request PDU handling
This patch refactors existing traditional iscsi RX side PDU handling to use iscsit_transport, and exports the necessary logic for external transport modules. This includes: - Refactor iscsit_handle_scsi_cmd() into PDU setup / processing - Add updated iscsit_handle_scsi_cmd() for tradtional iscsi code - Add iscsit_set_unsoliticed_dataout() wrapper - Refactor iscsit_handle_data_out() into PDU check / processing - Add updated iscsit_handle_data_out() for tradtional iscsi code - Add iscsit_handle_nop_out() + iscsit_handle_task_mgt_cmd() to accept pre-allocated struct iscsi_cmd - Add iscsit_build_r2ts_for_cmd() caller for iscsi_target_transport to handle ISTATE_SEND_R2T for TX immediate queue - Refactor main traditional iscsi iscsi_target_rx_thread() PDU switch into iscsi_target_rx_opcode() using iscsit_allocate_cmd() - Turn iscsi_target_rx_thread() process context into NOP for ib_isert side work-queue. v5 changes: - Make iscsit_handle_scsi_cmd() static (Fengguang) - Fix iscsit_handle_scsi_cmd() exception se_cmd leak (nab) v3 changes: - Add extra target_put_sess_cmd call in iscsit_add_reject_from_cmd after completion v2 changes: - Disable iscsit_ack_from_expstatsn() usage for RDMAExtentions=Yes - Disable iscsit_allocate_datain_req() usage for RDMAExtentions=Yes - Add target_get_sess_cmd() reference counting to iscsit_setup_scsi_cmd() - Add TFO->lio_check_stop_free() fabric API caller - Add export of iscsit_stop_dataout_timer() symbol - Add iscsit_build_r2ts_for_cmd() for iscsit_transport->iscsit_get_dataout() - Convert existing usage of iscsit_build_r2ts_for_cmd() to ->iscsit_get_dataout() - Drop RDMAExtentions=Yes specific check in iscsit_build_r2ts_for_cmd() - Fix RDMAExtentions -> RDMAExtensions typo (andy) - Pass correct dump_payload value into iscsit_get_immediate_data() for iscsit_handle_scsi_cmd() Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -16,11 +16,12 @@ extern int iscsit_reset_np_thread(struct iscsi_np *, struct iscsi_tpg_np *,
|
||||
struct iscsi_portal_group *);
|
||||
extern int iscsit_del_np(struct iscsi_np *);
|
||||
extern int iscsit_add_reject_from_cmd(u8, int, int, unsigned char *, struct iscsi_cmd *);
|
||||
extern void iscsit_set_unsoliticed_dataout(struct iscsi_cmd *);
|
||||
extern int iscsit_logout_closesession(struct iscsi_cmd *, struct iscsi_conn *);
|
||||
extern int iscsit_logout_closeconnection(struct iscsi_cmd *, struct iscsi_conn *);
|
||||
extern int iscsit_logout_removeconnforrecovery(struct iscsi_cmd *, struct iscsi_conn *);
|
||||
extern int iscsit_send_async_msg(struct iscsi_conn *, u16, u8, u8);
|
||||
extern int iscsit_build_r2ts_for_cmd(struct iscsi_cmd *, struct iscsi_conn *, bool recovery);
|
||||
extern int iscsit_build_r2ts_for_cmd(struct iscsi_conn *, struct iscsi_cmd *, bool recovery);
|
||||
extern void iscsit_thread_get_cpumask(struct iscsi_conn *);
|
||||
extern int iscsi_target_tx_thread(void *);
|
||||
extern int iscsi_target_rx_thread(void *);
|
||||
|
||||
@@ -1543,9 +1543,10 @@ static int lio_queue_data_in(struct se_cmd *se_cmd)
|
||||
static int lio_write_pending(struct se_cmd *se_cmd)
|
||||
{
|
||||
struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
|
||||
struct iscsi_conn *conn = cmd->conn;
|
||||
|
||||
if (!cmd->immediate_data && !cmd->unsolicited_data)
|
||||
return iscsit_build_r2ts_for_cmd(cmd, cmd->conn, false);
|
||||
return conn->conn_transport->iscsit_get_dataout(conn, cmd, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1696,6 +1697,11 @@ static void lio_set_default_node_attributes(struct se_node_acl *se_acl)
|
||||
iscsit_set_default_node_attribues(acl);
|
||||
}
|
||||
|
||||
static int lio_check_stop_free(struct se_cmd *se_cmd)
|
||||
{
|
||||
return target_put_sess_cmd(se_cmd->se_sess, se_cmd);
|
||||
}
|
||||
|
||||
static void lio_release_cmd(struct se_cmd *se_cmd)
|
||||
{
|
||||
struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
|
||||
@@ -1741,6 +1747,7 @@ int iscsi_target_register_configfs(void)
|
||||
fabric->tf_ops.tpg_alloc_fabric_acl = &lio_tpg_alloc_fabric_acl;
|
||||
fabric->tf_ops.tpg_release_fabric_acl = &lio_tpg_release_fabric_acl;
|
||||
fabric->tf_ops.tpg_get_inst_index = &lio_tpg_get_inst_index;
|
||||
fabric->tf_ops.check_stop_free = &lio_check_stop_free,
|
||||
fabric->tf_ops.release_cmd = &lio_release_cmd;
|
||||
fabric->tf_ops.shutdown_session = &lio_tpg_shutdown_session;
|
||||
fabric->tf_ops.close_session = &lio_tpg_close_session;
|
||||
|
||||
@@ -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_seq_pdu_list.h"
|
||||
@@ -53,6 +54,9 @@ int iscsit_dump_data_payload(
|
||||
u32 length, padding, offset = 0, size;
|
||||
struct kvec iov;
|
||||
|
||||
if (conn->sess->sess_ops->RDMAExtensions)
|
||||
return 0;
|
||||
|
||||
length = (buf_len > OFFLOAD_BUF_SIZE) ? OFFLOAD_BUF_SIZE : buf_len;
|
||||
|
||||
buf = kzalloc(length, GFP_ATOMIC);
|
||||
@@ -919,6 +923,7 @@ int iscsit_execute_ooo_cmdsns(struct iscsi_session *sess)
|
||||
int iscsit_execute_cmd(struct iscsi_cmd *cmd, int ooo)
|
||||
{
|
||||
struct se_cmd *se_cmd = &cmd->se_cmd;
|
||||
struct iscsi_conn *conn = cmd->conn;
|
||||
int lr = 0;
|
||||
|
||||
spin_lock_bh(&cmd->istate_lock);
|
||||
@@ -981,7 +986,7 @@ int iscsit_execute_cmd(struct iscsi_cmd *cmd, int ooo)
|
||||
return 0;
|
||||
|
||||
iscsit_set_dataout_sequence_values(cmd);
|
||||
iscsit_build_r2ts_for_cmd(cmd, cmd->conn, false);
|
||||
conn->conn_transport->iscsit_get_dataout(conn, cmd, false);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -999,10 +1004,7 @@ int iscsit_execute_cmd(struct iscsi_cmd *cmd, int ooo)
|
||||
if (transport_check_aborted_status(se_cmd, 1) != 0)
|
||||
return 0;
|
||||
|
||||
iscsit_set_dataout_sequence_values(cmd);
|
||||
spin_lock_bh(&cmd->dataout_timeout_lock);
|
||||
iscsit_start_dataout_timer(cmd, cmd->conn);
|
||||
spin_unlock_bh(&cmd->dataout_timeout_lock);
|
||||
iscsit_set_unsoliticed_dataout(cmd);
|
||||
}
|
||||
return transport_handle_cdb_direct(&cmd->se_cmd);
|
||||
|
||||
@@ -1290,3 +1292,4 @@ void iscsit_stop_dataout_timer(struct iscsi_cmd *cmd)
|
||||
cmd->init_task_tag);
|
||||
spin_unlock_bh(&cmd->dataout_timeout_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(iscsit_stop_dataout_timer);
|
||||
|
||||
@@ -1068,8 +1068,7 @@ int iscsit_get_login_rx(struct iscsi_conn *conn, struct iscsi_login *login)
|
||||
if (login->first_request) {
|
||||
login_req = (struct iscsi_login_req *)login->req;
|
||||
login->leading_connection = (!login_req->tsih) ? 1 : 0;
|
||||
login->current_stage =
|
||||
(login_req->flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2;
|
||||
login->current_stage = ISCSI_LOGIN_CURRENT_STAGE(login_req->flags);
|
||||
login->version_min = login_req->min_version;
|
||||
login->version_max = login_req->max_version;
|
||||
memcpy(login->isid, login_req->isid, 6);
|
||||
|
||||
@@ -691,21 +691,6 @@ int iscsi_target_locate_portal(
|
||||
login_req = (struct iscsi_login_req *) login->req;
|
||||
payload_length = ntoh24(login_req->dlength);
|
||||
|
||||
login->first_request = 1;
|
||||
login->leading_connection = (!login_req->tsih) ? 1 : 0;
|
||||
login->current_stage = ISCSI_LOGIN_CURRENT_STAGE(login_req->flags);
|
||||
login->version_min = login_req->min_version;
|
||||
login->version_max = login_req->max_version;
|
||||
memcpy(login->isid, login_req->isid, 6);
|
||||
login->cmd_sn = be32_to_cpu(login_req->cmdsn);
|
||||
login->init_task_tag = login_req->itt;
|
||||
login->initial_exp_statsn = be32_to_cpu(login_req->exp_statsn);
|
||||
login->cid = be16_to_cpu(login_req->cid);
|
||||
login->tsih = be16_to_cpu(login_req->tsih);
|
||||
|
||||
if (iscsi_target_get_initial_payload(conn, login) < 0)
|
||||
return -1;
|
||||
|
||||
tmpbuf = kzalloc(payload_length + 1, GFP_KERNEL);
|
||||
if (!tmpbuf) {
|
||||
pr_err("Unable to allocate memory for tmpbuf.\n");
|
||||
|
||||
@@ -23,6 +23,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_seq_pdu_list.h"
|
||||
@@ -301,7 +302,7 @@ static int iscsit_task_reassign_complete_write(
|
||||
/*
|
||||
* iscsit_build_r2ts_for_cmd() can handle the rest from here.
|
||||
*/
|
||||
return iscsit_build_r2ts_for_cmd(cmd, conn, true);
|
||||
return conn->conn_transport->iscsit_get_dataout(conn, cmd, true);
|
||||
}
|
||||
|
||||
static int iscsit_task_reassign_complete_read(
|
||||
|
||||
@@ -317,6 +317,7 @@ int iscsit_sequence_cmd(
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(iscsit_sequence_cmd);
|
||||
|
||||
int iscsit_check_unsolicited_dataout(struct iscsi_cmd *cmd, unsigned char *buf)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user