4.1-stable review patch.  If anyone has any objections, please let me know.

------------------

From: "Martin K. Petersen" <martin.peter...@oracle.com>

commit f303074160d3401970ccae082014e1ee5a9a52c5 upstream.

Create a sysfs "trim" attribute for each ata_device that displays
whether DSM TRIM is "unsupported", "unqueued", "forced_unqueued"
(blacklisted) or "queued".

Signed-off-by: Martin K. Petersen <martin.peter...@oracle.com>
Reviewed-by: Hannes Reinecke <h...@suse.de>
Signed-off-by: Tejun Heo <t...@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 Documentation/ABI/testing/sysfs-ata |   11 +++++++++++
 drivers/ata/libata-transport.c      |   22 ++++++++++++++++++++++
 2 files changed, 33 insertions(+)

--- a/Documentation/ABI/testing/sysfs-ata
+++ b/Documentation/ABI/testing/sysfs-ata
@@ -90,6 +90,17 @@ gscr
        130:    SATA_PMP_GSCR_SII_GPIO
        Only valid if the device is a PM.
 
+trim
+
+       Shows the DSM TRIM mode currently used by the device. Valid
+       values are:
+       unsupported:            Drive does not support DSM TRIM
+       unqueued:               Drive supports unqueued DSM TRIM only
+       queued:                 Drive supports queued DSM TRIM
+       forced_unqueued:        Drive's unqueued DSM support is known to be
+                               buggy and only unqueued TRIM commands
+                               are sent
+
 spdn_cnt
 
        Number of time libata decided to lower the speed of link due to errors.
--- a/drivers/ata/libata-transport.c
+++ b/drivers/ata/libata-transport.c
@@ -560,6 +560,27 @@ show_ata_dev_gscr(struct device *dev,
 
 static DEVICE_ATTR(gscr, S_IRUGO, show_ata_dev_gscr, NULL);
 
+static ssize_t
+show_ata_dev_trim(struct device *dev,
+                 struct device_attribute *attr, char *buf)
+{
+       struct ata_device *ata_dev = transport_class_to_dev(dev);
+       unsigned char *mode;
+
+       if (!ata_id_has_trim(ata_dev->id))
+               mode = "unsupported";
+       else if (ata_dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM)
+                       mode = "forced_unqueued";
+       else if (ata_fpdma_dsm_supported(ata_dev))
+               mode = "queued";
+       else
+               mode = "unqueued";
+
+       return snprintf(buf, 20, "%s\n", mode);
+}
+
+static DEVICE_ATTR(trim, S_IRUGO, show_ata_dev_trim, NULL);
+
 static DECLARE_TRANSPORT_CLASS(ata_dev_class,
                               "ata_device", NULL, NULL, NULL);
 
@@ -733,6 +754,7 @@ struct scsi_transport_template *ata_atta
        SETUP_DEV_ATTRIBUTE(ering);
        SETUP_DEV_ATTRIBUTE(id);
        SETUP_DEV_ATTRIBUTE(gscr);
+       SETUP_DEV_ATTRIBUTE(trim);
        BUG_ON(count > ATA_DEV_ATTRS);
        i->dev_attrs[count] = NULL;
 


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to