|
@@ -685,24 +685,11 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)
|
|
|
unsigned int logical_block_size = sdkp->device->sector_size;
|
|
|
unsigned int max_blocks = 0;
|
|
|
|
|
|
- /*
|
|
|
- * When LBPRZ is reported, discard alignment and granularity
|
|
|
- * must be fixed to the logical block size. Otherwise the block
|
|
|
- * layer will drop misaligned portions of the request which can
|
|
|
- * lead to data corruption. If LBPRZ is not set, we honor the
|
|
|
- * device preference.
|
|
|
- */
|
|
|
- if (sdkp->lbprz) {
|
|
|
- q->limits.discard_alignment = 0;
|
|
|
- q->limits.discard_granularity = logical_block_size;
|
|
|
- } else {
|
|
|
- q->limits.discard_alignment = sdkp->unmap_alignment *
|
|
|
- logical_block_size;
|
|
|
- q->limits.discard_granularity =
|
|
|
- max(sdkp->physical_block_size,
|
|
|
- sdkp->unmap_granularity * logical_block_size);
|
|
|
- }
|
|
|
-
|
|
|
+ q->limits.discard_alignment =
|
|
|
+ sdkp->unmap_alignment * logical_block_size;
|
|
|
+ q->limits.discard_granularity =
|
|
|
+ max(sdkp->physical_block_size,
|
|
|
+ sdkp->unmap_granularity * logical_block_size);
|
|
|
sdkp->provisioning_mode = mode;
|
|
|
|
|
|
switch (mode) {
|
|
@@ -2842,7 +2829,7 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)
|
|
|
sd_config_discard(sdkp, SD_LBP_WS16);
|
|
|
|
|
|
} else { /* LBP VPD page tells us what to use */
|
|
|
- if (sdkp->lbpu && sdkp->max_unmap_blocks && !sdkp->lbprz)
|
|
|
+ if (sdkp->lbpu && sdkp->max_unmap_blocks)
|
|
|
sd_config_discard(sdkp, SD_LBP_UNMAP);
|
|
|
else if (sdkp->lbpws)
|
|
|
sd_config_discard(sdkp, SD_LBP_WS16);
|