You need to sign in or sign up before continuing.
提交 bcd069bb 编写于 作者: M Martin K. Petersen 提交者: Jens Axboe

scsi: sd: Remove LBPRZ dependency for discards

Separating discards and zeroout operations allows us to remove the LBPRZ
block zeroing constraints from discards and honor the device preferences
for UNMAP commands.

If supported by the device, we'll also choose UNMAP over one of the
WRITE SAME variants for discards.
Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: NChristoph Hellwig <hch@lst.de>
Reviewed-by: NHannes Reinecke <hare@suse.com>
Signed-off-by: NJens Axboe <axboe@fb.com>
上级 e6bd9312
...@@ -685,24 +685,11 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode) ...@@ -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 logical_block_size = sdkp->device->sector_size;
unsigned int max_blocks = 0; unsigned int max_blocks = 0;
/* q->limits.discard_alignment =
* When LBPRZ is reported, discard alignment and granularity sdkp->unmap_alignment * logical_block_size;
* must be fixed to the logical block size. Otherwise the block q->limits.discard_granularity =
* layer will drop misaligned portions of the request which can max(sdkp->physical_block_size,
* lead to data corruption. If LBPRZ is not set, we honor the sdkp->unmap_granularity * logical_block_size);
* 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);
}
sdkp->provisioning_mode = mode; sdkp->provisioning_mode = mode;
switch (mode) { switch (mode) {
...@@ -2842,7 +2829,7 @@ static void sd_read_block_limits(struct scsi_disk *sdkp) ...@@ -2842,7 +2829,7 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)
sd_config_discard(sdkp, SD_LBP_WS16); sd_config_discard(sdkp, SD_LBP_WS16);
} else { /* LBP VPD page tells us what to use */ } 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); sd_config_discard(sdkp, SD_LBP_UNMAP);
else if (sdkp->lbpws) else if (sdkp->lbpws)
sd_config_discard(sdkp, SD_LBP_WS16); sd_config_discard(sdkp, SD_LBP_WS16);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册