hpsa: fix 6-byte READ/WRITE with 0 length data xfer
authorStephen M. Cameron <scameron@beardog.cce.hp.com>
Thu, 3 Jul 2014 15:18:14 +0000 (10:18 -0500)
committerChristoph Hellwig <hch@lst.de>
Fri, 25 Jul 2014 21:16:59 +0000 (17:16 -0400)
a 6-byte READ/WRITE CDB with a 0 block data transfer really
means a 256 block data transfer.  The RAID mapping code failed
to handle this case.  For 10/12/16 byte READ/WRITEs, 0 just means
no data should be transferred, and should not trigger BUG_ON.

Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
Reported-by: Robert Elliott <elliott@hp.com>
Reviewed-by: Robert Elliott <elliott@hp.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/hpsa.c

index 1d284730d66b4a2785681462bd00ca3a29a3f85d..6edd2aaacbab51a93fd151b2cc4924e546787956 100644 (file)
@@ -3686,6 +3686,8 @@ static int hpsa_scsi_ioaccel_raid_map(struct ctlr_info *h,
                        (((u64) cmd->cmnd[2]) << 8) |
                        cmd->cmnd[3];
                block_cnt = cmd->cmnd[4];
+               if (block_cnt == 0)
+                       block_cnt = 256;
                break;
        case WRITE_10:
                is_write = 1;
@@ -3734,7 +3736,6 @@ static int hpsa_scsi_ioaccel_raid_map(struct ctlr_info *h,
        default:
                return IO_ACCEL_INELIGIBLE; /* process via normal I/O path */
        }
-       BUG_ON(block_cnt == 0);
        last_block = first_block + block_cnt - 1;
 
        /* check for write to non-RAID-0 */