From: Hannes Reinecke <h...@suse.com>

When evaluating the 'block limits' VPD page we need to check if
the 'lbpme' (logical block provisioning management enable) bit
is set in the READ CAPACITY (16) output.
If it isn't we can safely assume that we cannot use DISCARD on
this device.

[JD: forward-ported to kernel v4.20]

Signed-off-by: Hannes Reinecke <h...@suse.com>
Signed-off-by: Jean Delvare <jdelv...@suse.com>
---
Hannes, please double-check that my forward-port is correct.

 drivers/scsi/sd.c |   11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -411,6 +411,13 @@ provisioning_mode_store(struct device *d
        if (mode < 0)
                return -EINVAL;
 
+       /*
+        * If logical block provisioning isn't enabled we can only
+        * select 'disable' here.
+        */
+       if (!sdkp->lbpme && mode != SD_LBP_DISABLE)
+               return -EINVAL;
+
        sd_config_discard(sdkp, mode);
 
        return count;
@@ -2942,8 +2949,10 @@ static void sd_read_block_limits(struct
 
                sdkp->max_ws_blocks = (u32)get_unaligned_be64(&buffer[36]);
 
-               if (!sdkp->lbpme)
+               if (!sdkp->lbpme) {
+                       sd_config_discard(sdkp, SD_LBP_DISABLE);
                        goto out;
+               }
 
                lba_count = get_unaligned_be32(&buffer[20]);
                desc_count = get_unaligned_be32(&buffer[24]);


-- 
Jean Delvare
SUSE L3 Support

Reply via email to