diff --git a/scst/src/dev_handlers/scst_cdrom.c b/scst/src/dev_handlers/scst_cdrom.c index 107711ed5..22c34abc5 100644 --- a/scst/src/dev_handlers/scst_cdrom.c +++ b/scst/src/dev_handlers/scst_cdrom.c @@ -199,12 +199,16 @@ static int cdrom_get_block_shift(struct scst_cmd *cmd) static int cdrom_parse(struct scst_cmd *cmd) { - int res = SCST_CMD_STATE_DEFAULT; + int res = SCST_CMD_STATE_DEFAULT, rc; - scst_cdrom_generic_parse(cmd, cdrom_get_block_shift); + rc = scst_cdrom_generic_parse(cmd, cdrom_get_block_shift); + if (rc != 0) { + res = scst_get_cmd_abnormal_done_state(cmd); + goto out; + } cmd->retries = SCST_PASSTHROUGH_RETRIES; - +out: return res; } diff --git a/scst/src/dev_handlers/scst_changer.c b/scst/src/dev_handlers/scst_changer.c index 9757d3b30..f2a03cdb4 100644 --- a/scst/src/dev_handlers/scst_changer.c +++ b/scst/src/dev_handlers/scst_changer.c @@ -122,12 +122,16 @@ void changer_detach(struct scst_device *dev) static int changer_parse(struct scst_cmd *cmd) { - int res = SCST_CMD_STATE_DEFAULT; + int res = SCST_CMD_STATE_DEFAULT, rc; - scst_changer_generic_parse(cmd, NULL); + rc = scst_changer_generic_parse(cmd, NULL); + if (rc != 0) { + res = scst_get_cmd_abnormal_done_state(cmd); + goto out; + } cmd->retries = SCST_PASSTHROUGH_RETRIES; - +out: return res; } diff --git a/scst/src/dev_handlers/scst_disk.c b/scst/src/dev_handlers/scst_disk.c index f9cdd948a..81ad37c39 100644 --- a/scst/src/dev_handlers/scst_disk.c +++ b/scst/src/dev_handlers/scst_disk.c @@ -291,12 +291,16 @@ static int disk_get_block_shift(struct scst_cmd *cmd) static int disk_parse(struct scst_cmd *cmd) { - int res = SCST_CMD_STATE_DEFAULT; + int res = SCST_CMD_STATE_DEFAULT, rc; - scst_sbc_generic_parse(cmd, disk_get_block_shift); + rc = scst_sbc_generic_parse(cmd, disk_get_block_shift); + if (rc != 0) { + res = scst_get_cmd_abnormal_done_state(cmd); + goto out; + } cmd->retries = SCST_PASSTHROUGH_RETRIES; - +out: return res; } diff --git a/scst/src/dev_handlers/scst_modisk.c b/scst/src/dev_handlers/scst_modisk.c index 7e2198697..88fbf320b 100644 --- a/scst/src/dev_handlers/scst_modisk.c +++ b/scst/src/dev_handlers/scst_modisk.c @@ -297,12 +297,16 @@ static int modisk_get_block_shift(struct scst_cmd *cmd) static int modisk_parse(struct scst_cmd *cmd) { - int res = SCST_CMD_STATE_DEFAULT; + int res = SCST_CMD_STATE_DEFAULT, rc; - scst_modisk_generic_parse(cmd, modisk_get_block_shift); + rc = scst_modisk_generic_parse(cmd, modisk_get_block_shift); + if (rc != 0) { + res = scst_get_cmd_abnormal_done_state(cmd); + goto out; + } cmd->retries = SCST_PASSTHROUGH_RETRIES; - +out: return res; } diff --git a/scst/src/dev_handlers/scst_processor.c b/scst/src/dev_handlers/scst_processor.c index df53492a6..d18e192ba 100644 --- a/scst/src/dev_handlers/scst_processor.c +++ b/scst/src/dev_handlers/scst_processor.c @@ -122,12 +122,16 @@ void processor_detach(struct scst_device *dev) static int processor_parse(struct scst_cmd *cmd) { - int res = SCST_CMD_STATE_DEFAULT; + int res = SCST_CMD_STATE_DEFAULT, rc; - scst_processor_generic_parse(cmd, NULL); + rc = scst_processor_generic_parse(cmd, NULL); + if (rc != 0) { + res = scst_get_cmd_abnormal_done_state(cmd); + goto out; + } cmd->retries = SCST_PASSTHROUGH_RETRIES; - +out: return res; } diff --git a/scst/src/dev_handlers/scst_raid.c b/scst/src/dev_handlers/scst_raid.c index 6fddb4c25..3e8df45d8 100644 --- a/scst/src/dev_handlers/scst_raid.c +++ b/scst/src/dev_handlers/scst_raid.c @@ -122,12 +122,16 @@ void raid_detach(struct scst_device *dev) static int raid_parse(struct scst_cmd *cmd) { - int res = SCST_CMD_STATE_DEFAULT; + int res = SCST_CMD_STATE_DEFAULT, rc; - scst_raid_generic_parse(cmd, NULL); + rc = scst_raid_generic_parse(cmd, NULL); + if (rc != 0) { + res = scst_get_cmd_abnormal_done_state(cmd); + goto out; + } cmd->retries = SCST_PASSTHROUGH_RETRIES; - +out: return res; } diff --git a/scst/src/dev_handlers/scst_tape.c b/scst/src/dev_handlers/scst_tape.c index ff8ebd9fb..244389763 100644 --- a/scst/src/dev_handlers/scst_tape.c +++ b/scst/src/dev_handlers/scst_tape.c @@ -284,12 +284,16 @@ static int tape_get_block_size(struct scst_cmd *cmd) static int tape_parse(struct scst_cmd *cmd) { - int res = SCST_CMD_STATE_DEFAULT; + int res = SCST_CMD_STATE_DEFAULT, rc; - scst_tape_generic_parse(cmd, tape_get_block_size); + rc = scst_tape_generic_parse(cmd, tape_get_block_size); + if (rc != 0) { + res = scst_get_cmd_abnormal_done_state(cmd); + goto out; + } cmd->retries = SCST_PASSTHROUGH_RETRIES; - +out: return res; } diff --git a/scst/src/dev_handlers/scst_user.c b/scst/src/dev_handlers/scst_user.c index 38bceabca..12d62bd87 100644 --- a/scst/src/dev_handlers/scst_user.c +++ b/scst/src/dev_handlers/scst_user.c @@ -788,8 +788,10 @@ static int dev_user_parse(struct scst_cmd *cmd) case SCST_USER_PARSE_STANDARD: TRACE_DBG("PARSE STANDARD: ucmd %p", ucmd); rc = dev->generic_parse(cmd, dev_user_get_block); - if (rc != 0) - goto out_invalid; + if (rc != 0) { + PRINT_ERROR("PARSE failed (ucmd %p, rc %d)", ucmd, rc); + goto out_error; + } break; case SCST_USER_PARSE_EXCEPTION: @@ -855,10 +857,6 @@ out: TRACE_EXIT_RES(res); return res; -out_invalid: - PRINT_ERROR("PARSE failed (ucmd %p, rc %d)", ucmd, rc); - scst_set_cmd_error(cmd, SCST_LOAD_SENSE(scst_sense_invalid_opcode)); - out_error: res = scst_get_cmd_abnormal_done_state(cmd); goto out; diff --git a/scst/src/dev_handlers/scst_vdisk.c b/scst/src/dev_handlers/scst_vdisk.c index 572d6209e..f602605a3 100644 --- a/scst/src/dev_handlers/scst_vdisk.c +++ b/scst/src/dev_handlers/scst_vdisk.c @@ -1282,21 +1282,45 @@ static int vdisk_get_block_shift(struct scst_cmd *cmd) static int vdisk_parse(struct scst_cmd *cmd) { - scst_sbc_generic_parse(cmd, vdisk_get_block_shift); - return fileio_alloc_and_parse(cmd); + int res, rc; + + rc = scst_sbc_generic_parse(cmd, vdisk_get_block_shift); + if (rc != 0) { + res = scst_get_cmd_abnormal_done_state(cmd); + goto out; + } + + res = fileio_alloc_and_parse(cmd); +out: + return res; } static int vcdrom_parse(struct scst_cmd *cmd) { - scst_cdrom_generic_parse(cmd, vdisk_get_block_shift); - return fileio_alloc_and_parse(cmd); + int res, rc; + rc = scst_cdrom_generic_parse(cmd, vdisk_get_block_shift); + if (rc != 0) { + res = scst_get_cmd_abnormal_done_state(cmd); + goto out; + } + + res = fileio_alloc_and_parse(cmd); +out: + return res; } /* blockio and nullio */ static int non_fileio_parse(struct scst_cmd *cmd) { - scst_sbc_generic_parse(cmd, vdisk_get_block_shift); - return SCST_CMD_STATE_DEFAULT; + int res = SCST_CMD_STATE_DEFAULT, rc; + + rc = scst_sbc_generic_parse(cmd, vdisk_get_block_shift); + if (rc != 0) { + res = scst_get_cmd_abnormal_done_state(cmd); + goto out; + } +out: + return res; } #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)