[PATCH] libata: fix ata_scsi_pass_thru error handling
authorTejun Heo <htejun@gmail.com>
Fri, 2 Dec 2005 02:49:11 +0000 (11:49 +0900)
committerJeff Garzik <jgarzik@pobox.com>
Sun, 4 Dec 2005 01:31:16 +0000 (20:31 -0500)
This patch makes ata_scsi_pass_thru() properly set result code and
sense data on translation failures.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
drivers/scsi/libata-scsi.c

index 3b4ca55a3332eb02c33a6c4afda97bfa7b4f46fc..379e87089764dd4f2f1a4ad70c7abcaab7f6aeea 100644 (file)
@@ -2239,7 +2239,7 @@ ata_scsi_pass_thru(struct ata_queued_cmd *qc, const u8 *scsicmd)
        struct scsi_cmnd *cmd = qc->scsicmd;
 
        if ((tf->protocol = ata_scsi_map_proto(scsicmd[1])) == ATA_PROT_UNKNOWN)
-               return 1;
+               goto invalid_fld;
 
        /*
         * 12 and 16 byte CDBs use different offsets to
@@ -2301,7 +2301,7 @@ ata_scsi_pass_thru(struct ata_queued_cmd *qc, const u8 *scsicmd)
         */
        if ((tf->command == ATA_CMD_SET_FEATURES)
         && (tf->feature == SETFEATURES_XFER))
-               return 1;
+               goto invalid_fld;
 
        /*
         * Set flags so that all registers will be written,
@@ -2322,6 +2322,11 @@ ata_scsi_pass_thru(struct ata_queued_cmd *qc, const u8 *scsicmd)
        qc->nsect = cmd->bufflen / ATA_SECT_SIZE;
 
        return 0;
+
+ invalid_fld:
+       ata_scsi_set_sense(qc->scsicmd, ILLEGAL_REQUEST, 0x24, 0x00);
+       /* "Invalid field in cdb" */
+       return 1;
 }
 
 /**