diff --git a/scst/include/scst.h b/scst/include/scst.h index 9e5a49b8a..fd0fc69d7 100644 --- a/scst/include/scst.h +++ b/scst/include/scst.h @@ -1872,18 +1872,12 @@ struct scst_cmd { ** Cmd's flags *************************************************************/ - /* Set if cmd was sent for execution to optimize aborts waiting */ + /* + * Set if expected_sn should be incremented, i.e. cmd was sent + * for execution + */ unsigned int sent_for_exec:1; - /* Set if cmd passed scst_inc_expected_sn() */ - unsigned int expected_sn_check_passed:1; - - /* Set if cmd's SN was set */ - unsigned int sn_set:1; - - /* Set if increment expected_sn in cmd->scst_cmd_done() */ - unsigned int inc_expected_sn_on_done:1; - /* Set if the cmd's action is completed */ unsigned int completed:1; @@ -1961,6 +1955,9 @@ struct scst_cmd { */ unsigned int preprocessing_only:1; + /* Set if cmd's SN was set */ + unsigned int sn_set:1; + /* Set if hq_cmd_count was incremented */ unsigned int hq_cmd_inced:1; @@ -1983,6 +1980,9 @@ struct scst_cmd { /* Set if the cmd was done or aborted out of its SN */ unsigned int out_of_sn:1; + /* Set if increment expected_sn in cmd->scst_cmd_done() */ + unsigned int inc_expected_sn_on_done:1; + /* Set if tgt_sn field is valid */ unsigned int tgt_sn_set:1; diff --git a/scst/src/scst_lib.c b/scst/src/scst_lib.c index 8feac73b4..e614e9c62 100644 --- a/scst/src/scst_lib.c +++ b/scst/src/scst_lib.c @@ -5434,9 +5434,8 @@ void scst_free_cmd(struct scst_cmd *cmd) if (likely(cmd->tgt_dev != NULL)) { #ifdef CONFIG_SCST_EXTRACHECKS - if (unlikely(!cmd->expected_sn_check_passed) && cmd->sn_set && - !cmd->internal && !cmd->out_of_sn) { - PRINT_ERROR("Finishing not SN checked cmd %p (opcode " + if (unlikely(!cmd->sent_for_exec) && !cmd->internal) { + PRINT_ERROR("Finishing not executed cmd %p (opcode " "%d, target %s, LUN %lld, sn %d, expected_sn %d)", cmd, cmd->cdb[0], cmd->tgtt->name, (long long unsigned int)cmd->lun, diff --git a/scst/src/scst_targ.c b/scst/src/scst_targ.c index 0c1dd736f..7f57eb3dc 100644 --- a/scst/src/scst_targ.c +++ b/scst/src/scst_targ.c @@ -2552,9 +2552,6 @@ bool scst_inc_expected_sn(struct scst_cmd *cmd) */ EXTRACHECKS_BUG_ON(!cmd->sn_set); - EXTRACHECKS_BUG_ON(cmd->expected_sn_check_passed); - - cmd->expected_sn_check_passed = 1; /* * Optimized for lockless fast path of sequence of SIMPLE or @@ -2618,8 +2615,8 @@ static struct scst_cmd *scst_post_exec_sn(struct scst_cmd *cmd, bool make_active) { /* For HQ commands SN is not set */ - bool inc_expected_sn = !cmd->inc_expected_sn_on_done && cmd->sn_set && - !cmd->expected_sn_check_passed && !cmd->retry; + bool inc_expected_sn = !cmd->inc_expected_sn_on_done && + cmd->sn_set && !cmd->retry; struct scst_cmd *res = NULL; TRACE_ENTRY(); @@ -3489,7 +3486,7 @@ static int scst_dev_done(struct scst_cmd *cmd) scst_check_unblock_dev(cmd); - if (cmd->inc_expected_sn_on_done && cmd->sn_set) { + if (cmd->inc_expected_sn_on_done && cmd->sent_for_exec && cmd->sn_set) { bool rc = scst_inc_expected_sn(cmd); if (rc) scst_make_deferred_commands_active(cmd->cur_order_data); @@ -3557,10 +3554,11 @@ static int scst_pre_xmit_response(struct scst_cmd *cmd) if (unlikely(cmd->queue_type == SCST_CMD_QUEUE_HEAD_OF_QUEUE)) scst_on_hq_cmd_response(cmd); - if (unlikely(!cmd->expected_sn_check_passed)) { - TRACE_SN("cmd %p was not SN passed (sn %d, set %d)", + if (unlikely(!cmd->sent_for_exec)) { + TRACE_SN("cmd %p was not sent for exec (sn %d, set %d)", cmd, cmd->sn, cmd->sn_set); scst_unblock_deferred(cmd->cur_order_data, cmd); + cmd->sent_for_exec = 1; } } @@ -3870,15 +3868,12 @@ static void scst_cmd_set_sn(struct scst_cmd *cmd) cmd->queue_type = SCST_CMD_QUEUE_ORDERED; #endif - if ((cmd->dev->queue_alg == SCST_CONTR_MODE_QUEUE_ALG_RESTRICTED_REORDER) && - (likely(cmd->queue_type != SCST_CMD_QUEUE_HEAD_OF_QUEUE))) { + if (cmd->dev->queue_alg == SCST_CONTR_MODE_QUEUE_ALG_RESTRICTED_REORDER) { /* * Not the best way, but good enough until there is a * possibility to specify queue type during pass-through * commands submission. */ - TRACE_SN("Restricted reorder dev %s (cmd %p)", - cmd->dev->virt_name, cmd); cmd->queue_type = SCST_CMD_QUEUE_ORDERED; } @@ -3918,11 +3913,6 @@ again: TRACE_SN("New sn_cmd_count: %d", atomic_read(&order_data->sn_cmd_count)); break; - case SCST_CMD_QUEUE_UNTAGGED: /* put here with goto for better fast path */ - /* It is processed further as SIMPLE */ - cmd->queue_type = SCST_CMD_QUEUE_SIMPLE; - goto again; - case SCST_CMD_QUEUE_ORDERED: TRACE_SN("ORDERED cmd %p (op %x)", cmd, cmd->cdb[0]); ordered: @@ -3945,6 +3935,11 @@ ordered: cmd->hq_cmd_inced = 1; goto out; + case SCST_CMD_QUEUE_UNTAGGED: /* put here with goto for better fast path */ + /* It is processed as SIMPLE */ + cmd->queue_type = SCST_CMD_QUEUE_SIMPLE; + goto again; + default: sBUG(); }