libata: avoid global response buffer in atapi_qc_complete
We only need to look at 4 bytes of the inquiry response for ATAPI devices. Instead of using the global ata_scsi_rbuf just use a a stack buffer. Also factor the fixup into it's own little helper function to make it more readable. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
fb1b8b1175
commit
aa18da8b7e
|
@ -2873,6 +2873,26 @@ static void atapi_request_sense(struct ata_queued_cmd *qc)
|
|||
DPRINTK("EXIT\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* ATAPI devices typically report zero for their SCSI version, and sometimes
|
||||
* deviate from the spec WRT response data format. If SCSI version is
|
||||
* reported as zero like normal, then we make the following fixups:
|
||||
* 1) Fake MMC-5 version, to indicate to the Linux scsi midlayer this is a
|
||||
* modern device.
|
||||
* 2) Ensure response data format / ATAPI information are always correct.
|
||||
*/
|
||||
static void atapi_fixup_inquiry(struct scsi_cmnd *cmd)
|
||||
{
|
||||
u8 buf[4];
|
||||
|
||||
sg_copy_to_buffer(scsi_sglist(cmd), scsi_sg_count(cmd), buf, 4);
|
||||
if (buf[2] == 0) {
|
||||
buf[2] = 0x5;
|
||||
buf[3] = 0x32;
|
||||
}
|
||||
sg_copy_from_buffer(scsi_sglist(cmd), scsi_sg_count(cmd), buf, 4);
|
||||
}
|
||||
|
||||
static void atapi_qc_complete(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct scsi_cmnd *cmd = qc->scsicmd;
|
||||
|
@ -2927,30 +2947,8 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
|
|||
*/
|
||||
ata_gen_passthru_sense(qc);
|
||||
} else {
|
||||
u8 *scsicmd = cmd->cmnd;
|
||||
|
||||
if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) {
|
||||
unsigned long flags;
|
||||
u8 *buf;
|
||||
|
||||
buf = ata_scsi_rbuf_get(cmd, true, &flags);
|
||||
|
||||
/* ATAPI devices typically report zero for their SCSI version,
|
||||
* and sometimes deviate from the spec WRT response data
|
||||
* format. If SCSI version is reported as zero like normal,
|
||||
* then we make the following fixups: 1) Fake MMC-5 version,
|
||||
* to indicate to the Linux scsi midlayer this is a modern
|
||||
* device. 2) Ensure response data format / ATAPI information
|
||||
* are always correct.
|
||||
*/
|
||||
if (buf[2] == 0) {
|
||||
buf[2] = 0x5;
|
||||
buf[3] = 0x32;
|
||||
}
|
||||
|
||||
ata_scsi_rbuf_put(cmd, true, &flags);
|
||||
}
|
||||
|
||||
if (cmd->cmnd[0] == INQUIRY && (cmd->cmnd[1] & 0x03) == 0)
|
||||
atapi_fixup_inquiry(cmd);
|
||||
cmd->result = SAM_STAT_GOOD;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue