diff options
Diffstat (limited to 'drivers/scsi/sd.c')
| -rw-r--r-- | drivers/scsi/sd.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index a1a44f52e0e8..5464d467e23e 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
| @@ -206,6 +206,12 @@ cache_type_store(struct device *dev, struct device_attribute *attr, | |||
| 206 | sp = buffer_data[0] & 0x80 ? 1 : 0; | 206 | sp = buffer_data[0] & 0x80 ? 1 : 0; |
| 207 | buffer_data[0] &= ~0x80; | 207 | buffer_data[0] &= ~0x80; |
| 208 | 208 | ||
| 209 | /* | ||
| 210 | * Ensure WP, DPOFUA, and RESERVED fields are cleared in | ||
| 211 | * received mode parameter buffer before doing MODE SELECT. | ||
| 212 | */ | ||
| 213 | data.device_specific = 0; | ||
| 214 | |||
| 209 | if (scsi_mode_select(sdp, 1, sp, 8, buffer_data, len, SD_TIMEOUT, | 215 | if (scsi_mode_select(sdp, 1, sp, 8, buffer_data, len, SD_TIMEOUT, |
| 210 | SD_MAX_RETRIES, &data, &sshdr)) { | 216 | SD_MAX_RETRIES, &data, &sshdr)) { |
| 211 | if (scsi_sense_valid(&sshdr)) | 217 | if (scsi_sense_valid(&sshdr)) |
| @@ -2945,9 +2951,6 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp) | |||
| 2945 | if (rot == 1) { | 2951 | if (rot == 1) { |
| 2946 | blk_queue_flag_set(QUEUE_FLAG_NONROT, q); | 2952 | blk_queue_flag_set(QUEUE_FLAG_NONROT, q); |
| 2947 | blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, q); | 2953 | blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, q); |
| 2948 | } else { | ||
| 2949 | blk_queue_flag_clear(QUEUE_FLAG_NONROT, q); | ||
| 2950 | blk_queue_flag_set(QUEUE_FLAG_ADD_RANDOM, q); | ||
| 2951 | } | 2954 | } |
| 2952 | 2955 | ||
| 2953 | if (sdkp->device->type == TYPE_ZBC) { | 2956 | if (sdkp->device->type == TYPE_ZBC) { |
| @@ -3084,6 +3087,15 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
| 3084 | if (sdkp->media_present) { | 3087 | if (sdkp->media_present) { |
| 3085 | sd_read_capacity(sdkp, buffer); | 3088 | sd_read_capacity(sdkp, buffer); |
| 3086 | 3089 | ||
| 3090 | /* | ||
| 3091 | * set the default to rotational. All non-rotational devices | ||
| 3092 | * support the block characteristics VPD page, which will | ||
| 3093 | * cause this to be updated correctly and any device which | ||
| 3094 | * doesn't support it should be treated as rotational. | ||
| 3095 | */ | ||
| 3096 | blk_queue_flag_clear(QUEUE_FLAG_NONROT, q); | ||
| 3097 | blk_queue_flag_set(QUEUE_FLAG_ADD_RANDOM, q); | ||
| 3098 | |||
| 3087 | if (scsi_device_supports_vpd(sdp)) { | 3099 | if (scsi_device_supports_vpd(sdp)) { |
| 3088 | sd_read_block_provisioning(sdkp); | 3100 | sd_read_block_provisioning(sdkp); |
| 3089 | sd_read_block_limits(sdkp); | 3101 | sd_read_block_limits(sdkp); |
