ata: Fix ZBC_OUT command block check
The block (LBA) specified must not exceed the last addressable LBA, which is dev->nr_sectors - 1. So fix the correct check is "if (block >= dev->n_sectors)" and not "if (block > dev->n_sectords)". Additionally, the asc/ascq to return for an LBA that is not a zone start LBA should be ILLEGAL REQUEST, regardless if the bad LBA is out of range. Reported-by: David Butterfield <david.butterfield@wdc.com> Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com> Cc: stable@vger.kernel.org Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
ba44579141
commit
b320a0a9f2
|
@ -3805,8 +3805,13 @@ static unsigned int ata_scsi_zbc_out_xlat(struct ata_queued_cmd *qc)
|
||||||
*/
|
*/
|
||||||
goto invalid_param_len;
|
goto invalid_param_len;
|
||||||
}
|
}
|
||||||
if (block > dev->n_sectors)
|
if (block >= dev->n_sectors) {
|
||||||
goto out_of_range;
|
/*
|
||||||
|
* Block must be a valid zone ID (a zone start LBA).
|
||||||
|
*/
|
||||||
|
fp = 2;
|
||||||
|
goto invalid_fld;
|
||||||
|
}
|
||||||
|
|
||||||
all = cdb[14] & 0x1;
|
all = cdb[14] & 0x1;
|
||||||
|
|
||||||
|
@ -3837,10 +3842,6 @@ static unsigned int ata_scsi_zbc_out_xlat(struct ata_queued_cmd *qc)
|
||||||
invalid_fld:
|
invalid_fld:
|
||||||
ata_scsi_set_invalid_field(qc->dev, scmd, fp, 0xff);
|
ata_scsi_set_invalid_field(qc->dev, scmd, fp, 0xff);
|
||||||
return 1;
|
return 1;
|
||||||
out_of_range:
|
|
||||||
/* "Logical Block Address out of range" */
|
|
||||||
ata_scsi_set_sense(qc->dev, scmd, ILLEGAL_REQUEST, 0x21, 0x00);
|
|
||||||
return 1;
|
|
||||||
invalid_param_len:
|
invalid_param_len:
|
||||||
/* "Parameter list length error" */
|
/* "Parameter list length error" */
|
||||||
ata_scsi_set_sense(qc->dev, scmd, ILLEGAL_REQUEST, 0x1a, 0x0);
|
ata_scsi_set_sense(qc->dev, scmd, ILLEGAL_REQUEST, 0x1a, 0x0);
|
||||||
|
|
Loading…
Reference in New Issue