Commit 4412a671 authored by Bart Van Assche's avatar Bart Van Assche Committed by Nicholas Bellinger

target/iscsi: Remove second argument of __iscsit_free_cmd()

Initialize .data_direction to DMA_NONE in iscsit_allocate_cmd()
such that the second argument of __iscsit_free_cmd() can be left
out. Note: this patch causes the first part of __iscsit_free_cmd()
no longer to be skipped for TMFs. That's fine since no data
segments are associated with TMFs.
Signed-off-by: default avatarBart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Andy Grover <agrover@redhat.com>
Cc: David Disseldorp <ddiss@suse.de>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 4c1f0e65
...@@ -488,15 +488,13 @@ EXPORT_SYMBOL(iscsit_queue_rsp); ...@@ -488,15 +488,13 @@ EXPORT_SYMBOL(iscsit_queue_rsp);
void iscsit_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd) void iscsit_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
{ {
bool scsi_cmd = (cmd->iscsi_opcode == ISCSI_OP_SCSI_CMD);
spin_lock_bh(&conn->cmd_lock); spin_lock_bh(&conn->cmd_lock);
if (!list_empty(&cmd->i_conn_node) && if (!list_empty(&cmd->i_conn_node) &&
!(cmd->se_cmd.transport_state & CMD_T_FABRIC_STOP)) !(cmd->se_cmd.transport_state & CMD_T_FABRIC_STOP))
list_del_init(&cmd->i_conn_node); list_del_init(&cmd->i_conn_node);
spin_unlock_bh(&conn->cmd_lock); spin_unlock_bh(&conn->cmd_lock);
__iscsit_free_cmd(cmd, scsi_cmd, true); __iscsit_free_cmd(cmd, true);
} }
EXPORT_SYMBOL(iscsit_aborted_task); EXPORT_SYMBOL(iscsit_aborted_task);
......
...@@ -167,6 +167,7 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, int state) ...@@ -167,6 +167,7 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, int state)
cmd->se_cmd.map_tag = tag; cmd->se_cmd.map_tag = tag;
cmd->conn = conn; cmd->conn = conn;
cmd->data_direction = DMA_NONE;
INIT_LIST_HEAD(&cmd->i_conn_node); INIT_LIST_HEAD(&cmd->i_conn_node);
INIT_LIST_HEAD(&cmd->datain_list); INIT_LIST_HEAD(&cmd->datain_list);
INIT_LIST_HEAD(&cmd->cmd_r2t_list); INIT_LIST_HEAD(&cmd->cmd_r2t_list);
...@@ -711,19 +712,16 @@ void iscsit_release_cmd(struct iscsi_cmd *cmd) ...@@ -711,19 +712,16 @@ void iscsit_release_cmd(struct iscsi_cmd *cmd)
} }
EXPORT_SYMBOL(iscsit_release_cmd); EXPORT_SYMBOL(iscsit_release_cmd);
void __iscsit_free_cmd(struct iscsi_cmd *cmd, bool scsi_cmd, void __iscsit_free_cmd(struct iscsi_cmd *cmd, bool check_queues)
bool check_queues)
{ {
struct iscsi_conn *conn = cmd->conn; struct iscsi_conn *conn = cmd->conn;
if (scsi_cmd) { if (cmd->data_direction == DMA_TO_DEVICE) {
if (cmd->data_direction == DMA_TO_DEVICE) { iscsit_stop_dataout_timer(cmd);
iscsit_stop_dataout_timer(cmd); iscsit_free_r2ts_from_list(cmd);
iscsit_free_r2ts_from_list(cmd);
}
if (cmd->data_direction == DMA_FROM_DEVICE)
iscsit_free_all_datain_reqs(cmd);
} }
if (cmd->data_direction == DMA_FROM_DEVICE)
iscsit_free_all_datain_reqs(cmd);
if (conn && check_queues) { if (conn && check_queues) {
iscsit_remove_cmd_from_immediate_queue(cmd, conn); iscsit_remove_cmd_from_immediate_queue(cmd, conn);
...@@ -738,23 +736,22 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd, bool shutdown) ...@@ -738,23 +736,22 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd, bool shutdown)
{ {
struct se_cmd *se_cmd = NULL; struct se_cmd *se_cmd = NULL;
int rc; int rc;
bool op_scsi = false;
/* /*
* Determine if a struct se_cmd is associated with * Determine if a struct se_cmd is associated with
* this struct iscsi_cmd. * this struct iscsi_cmd.
*/ */
switch (cmd->iscsi_opcode) { switch (cmd->iscsi_opcode) {
case ISCSI_OP_SCSI_CMD: case ISCSI_OP_SCSI_CMD:
op_scsi = true;
/* /*
* Fallthrough * Fallthrough
*/ */
case ISCSI_OP_SCSI_TMFUNC: case ISCSI_OP_SCSI_TMFUNC:
se_cmd = &cmd->se_cmd; se_cmd = &cmd->se_cmd;
__iscsit_free_cmd(cmd, op_scsi, shutdown); __iscsit_free_cmd(cmd, shutdown);
rc = transport_generic_free_cmd(se_cmd, shutdown); rc = transport_generic_free_cmd(se_cmd, shutdown);
if (!rc && shutdown && se_cmd->se_sess) { if (!rc && shutdown && se_cmd->se_sess) {
__iscsit_free_cmd(cmd, op_scsi, shutdown); __iscsit_free_cmd(cmd, shutdown);
target_put_sess_cmd(se_cmd); target_put_sess_cmd(se_cmd);
} }
break; break;
...@@ -766,18 +763,18 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd, bool shutdown) ...@@ -766,18 +763,18 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd, bool shutdown)
*/ */
if (cmd->se_cmd.se_tfo != NULL) { if (cmd->se_cmd.se_tfo != NULL) {
se_cmd = &cmd->se_cmd; se_cmd = &cmd->se_cmd;
__iscsit_free_cmd(cmd, true, shutdown); __iscsit_free_cmd(cmd, shutdown);
rc = transport_generic_free_cmd(&cmd->se_cmd, shutdown); rc = transport_generic_free_cmd(&cmd->se_cmd, shutdown);
if (!rc && shutdown && se_cmd->se_sess) { if (!rc && shutdown && se_cmd->se_sess) {
__iscsit_free_cmd(cmd, true, shutdown); __iscsit_free_cmd(cmd, shutdown);
target_put_sess_cmd(se_cmd); target_put_sess_cmd(se_cmd);
} }
break; break;
} }
/* Fall-through */ /* Fall-through */
default: default:
__iscsit_free_cmd(cmd, false, shutdown); __iscsit_free_cmd(cmd, shutdown);
iscsit_release_cmd(cmd); iscsit_release_cmd(cmd);
break; break;
} }
......
...@@ -37,7 +37,7 @@ extern void iscsit_remove_cmd_from_tx_queues(struct iscsi_cmd *, struct iscsi_co ...@@ -37,7 +37,7 @@ extern void iscsit_remove_cmd_from_tx_queues(struct iscsi_cmd *, struct iscsi_co
extern bool iscsit_conn_all_queues_empty(struct iscsi_conn *); extern bool iscsit_conn_all_queues_empty(struct iscsi_conn *);
extern void iscsit_free_queue_reqs_for_conn(struct iscsi_conn *); extern void iscsit_free_queue_reqs_for_conn(struct iscsi_conn *);
extern void iscsit_release_cmd(struct iscsi_cmd *); extern void iscsit_release_cmd(struct iscsi_cmd *);
extern void __iscsit_free_cmd(struct iscsi_cmd *, bool, bool); extern void __iscsit_free_cmd(struct iscsi_cmd *, bool);
extern void iscsit_free_cmd(struct iscsi_cmd *, bool); extern void iscsit_free_cmd(struct iscsi_cmd *, bool);
extern int iscsit_check_session_usage_count(struct iscsi_session *); extern int iscsit_check_session_usage_count(struct iscsi_session *);
extern void iscsit_dec_session_usage_count(struct iscsi_session *); extern void iscsit_dec_session_usage_count(struct iscsi_session *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment