mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-17 10:41:26 +00:00
Blocked commands should not pass again through order checks
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@3461 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
@@ -209,17 +209,23 @@ static inline unsigned int queue_max_hw_sectors(struct request_queue *q)
|
||||
/* Waiting for data from the initiator (until scst_rx_data() called) */
|
||||
#define SCST_CMD_STATE_DATA_WAIT (SCST_CMD_STATE_LAST_ACTIVE+4)
|
||||
|
||||
/*
|
||||
* Cmd is ready for exec (after check if its device is blocked or should
|
||||
* be blocked)
|
||||
*/
|
||||
#define SCST_CMD_STATE_START_EXEC (SCST_CMD_STATE_LAST_ACTIVE+5)
|
||||
|
||||
/* Cmd is being checked if it should be executed locally */
|
||||
#define SCST_CMD_STATE_LOCAL_EXEC (SCST_CMD_STATE_LAST_ACTIVE+5)
|
||||
#define SCST_CMD_STATE_LOCAL_EXEC (SCST_CMD_STATE_LAST_ACTIVE+6)
|
||||
|
||||
/* Cmd is ready for execution */
|
||||
#define SCST_CMD_STATE_REAL_EXEC (SCST_CMD_STATE_LAST_ACTIVE+6)
|
||||
#define SCST_CMD_STATE_REAL_EXEC (SCST_CMD_STATE_LAST_ACTIVE+7)
|
||||
|
||||
/* Waiting for CDB's execution finish */
|
||||
#define SCST_CMD_STATE_REAL_EXECUTING (SCST_CMD_STATE_LAST_ACTIVE+7)
|
||||
#define SCST_CMD_STATE_REAL_EXECUTING (SCST_CMD_STATE_LAST_ACTIVE+8)
|
||||
|
||||
/* Waiting for response's transmission finish */
|
||||
#define SCST_CMD_STATE_XMIT_WAIT (SCST_CMD_STATE_LAST_ACTIVE+8)
|
||||
#define SCST_CMD_STATE_XMIT_WAIT (SCST_CMD_STATE_LAST_ACTIVE+9)
|
||||
|
||||
/*************************************************************
|
||||
* Can be returned instead of cmd's state by dev handlers'
|
||||
|
||||
@@ -1918,6 +1918,7 @@ static int scst_get_cmd_abnormal_done_state(const struct scst_cmd *cmd)
|
||||
case SCST_CMD_STATE_RDY_TO_XFER:
|
||||
case SCST_CMD_STATE_DATA_WAIT:
|
||||
case SCST_CMD_STATE_TGT_PRE_EXEC:
|
||||
case SCST_CMD_STATE_START_EXEC:
|
||||
case SCST_CMD_STATE_SEND_FOR_EXEC:
|
||||
case SCST_CMD_STATE_LOCAL_EXEC:
|
||||
case SCST_CMD_STATE_REAL_EXEC:
|
||||
@@ -1977,6 +1978,7 @@ int scst_set_cmd_abnormal_done_state(struct scst_cmd *cmd)
|
||||
break;
|
||||
case SCST_CMD_STATE_TGT_PRE_EXEC:
|
||||
case SCST_CMD_STATE_SEND_FOR_EXEC:
|
||||
case SCST_CMD_STATE_START_EXEC:
|
||||
case SCST_CMD_STATE_LOCAL_EXEC:
|
||||
case SCST_CMD_STATE_REAL_EXEC:
|
||||
case SCST_CMD_STATE_REAL_EXECUTING:
|
||||
|
||||
@@ -828,6 +828,7 @@ set_res:
|
||||
case SCST_CMD_STATE_RDY_TO_XFER:
|
||||
case SCST_CMD_STATE_TGT_PRE_EXEC:
|
||||
case SCST_CMD_STATE_SEND_FOR_EXEC:
|
||||
case SCST_CMD_STATE_START_EXEC:
|
||||
case SCST_CMD_STATE_LOCAL_EXEC:
|
||||
case SCST_CMD_STATE_REAL_EXEC:
|
||||
case SCST_CMD_STATE_PRE_DEV_DONE:
|
||||
@@ -2740,10 +2741,12 @@ static int scst_exec(struct scst_cmd **active_cmd)
|
||||
struct scst_cmd *cmd = *active_cmd;
|
||||
struct scst_cmd *ref_cmd;
|
||||
struct scst_device *dev = cmd->dev;
|
||||
int res = SCST_CMD_STATE_RES_CONT_NEXT, count;
|
||||
int res = SCST_CMD_STATE_RES_CONT_NEXT, count = 0;
|
||||
|
||||
TRACE_ENTRY();
|
||||
|
||||
cmd->state = SCST_CMD_STATE_START_EXEC;
|
||||
|
||||
if (unlikely(scst_check_blocked_dev(cmd)))
|
||||
goto out;
|
||||
|
||||
@@ -2751,7 +2754,6 @@ static int scst_exec(struct scst_cmd **active_cmd)
|
||||
ref_cmd = cmd;
|
||||
__scst_cmd_get(ref_cmd);
|
||||
|
||||
count = 0;
|
||||
while (1) {
|
||||
int rc;
|
||||
|
||||
@@ -2787,12 +2789,15 @@ done:
|
||||
if (cmd == NULL)
|
||||
break;
|
||||
|
||||
cmd->state = SCST_CMD_STATE_START_EXEC;
|
||||
|
||||
if (unlikely(scst_check_blocked_dev(cmd)))
|
||||
break;
|
||||
|
||||
__scst_cmd_put(ref_cmd);
|
||||
ref_cmd = cmd;
|
||||
__scst_cmd_get(ref_cmd);
|
||||
|
||||
}
|
||||
|
||||
*active_cmd = cmd;
|
||||
@@ -2808,6 +2813,7 @@ out_put:
|
||||
/* !! At this point sess, dev and tgt_dev can be already freed !! */
|
||||
|
||||
out:
|
||||
EXTRACHECKS_BUG_ON(res == SCST_CMD_STATE_RES_NEED_THREAD);
|
||||
TRACE_EXIT_RES(res);
|
||||
return res;
|
||||
}
|
||||
@@ -3304,6 +3310,7 @@ static int scst_dev_done(struct scst_cmd *cmd)
|
||||
case SCST_CMD_STATE_RDY_TO_XFER:
|
||||
case SCST_CMD_STATE_TGT_PRE_EXEC:
|
||||
case SCST_CMD_STATE_SEND_FOR_EXEC:
|
||||
case SCST_CMD_STATE_START_EXEC:
|
||||
case SCST_CMD_STATE_LOCAL_EXEC:
|
||||
case SCST_CMD_STATE_REAL_EXEC:
|
||||
case SCST_CMD_STATE_PRE_DEV_DONE:
|
||||
@@ -3356,6 +3363,7 @@ static int scst_dev_done(struct scst_cmd *cmd)
|
||||
switch (state) {
|
||||
case SCST_CMD_STATE_TGT_PRE_EXEC:
|
||||
case SCST_CMD_STATE_SEND_FOR_EXEC:
|
||||
case SCST_CMD_STATE_START_EXEC:
|
||||
case SCST_CMD_STATE_LOCAL_EXEC:
|
||||
case SCST_CMD_STATE_REAL_EXEC:
|
||||
TRACE_DBG("Atomic context and redirect, "
|
||||
@@ -4123,6 +4131,16 @@ void scst_process_active_cmd(struct scst_cmd *cmd, bool atomic)
|
||||
break;
|
||||
}
|
||||
res = scst_send_for_exec(&cmd);
|
||||
EXTRACHECKS_BUG_ON(res == SCST_CMD_STATE_RES_NEED_THREAD);
|
||||
/*
|
||||
* !! At this point cmd, sess & tgt_dev can already be
|
||||
* freed !!
|
||||
*/
|
||||
break;
|
||||
|
||||
case SCST_CMD_STATE_START_EXEC:
|
||||
res = scst_exec(&cmd);
|
||||
EXTRACHECKS_BUG_ON(res == SCST_CMD_STATE_RES_NEED_THREAD);
|
||||
/*
|
||||
* !! At this point cmd, sess & tgt_dev can already be
|
||||
* freed !!
|
||||
@@ -4131,6 +4149,7 @@ void scst_process_active_cmd(struct scst_cmd *cmd, bool atomic)
|
||||
|
||||
case SCST_CMD_STATE_LOCAL_EXEC:
|
||||
res = scst_local_exec(cmd);
|
||||
EXTRACHECKS_BUG_ON(res == SCST_CMD_STATE_RES_NEED_THREAD);
|
||||
/*
|
||||
* !! At this point cmd, sess & tgt_dev can already be
|
||||
* freed !!
|
||||
@@ -4139,6 +4158,7 @@ void scst_process_active_cmd(struct scst_cmd *cmd, bool atomic)
|
||||
|
||||
case SCST_CMD_STATE_REAL_EXEC:
|
||||
res = scst_real_exec(cmd);
|
||||
EXTRACHECKS_BUG_ON(res == SCST_CMD_STATE_RES_NEED_THREAD);
|
||||
/*
|
||||
* !! At this point cmd, sess & tgt_dev can already be
|
||||
* freed !!
|
||||
@@ -4199,6 +4219,7 @@ void scst_process_active_cmd(struct scst_cmd *cmd, bool atomic)
|
||||
case SCST_CMD_STATE_RDY_TO_XFER:
|
||||
case SCST_CMD_STATE_TGT_PRE_EXEC:
|
||||
case SCST_CMD_STATE_SEND_FOR_EXEC:
|
||||
case SCST_CMD_STATE_START_EXEC:
|
||||
case SCST_CMD_STATE_LOCAL_EXEC:
|
||||
case SCST_CMD_STATE_REAL_EXEC:
|
||||
case SCST_CMD_STATE_DEV_DONE:
|
||||
|
||||
Reference in New Issue
Block a user