diff options
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r-- | drivers/scsi/sd.c | 37 |
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); |