target: add support for START_STOP_UNIT SCSI opcode
AIX servers using VIOS servers that virtualize FC cards will have a problem booting without support for START_STOP_UNIT. Cite sbc3r36 exactly, clean up if conditions (rob + hch) Signed-off-by: Brian Bunker <brian@purestorage.com> Signed-off-by: Spencer Baugh <sbaugh@catern.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Cc: "Robert Elliott (Server Storage)" <Elliott@hp.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
Родитель
568e1f6524
Коммит
45182ed576
|
@ -154,6 +154,38 @@ sbc_emulate_readcapacity_16(struct se_cmd *cmd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static sense_reason_t
|
||||||
|
sbc_emulate_startstop(struct se_cmd *cmd)
|
||||||
|
{
|
||||||
|
unsigned char *cdb = cmd->t_task_cdb;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See sbc3r36 section 5.25
|
||||||
|
* Immediate bit should be set since there is nothing to complete
|
||||||
|
* POWER CONDITION MODIFIER 0h
|
||||||
|
*/
|
||||||
|
if (!(cdb[1] & 1) || cdb[2] || cdb[3])
|
||||||
|
return TCM_INVALID_CDB_FIELD;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See sbc3r36 section 5.25
|
||||||
|
* POWER CONDITION 0h START_VALID - process START and LOEJ
|
||||||
|
*/
|
||||||
|
if (cdb[4] >> 4 & 0xf)
|
||||||
|
return TCM_INVALID_CDB_FIELD;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See sbc3r36 section 5.25
|
||||||
|
* LOEJ 0h - nothing to load or unload
|
||||||
|
* START 1h - we are ready
|
||||||
|
*/
|
||||||
|
if (!(cdb[4] & 1) || (cdb[4] & 2) || (cdb[4] & 4))
|
||||||
|
return TCM_INVALID_CDB_FIELD;
|
||||||
|
|
||||||
|
target_complete_cmd(cmd, SAM_STAT_GOOD);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
sector_t sbc_get_write_same_sectors(struct se_cmd *cmd)
|
sector_t sbc_get_write_same_sectors(struct se_cmd *cmd)
|
||||||
{
|
{
|
||||||
u32 num_blocks;
|
u32 num_blocks;
|
||||||
|
@ -1069,6 +1101,10 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
|
||||||
size = 0;
|
size = 0;
|
||||||
cmd->execute_cmd = sbc_emulate_noop;
|
cmd->execute_cmd = sbc_emulate_noop;
|
||||||
break;
|
break;
|
||||||
|
case START_STOP:
|
||||||
|
size = 0;
|
||||||
|
cmd->execute_cmd = sbc_emulate_startstop;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ret = spc_parse_cdb(cmd, &size);
|
ret = spc_parse_cdb(cmd, &size);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче