aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/sd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r--drivers/scsi/sd.c37
1 files changed, 26 insertions, 11 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 11c1738c2100..d175c5c5ccf8 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -715,13 +715,21 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)
715 break; 715 break;
716 716
717 case SD_LBP_WS16: 717 case SD_LBP_WS16:
718 max_blocks = min_not_zero(sdkp->max_ws_blocks, 718 if (sdkp->device->unmap_limit_for_ws)
719 (u32)SD_MAX_WS16_BLOCKS); 719 max_blocks = sdkp->max_unmap_blocks;
720 else
721 max_blocks = sdkp->max_ws_blocks;
722
723 max_blocks = min_not_zero(max_blocks, (u32)SD_MAX_WS16_BLOCKS);
720 break; 724 break;
721 725
722 case SD_LBP_WS10: 726 case SD_LBP_WS10:
723 max_blocks = min_not_zero(sdkp->max_ws_blocks, 727 if (sdkp->device->unmap_limit_for_ws)
724 (u32)SD_MAX_WS10_BLOCKS); 728 max_blocks = sdkp->max_unmap_blocks;
729 else
730 max_blocks = sdkp->max_ws_blocks;
731
732 max_blocks = min_not_zero(max_blocks, (u32)SD_MAX_WS10_BLOCKS);
725 break; 733 break;
726 734
727 case SD_LBP_ZERO: 735 case SD_LBP_ZERO:
@@ -2915,8 +2923,6 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)
2915 sd_config_discard(sdkp, SD_LBP_WS16); 2923 sd_config_discard(sdkp, SD_LBP_WS16);
2916 else if (sdkp->lbpws10) 2924 else if (sdkp->lbpws10)
2917 sd_config_discard(sdkp, SD_LBP_WS10); 2925 sd_config_discard(sdkp, SD_LBP_WS10);
2918 else if (sdkp->lbpu && sdkp->max_unmap_blocks)
2919 sd_config_discard(sdkp, SD_LBP_UNMAP);
2920 else 2926 else
2921 sd_config_discard(sdkp, SD_LBP_DISABLE); 2927 sd_config_discard(sdkp, SD_LBP_DISABLE);
2922 } 2928 }
@@ -3101,8 +3107,6 @@ static int sd_revalidate_disk(struct gendisk *disk)
3101 sd_read_security(sdkp, buffer); 3107 sd_read_security(sdkp, buffer);
3102 } 3108 }
3103 3109
3104 sdkp->first_scan = 0;
3105
3106 /* 3110 /*
3107 * We now have all cache related info, determine how we deal 3111 * We now have all cache related info, determine how we deal
3108 * with flush requests. 3112 * with flush requests.
@@ -3117,7 +3121,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
3117 q->limits.max_dev_sectors = logical_to_sectors(sdp, dev_max); 3121 q->limits.max_dev_sectors = logical_to_sectors(sdp, dev_max);
3118 3122
3119 /* 3123 /*
3120 * Use the device's preferred I/O size for reads and writes 3124 * Determine the device's preferred I/O size for reads and writes
3121 * unless the reported value is unreasonably small, large, or 3125 * unless the reported value is unreasonably small, large, or
3122 * garbage. 3126 * garbage.
3123 */ 3127 */
@@ -3131,8 +3135,19 @@ static int sd_revalidate_disk(struct gendisk *disk)
3131 rw_max = min_not_zero(logical_to_sectors(sdp, dev_max), 3135 rw_max = min_not_zero(logical_to_sectors(sdp, dev_max),
3132 (sector_t)BLK_DEF_MAX_SECTORS); 3136 (sector_t)BLK_DEF_MAX_SECTORS);
3133 3137
3134 /* Combine with controller limits */ 3138 /* Do not exceed controller limit */
3135 q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q)); 3139 rw_max = min(rw_max, queue_max_hw_sectors(q));
3140
3141 /*
3142 * Only update max_sectors if previously unset or if the current value
3143 * exceeds the capabilities of the hardware.
3144 */
3145 if (sdkp->first_scan ||
3146 q->limits.max_sectors > q->limits.max_dev_sectors ||
3147 q->limits.max_sectors > q->limits.max_hw_sectors)
3148 q->limits.max_sectors = rw_max;
3149
3150 sdkp->first_scan = 0;
3136 3151
3137 set_capacity(disk, logical_to_sectors(sdp, sdkp->capacity)); 3152 set_capacity(disk, logical_to_sectors(sdp, sdkp->capacity));
3138 sd_config_write_same(sdkp); 3153 sd_config_write_same(sdkp);