From: <vl...@us...> - 2007-08-24 16:54:55
|
Revision: 170 http://scst.svn.sourceforge.net/scst/?rev=170&view=rev Author: vlnb Date: 2007-08-24 09:54:19 -0700 (Fri, 24 Aug 2007) Log Message: ----------- - Calling pre_exec() moved to the separate state - Minor cleanups Modified Paths: -------------- trunk/scst/include/scsi_tgt.h trunk/scst/src/scst_lib.c trunk/scst/src/scst_targ.c Modified: trunk/scst/include/scsi_tgt.h =================================================================== --- trunk/scst/include/scsi_tgt.h 2007-08-24 16:40:56 UTC (rev 169) +++ trunk/scst/include/scsi_tgt.h 2007-08-24 16:54:19 UTC (rev 170) @@ -66,23 +66,26 @@ /* Waiting for data from the initiator (until scst_rx_data() called) */ #define SCST_CMD_STATE_DATA_WAIT 8 +/* Target driver's pre_exec() is going to be called */ +#define SCST_CMD_STATE_PRE_EXEC 9 + /* CDB is going to be sent to SCSI mid-level for execution */ -#define SCST_CMD_STATE_SEND_TO_MIDLEV 9 +#define SCST_CMD_STATE_SEND_TO_MIDLEV 10 /* Waiting for CDB's execution finish */ -#define SCST_CMD_STATE_EXECUTING 10 +#define SCST_CMD_STATE_EXECUTING 11 /* Dev handler's dev_done() is going to be called */ -#define SCST_CMD_STATE_DEV_DONE 11 +#define SCST_CMD_STATE_DEV_DONE 12 /* Target driver's xmit_response() is going to be called */ -#define SCST_CMD_STATE_XMIT_RESP 12 +#define SCST_CMD_STATE_XMIT_RESP 13 /* Waiting for response's transmission finish */ -#define SCST_CMD_STATE_XMIT_WAIT 13 +#define SCST_CMD_STATE_XMIT_WAIT 14 /* The cmd finished */ -#define SCST_CMD_STATE_FINISHED 14 +#define SCST_CMD_STATE_FINISHED 15 /************************************************************* ** Can be retuned instead of cmd's state by dev handlers' Modified: trunk/scst/src/scst_lib.c =================================================================== --- trunk/scst/src/scst_lib.c 2007-08-24 16:40:56 UTC (rev 169) +++ trunk/scst/src/scst_lib.c 2007-08-24 16:54:19 UTC (rev 170) @@ -2636,7 +2636,6 @@ void __scst_block_dev(struct scst_device *dev) { dev->block_count++; - smp_mb(); TRACE_MGMT_DBG("Device BLOCK(new %d), dev %p", dev->block_count, dev); } Modified: trunk/scst/src/scst_targ.c =================================================================== --- trunk/scst/src/scst_targ.c 2007-08-24 16:40:56 UTC (rev 169) +++ trunk/scst/src/scst_targ.c 2007-08-24 16:54:19 UTC (rev 170) @@ -452,6 +452,7 @@ case SCST_CMD_STATE_PREPARE_SPACE: case SCST_CMD_STATE_DEV_PARSE: case SCST_CMD_STATE_RDY_TO_XFER: + case SCST_CMD_STATE_PRE_EXEC: case SCST_CMD_STATE_SEND_TO_MIDLEV: case SCST_CMD_STATE_DEV_DONE: case SCST_CMD_STATE_XMIT_RESP: @@ -677,7 +678,7 @@ break; default: - cmd->state = SCST_CMD_STATE_SEND_TO_MIDLEV; + cmd->state = SCST_CMD_STATE_PRE_EXEC; break; } @@ -726,7 +727,7 @@ cmd->state = SCST_CMD_STATE_RDY_TO_XFER; break; default: - cmd->state = SCST_CMD_STATE_SEND_TO_MIDLEV; + cmd->state = SCST_CMD_STATE_PRE_EXEC; break; } if (cmd->no_sn) @@ -826,7 +827,7 @@ } if (cmd->tgtt->rdy_to_xfer == NULL) { - cmd->state = SCST_CMD_STATE_SEND_TO_MIDLEV; + cmd->state = SCST_CMD_STATE_PRE_EXEC; res = SCST_CMD_STATE_RES_CONT_SAME; goto out; } @@ -971,7 +972,7 @@ switch (status) { case SCST_RX_STATUS_SUCCESS: - cmd->state = SCST_CMD_STATE_SEND_TO_MIDLEV; + cmd->state = SCST_CMD_STATE_PRE_EXEC; /* Small context optimization */ if ((pref_context == SCST_CONTEXT_TASKLET) || (pref_context == SCST_CONTEXT_DIRECT_ATOMIC)) { @@ -1007,12 +1008,17 @@ return; } -static int scst_tgt_pre_exec(struct scst_cmd *cmd, int *action) +static int scst_tgt_pre_exec(struct scst_cmd *cmd) { - int res = 0, rc; + int rc; TRACE_ENTRY(); + cmd->state = SCST_CMD_STATE_SEND_TO_MIDLEV; + + if (cmd->tgtt->pre_exec == NULL) + goto out; + TRACE_DBG("Calling pre_exec(%p)", cmd); rc = cmd->tgtt->pre_exec(cmd); TRACE_DBG("pre_exec() returned %d", rc); @@ -1021,8 +1027,6 @@ switch(rc) { case SCST_PREPROCESS_STATUS_ERROR_SENSE_SET: cmd->state = SCST_CMD_STATE_DEV_DONE; - *action = SCST_CMD_STATE_RES_CONT_SAME; - res = -1; break; case SCST_PREPROCESS_STATUS_ERROR_FATAL: set_bit(SCST_CMD_NO_RESP, &cmd->cmd_flags); @@ -1031,8 +1035,6 @@ scst_set_cmd_error(cmd, SCST_LOAD_SENSE(scst_sense_hardw_error)); cmd->state = SCST_CMD_STATE_DEV_DONE; - *action = SCST_CMD_STATE_RES_CONT_SAME; - res = -1; break; default: sBUG(); @@ -1040,8 +1042,9 @@ } } - TRACE_EXIT_RES(res); - return res; +out: + TRACE_EXIT(); + return SCST_CMD_STATE_RES_CONT_SAME; } static void scst_inc_check_expected_sn(struct scst_cmd *cmd) @@ -1892,12 +1895,6 @@ res = SCST_CMD_STATE_RES_CONT_NEXT; - if (cmd->tgtt->pre_exec != NULL) { - rc = scst_tgt_pre_exec(cmd, &res); - if (unlikely(rc != 0)) - goto out; - } - if (unlikely(scst_inc_on_dev_cmd(cmd) != 0)) goto out; @@ -2339,12 +2336,13 @@ } switch (state) { + case SCST_CMD_STATE_XMIT_RESP: case SCST_CMD_STATE_DEV_PARSE: case SCST_CMD_STATE_PREPARE_SPACE: case SCST_CMD_STATE_RDY_TO_XFER: + case SCST_CMD_STATE_PRE_EXEC: case SCST_CMD_STATE_SEND_TO_MIDLEV: case SCST_CMD_STATE_DEV_DONE: - case SCST_CMD_STATE_XMIT_RESP: case SCST_CMD_STATE_FINISHED: cmd->state = state; res = SCST_CMD_STATE_RES_CONT_SAME; @@ -2908,7 +2906,10 @@ switch (cmd->state) { case SCST_CMD_STATE_DEV_PARSE: res = scst_parse_cmd(cmd); - break; + if ((res != SCST_CMD_STATE_RES_CONT_SAME) || + (cmd->state != SCST_CMD_STATE_PREPARE_SPACE)) + break; + /* else go through */ case SCST_CMD_STATE_PREPARE_SPACE: res = scst_prepare_space(cmd); @@ -2918,6 +2919,13 @@ res = scst_rdy_to_xfer(cmd); break; + case SCST_CMD_STATE_PRE_EXEC: + res = scst_tgt_pre_exec(cmd); + if ((res != SCST_CMD_STATE_RES_CONT_SAME) || + (cmd->state != SCST_CMD_STATE_SEND_TO_MIDLEV)) + break; + /* else go through */ + case SCST_CMD_STATE_SEND_TO_MIDLEV: if (tm_dbg_check_cmd(cmd) != 0) { res = SCST_CMD_STATE_RES_CONT_NEXT; @@ -2932,6 +2940,10 @@ case SCST_CMD_STATE_DEV_DONE: res = scst_dev_done(cmd); + if ((res != SCST_CMD_STATE_RES_CONT_SAME) || + (cmd->state != SCST_CMD_STATE_XMIT_RESP)) + break; + /* else go through */ break; case SCST_CMD_STATE_XMIT_RESP: @@ -2959,6 +2971,7 @@ case SCST_CMD_STATE_DEV_PARSE: case SCST_CMD_STATE_PREPARE_SPACE: case SCST_CMD_STATE_RDY_TO_XFER: + case SCST_CMD_STATE_PRE_EXEC: case SCST_CMD_STATE_SEND_TO_MIDLEV: case SCST_CMD_STATE_DEV_DONE: case SCST_CMD_STATE_XMIT_RESP: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |