libata: Signal that our SATL supports WRITE SAME(16) with UNMAP
authorMartin K. Petersen <martin.petersen@oracle.com>
Fri, 10 Sep 2010 05:23:18 +0000 (01:23 -0400)
committerJeff Garzik <jgarzik@redhat.com>
Fri, 22 Oct 2010 00:21:05 +0000 (20:21 -0400)
Until now identifying that a device supports WRITE SAME(16) with the
UNMAP bit set has been black magic.  Implement support for the SBC-3
Thin Provisioning VPD page and set the TPWS bit.

Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/ata/libata-scsi.c

index 56f6224fd6e694d5d93af13da2438ba76c7acd9a..d050e073e57035a99b969c50205a4227ed6a8812 100644 (file)
@@ -1972,6 +1972,7 @@ static unsigned int ata_scsiop_inq_00(struct ata_scsi_args *args, u8 *rbuf)
                0x89,   /* page 0x89, ata info page */
                0xb0,   /* page 0xb0, block limits page */
                0xb1,   /* page 0xb1, block device characteristics page */
+               0xb2,   /* page 0xb2, thin provisioning page */
        };
 
        rbuf[3] = sizeof(pages);        /* number of supported VPD pages */
@@ -2140,6 +2141,16 @@ static unsigned int ata_scsiop_inq_b1(struct ata_scsi_args *args, u8 *rbuf)
        return 0;
 }
 
+static unsigned int ata_scsiop_inq_b2(struct ata_scsi_args *args, u8 *rbuf)
+{
+       /* SCSI Thin Provisioning VPD page: SBC-3 rev 22 or later */
+       rbuf[1] = 0xb2;
+       rbuf[3] = 0x4;
+       rbuf[5] = 1 << 6;       /* TPWS */
+
+       return 0;
+}
+
 /**
  *     ata_scsiop_noop - Command handler that simply returns success.
  *     @args: device IDENTIFY data / SCSI command of interest.
@@ -3252,6 +3263,9 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
                case 0xb1:
                        ata_scsi_rbuf_fill(&args, ata_scsiop_inq_b1);
                        break;
+               case 0xb2:
+                       ata_scsi_rbuf_fill(&args, ata_scsiop_inq_b2);
+                       break;
                default:
                        ata_scsi_invalid_field(cmd, done);
                        break;