@@ -2709,6 +2709,9 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
if (buffer[14] & 0x40) /* LBPRZ */
sdkp->lbprz = 1;
+ } else {
+ sdkp->lbpme = 0;
+ sdkp->lbprz = 0;
}
sdkp->capacity = lba + 1;
@@ -3303,12 +3306,9 @@ static void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer)
static unsigned int sd_discard_mode(struct scsi_disk *sdkp)
{
- if (!sdkp->lbpvpd) {
- /* LBP VPD page not provided */
- if (sdkp->max_unmap_blocks)
- return SD_LBP_UNMAP;
- return SD_LBP_WS16;
- }
+ if (!sdkp->lbpvpd)
+ /* Disable discard if LBP VPD page not provided */
+ return SD_LBP_DISABLE;
/* LBP VPD page tells us what to use */
if (sdkp->lbpu && sdkp->max_unmap_blocks)
@@ -3343,8 +3343,12 @@ static void sd_read_block_limits(struct scsi_disk *sdkp,
sdkp->max_ws_blocks = (u32)get_unaligned_be64(&vpd->data[36]);
- if (!sdkp->lbpme)
+ if (!sdkp->lbpme) {
+ sdkp->max_unmap_blocks = 0;
+ sdkp->unmap_granularity = 0;
+ sdkp->unmap_alignment = 0;
goto config_atomic;
+ }
lba_count = get_unaligned_be32(&vpd->data[20]);
desc_count = get_unaligned_be32(&vpd->data[24]);
@@ -3425,8 +3429,13 @@ static void sd_read_block_provisioning(struct scsi_disk *sdkp)
{
struct scsi_vpd *vpd;
- if (sdkp->lbpme == 0)
+ if (!sdkp->lbpme) {
+ sdkp->lbpvpd = 0;
+ sdkp->lbpu = 0;
+ sdkp->lbpws = 0;
+ sdkp->lbpws10 = 0;
return;
+ }
rcu_read_lock();
vpd = rcu_dereference(sdkp->device->vpd_pgb2);