mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 09:44:18 +08:00
[libata scsi] fix read/write translation edge cases
Fix bugs for unlikely edge cases noticed by Douglas Gilbert: - When READ(6)/WRITE(6) sector count == 0, treat it as 256 sectors - For other READ(x)/WRITE(x), when sector count == 0, error. We don't support successfully completing zero-length transfers at this time.
This commit is contained in:
parent
d18d36b4ed
commit
135932651f
@ -630,11 +630,19 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
|
|||||||
tf->lbah = scsicmd[3];
|
tf->lbah = scsicmd[3];
|
||||||
|
|
||||||
VPRINTK("ten-byte command\n");
|
VPRINTK("ten-byte command\n");
|
||||||
|
if (qc->nsect == 0) /* we don't support length==0 cmds */
|
||||||
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scsicmd[0] == READ_6 || scsicmd[0] == WRITE_6) {
|
if (scsicmd[0] == READ_6 || scsicmd[0] == WRITE_6) {
|
||||||
qc->nsect = tf->nsect = scsicmd[4];
|
qc->nsect = tf->nsect = scsicmd[4];
|
||||||
|
if (!qc->nsect) {
|
||||||
|
qc->nsect = 256;
|
||||||
|
if (lba48)
|
||||||
|
tf->hob_nsect = 1;
|
||||||
|
}
|
||||||
|
|
||||||
tf->lbal = scsicmd[3];
|
tf->lbal = scsicmd[3];
|
||||||
tf->lbam = scsicmd[2];
|
tf->lbam = scsicmd[2];
|
||||||
tf->lbah = scsicmd[1] & 0x1f; /* mask out reserved bits */
|
tf->lbah = scsicmd[1] & 0x1f; /* mask out reserved bits */
|
||||||
@ -674,6 +682,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
|
|||||||
tf->lbah = scsicmd[7];
|
tf->lbah = scsicmd[7];
|
||||||
|
|
||||||
VPRINTK("sixteen-byte command\n");
|
VPRINTK("sixteen-byte command\n");
|
||||||
|
if (qc->nsect == 0) /* we don't support length==0 cmds */
|
||||||
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user