diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/scsi/sd.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r-- | drivers/scsi/sd.c | 515 |
1 files changed, 383 insertions, 132 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index ffa0689ee840..953773cb26d9 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -46,7 +46,6 @@ | |||
46 | #include <linux/blkdev.h> | 46 | #include <linux/blkdev.h> |
47 | #include <linux/blkpg.h> | 47 | #include <linux/blkpg.h> |
48 | #include <linux/delay.h> | 48 | #include <linux/delay.h> |
49 | #include <linux/smp_lock.h> | ||
50 | #include <linux/mutex.h> | 49 | #include <linux/mutex.h> |
51 | #include <linux/string_helpers.h> | 50 | #include <linux/string_helpers.h> |
52 | #include <linux/async.h> | 51 | #include <linux/async.h> |
@@ -97,6 +96,7 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_RBC); | |||
97 | #define SD_MINORS 0 | 96 | #define SD_MINORS 0 |
98 | #endif | 97 | #endif |
99 | 98 | ||
99 | static void sd_config_discard(struct scsi_disk *, unsigned int); | ||
100 | static int sd_revalidate_disk(struct gendisk *); | 100 | static int sd_revalidate_disk(struct gendisk *); |
101 | static void sd_unlock_native_capacity(struct gendisk *disk); | 101 | static void sd_unlock_native_capacity(struct gendisk *disk); |
102 | static int sd_probe(struct device *); | 102 | static int sd_probe(struct device *); |
@@ -259,6 +259,28 @@ sd_show_protection_type(struct device *dev, struct device_attribute *attr, | |||
259 | } | 259 | } |
260 | 260 | ||
261 | static ssize_t | 261 | static ssize_t |
262 | sd_show_protection_mode(struct device *dev, struct device_attribute *attr, | ||
263 | char *buf) | ||
264 | { | ||
265 | struct scsi_disk *sdkp = to_scsi_disk(dev); | ||
266 | struct scsi_device *sdp = sdkp->device; | ||
267 | unsigned int dif, dix; | ||
268 | |||
269 | dif = scsi_host_dif_capable(sdp->host, sdkp->protection_type); | ||
270 | dix = scsi_host_dix_capable(sdp->host, sdkp->protection_type); | ||
271 | |||
272 | if (!dix && scsi_host_dix_capable(sdp->host, SD_DIF_TYPE0_PROTECTION)) { | ||
273 | dif = 0; | ||
274 | dix = 1; | ||
275 | } | ||
276 | |||
277 | if (!dif && !dix) | ||
278 | return snprintf(buf, 20, "none\n"); | ||
279 | |||
280 | return snprintf(buf, 20, "%s%u\n", dix ? "dix" : "dif", dif); | ||
281 | } | ||
282 | |||
283 | static ssize_t | ||
262 | sd_show_app_tag_own(struct device *dev, struct device_attribute *attr, | 284 | sd_show_app_tag_own(struct device *dev, struct device_attribute *attr, |
263 | char *buf) | 285 | char *buf) |
264 | { | 286 | { |
@@ -273,7 +295,54 @@ sd_show_thin_provisioning(struct device *dev, struct device_attribute *attr, | |||
273 | { | 295 | { |
274 | struct scsi_disk *sdkp = to_scsi_disk(dev); | 296 | struct scsi_disk *sdkp = to_scsi_disk(dev); |
275 | 297 | ||
276 | return snprintf(buf, 20, "%u\n", sdkp->thin_provisioning); | 298 | return snprintf(buf, 20, "%u\n", sdkp->lbpme); |
299 | } | ||
300 | |||
301 | static const char *lbp_mode[] = { | ||
302 | [SD_LBP_FULL] = "full", | ||
303 | [SD_LBP_UNMAP] = "unmap", | ||
304 | [SD_LBP_WS16] = "writesame_16", | ||
305 | [SD_LBP_WS10] = "writesame_10", | ||
306 | [SD_LBP_ZERO] = "writesame_zero", | ||
307 | [SD_LBP_DISABLE] = "disabled", | ||
308 | }; | ||
309 | |||
310 | static ssize_t | ||
311 | sd_show_provisioning_mode(struct device *dev, struct device_attribute *attr, | ||
312 | char *buf) | ||
313 | { | ||
314 | struct scsi_disk *sdkp = to_scsi_disk(dev); | ||
315 | |||
316 | return snprintf(buf, 20, "%s\n", lbp_mode[sdkp->provisioning_mode]); | ||
317 | } | ||
318 | |||
319 | static ssize_t | ||
320 | sd_store_provisioning_mode(struct device *dev, struct device_attribute *attr, | ||
321 | const char *buf, size_t count) | ||
322 | { | ||
323 | struct scsi_disk *sdkp = to_scsi_disk(dev); | ||
324 | struct scsi_device *sdp = sdkp->device; | ||
325 | |||
326 | if (!capable(CAP_SYS_ADMIN)) | ||
327 | return -EACCES; | ||
328 | |||
329 | if (sdp->type != TYPE_DISK) | ||
330 | return -EINVAL; | ||
331 | |||
332 | if (!strncmp(buf, lbp_mode[SD_LBP_UNMAP], 20)) | ||
333 | sd_config_discard(sdkp, SD_LBP_UNMAP); | ||
334 | else if (!strncmp(buf, lbp_mode[SD_LBP_WS16], 20)) | ||
335 | sd_config_discard(sdkp, SD_LBP_WS16); | ||
336 | else if (!strncmp(buf, lbp_mode[SD_LBP_WS10], 20)) | ||
337 | sd_config_discard(sdkp, SD_LBP_WS10); | ||
338 | else if (!strncmp(buf, lbp_mode[SD_LBP_ZERO], 20)) | ||
339 | sd_config_discard(sdkp, SD_LBP_ZERO); | ||
340 | else if (!strncmp(buf, lbp_mode[SD_LBP_DISABLE], 20)) | ||
341 | sd_config_discard(sdkp, SD_LBP_DISABLE); | ||
342 | else | ||
343 | return -EINVAL; | ||
344 | |||
345 | return count; | ||
277 | } | 346 | } |
278 | 347 | ||
279 | static struct device_attribute sd_disk_attrs[] = { | 348 | static struct device_attribute sd_disk_attrs[] = { |
@@ -285,8 +354,11 @@ static struct device_attribute sd_disk_attrs[] = { | |||
285 | __ATTR(manage_start_stop, S_IRUGO|S_IWUSR, sd_show_manage_start_stop, | 354 | __ATTR(manage_start_stop, S_IRUGO|S_IWUSR, sd_show_manage_start_stop, |
286 | sd_store_manage_start_stop), | 355 | sd_store_manage_start_stop), |
287 | __ATTR(protection_type, S_IRUGO, sd_show_protection_type, NULL), | 356 | __ATTR(protection_type, S_IRUGO, sd_show_protection_type, NULL), |
357 | __ATTR(protection_mode, S_IRUGO, sd_show_protection_mode, NULL), | ||
288 | __ATTR(app_tag_own, S_IRUGO, sd_show_app_tag_own, NULL), | 358 | __ATTR(app_tag_own, S_IRUGO, sd_show_app_tag_own, NULL), |
289 | __ATTR(thin_provisioning, S_IRUGO, sd_show_thin_provisioning, NULL), | 359 | __ATTR(thin_provisioning, S_IRUGO, sd_show_thin_provisioning, NULL), |
360 | __ATTR(provisioning_mode, S_IRUGO|S_IWUSR, sd_show_provisioning_mode, | ||
361 | sd_store_provisioning_mode), | ||
290 | __ATTR_NULL, | 362 | __ATTR_NULL, |
291 | }; | 363 | }; |
292 | 364 | ||
@@ -411,6 +483,50 @@ static void sd_prot_op(struct scsi_cmnd *scmd, unsigned int dif) | |||
411 | scsi_set_prot_type(scmd, dif); | 483 | scsi_set_prot_type(scmd, dif); |
412 | } | 484 | } |
413 | 485 | ||
486 | static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode) | ||
487 | { | ||
488 | struct request_queue *q = sdkp->disk->queue; | ||
489 | unsigned int logical_block_size = sdkp->device->sector_size; | ||
490 | unsigned int max_blocks = 0; | ||
491 | |||
492 | q->limits.discard_zeroes_data = sdkp->lbprz; | ||
493 | q->limits.discard_alignment = sdkp->unmap_alignment * | ||
494 | logical_block_size; | ||
495 | q->limits.discard_granularity = | ||
496 | max(sdkp->physical_block_size, | ||
497 | sdkp->unmap_granularity * logical_block_size); | ||
498 | |||
499 | switch (mode) { | ||
500 | |||
501 | case SD_LBP_DISABLE: | ||
502 | q->limits.max_discard_sectors = 0; | ||
503 | queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, q); | ||
504 | return; | ||
505 | |||
506 | case SD_LBP_UNMAP: | ||
507 | max_blocks = min_not_zero(sdkp->max_unmap_blocks, 0xffffffff); | ||
508 | break; | ||
509 | |||
510 | case SD_LBP_WS16: | ||
511 | max_blocks = min_not_zero(sdkp->max_ws_blocks, 0xffffffff); | ||
512 | break; | ||
513 | |||
514 | case SD_LBP_WS10: | ||
515 | max_blocks = min_not_zero(sdkp->max_ws_blocks, (u32)0xffff); | ||
516 | break; | ||
517 | |||
518 | case SD_LBP_ZERO: | ||
519 | max_blocks = min_not_zero(sdkp->max_ws_blocks, (u32)0xffff); | ||
520 | q->limits.discard_zeroes_data = 1; | ||
521 | break; | ||
522 | } | ||
523 | |||
524 | q->limits.max_discard_sectors = max_blocks * (logical_block_size >> 9); | ||
525 | queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q); | ||
526 | |||
527 | sdkp->provisioning_mode = mode; | ||
528 | } | ||
529 | |||
414 | /** | 530 | /** |
415 | * scsi_setup_discard_cmnd - unmap blocks on thinly provisioned device | 531 | * scsi_setup_discard_cmnd - unmap blocks on thinly provisioned device |
416 | * @sdp: scsi device to operate one | 532 | * @sdp: scsi device to operate one |
@@ -427,6 +543,7 @@ static int scsi_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq) | |||
427 | unsigned int nr_sectors = bio_sectors(bio); | 543 | unsigned int nr_sectors = bio_sectors(bio); |
428 | unsigned int len; | 544 | unsigned int len; |
429 | int ret; | 545 | int ret; |
546 | char *buf; | ||
430 | struct page *page; | 547 | struct page *page; |
431 | 548 | ||
432 | if (sdkp->device->sector_size == 4096) { | 549 | if (sdkp->device->sector_size == 4096) { |
@@ -442,8 +559,9 @@ static int scsi_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq) | |||
442 | if (!page) | 559 | if (!page) |
443 | return BLKPREP_DEFER; | 560 | return BLKPREP_DEFER; |
444 | 561 | ||
445 | if (sdkp->unmap) { | 562 | switch (sdkp->provisioning_mode) { |
446 | char *buf = page_address(page); | 563 | case SD_LBP_UNMAP: |
564 | buf = page_address(page); | ||
447 | 565 | ||
448 | rq->cmd_len = 10; | 566 | rq->cmd_len = 10; |
449 | rq->cmd[0] = UNMAP; | 567 | rq->cmd[0] = UNMAP; |
@@ -455,7 +573,9 @@ static int scsi_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq) | |||
455 | put_unaligned_be32(nr_sectors, &buf[16]); | 573 | put_unaligned_be32(nr_sectors, &buf[16]); |
456 | 574 | ||
457 | len = 24; | 575 | len = 24; |
458 | } else { | 576 | break; |
577 | |||
578 | case SD_LBP_WS16: | ||
459 | rq->cmd_len = 16; | 579 | rq->cmd_len = 16; |
460 | rq->cmd[0] = WRITE_SAME_16; | 580 | rq->cmd[0] = WRITE_SAME_16; |
461 | rq->cmd[1] = 0x8; /* UNMAP */ | 581 | rq->cmd[1] = 0x8; /* UNMAP */ |
@@ -463,11 +583,30 @@ static int scsi_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq) | |||
463 | put_unaligned_be32(nr_sectors, &rq->cmd[10]); | 583 | put_unaligned_be32(nr_sectors, &rq->cmd[10]); |
464 | 584 | ||
465 | len = sdkp->device->sector_size; | 585 | len = sdkp->device->sector_size; |
586 | break; | ||
587 | |||
588 | case SD_LBP_WS10: | ||
589 | case SD_LBP_ZERO: | ||
590 | rq->cmd_len = 10; | ||
591 | rq->cmd[0] = WRITE_SAME; | ||
592 | if (sdkp->provisioning_mode == SD_LBP_WS10) | ||
593 | rq->cmd[1] = 0x8; /* UNMAP */ | ||
594 | put_unaligned_be32(sector, &rq->cmd[2]); | ||
595 | put_unaligned_be16(nr_sectors, &rq->cmd[7]); | ||
596 | |||
597 | len = sdkp->device->sector_size; | ||
598 | break; | ||
599 | |||
600 | default: | ||
601 | ret = BLKPREP_KILL; | ||
602 | goto out; | ||
466 | } | 603 | } |
467 | 604 | ||
468 | blk_add_request_payload(rq, page, len); | 605 | blk_add_request_payload(rq, page, len); |
469 | ret = scsi_setup_blk_pc_cmnd(sdp, rq); | 606 | ret = scsi_setup_blk_pc_cmnd(sdp, rq); |
470 | rq->buffer = page_address(page); | 607 | rq->buffer = page_address(page); |
608 | |||
609 | out: | ||
471 | if (ret != BLKPREP_OK) { | 610 | if (ret != BLKPREP_OK) { |
472 | __free_page(page); | 611 | __free_page(page); |
473 | rq->buffer = NULL; | 612 | rq->buffer = NULL; |
@@ -477,7 +616,7 @@ static int scsi_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq) | |||
477 | 616 | ||
478 | static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq) | 617 | static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq) |
479 | { | 618 | { |
480 | rq->timeout = SD_TIMEOUT; | 619 | rq->timeout = SD_FLUSH_TIMEOUT; |
481 | rq->retries = SD_MAX_RETRIES; | 620 | rq->retries = SD_MAX_RETRIES; |
482 | rq->cmd[0] = SYNCHRONIZE_CACHE; | 621 | rq->cmd[0] = SYNCHRONIZE_CACHE; |
483 | rq->cmd_len = 10; | 622 | rq->cmd_len = 10; |
@@ -561,7 +700,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
561 | * quietly refuse to do anything to a changed disc until | 700 | * quietly refuse to do anything to a changed disc until |
562 | * the changed bit has been reset | 701 | * the changed bit has been reset |
563 | */ | 702 | */ |
564 | /* printk("SCSI disk has been changed. Prohibiting further I/O.\n"); */ | 703 | /* printk("SCSI disk has been changed or is not present. Prohibiting further I/O.\n"); */ |
565 | goto out; | 704 | goto out; |
566 | } | 705 | } |
567 | 706 | ||
@@ -917,7 +1056,7 @@ static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
917 | * @arg: this is third argument given to ioctl(2) system call. | 1056 | * @arg: this is third argument given to ioctl(2) system call. |
918 | * Often contains a pointer. | 1057 | * Often contains a pointer. |
919 | * | 1058 | * |
920 | * Returns 0 if successful (some ioctls return postive numbers on | 1059 | * Returns 0 if successful (some ioctls return positive numbers on |
921 | * success as well). Returns a negated errno value in case of error. | 1060 | * success as well). Returns a negated errno value in case of error. |
922 | * | 1061 | * |
923 | * Note: most ioctls are forward onto the block subsystem or further | 1062 | * Note: most ioctls are forward onto the block subsystem or further |
@@ -968,30 +1107,51 @@ out: | |||
968 | 1107 | ||
969 | static void set_media_not_present(struct scsi_disk *sdkp) | 1108 | static void set_media_not_present(struct scsi_disk *sdkp) |
970 | { | 1109 | { |
971 | sdkp->media_present = 0; | 1110 | if (sdkp->media_present) |
972 | sdkp->capacity = 0; | 1111 | sdkp->device->changed = 1; |
973 | sdkp->device->changed = 1; | 1112 | |
1113 | if (sdkp->device->removable) { | ||
1114 | sdkp->media_present = 0; | ||
1115 | sdkp->capacity = 0; | ||
1116 | } | ||
1117 | } | ||
1118 | |||
1119 | static int media_not_present(struct scsi_disk *sdkp, | ||
1120 | struct scsi_sense_hdr *sshdr) | ||
1121 | { | ||
1122 | if (!scsi_sense_valid(sshdr)) | ||
1123 | return 0; | ||
1124 | |||
1125 | /* not invoked for commands that could return deferred errors */ | ||
1126 | switch (sshdr->sense_key) { | ||
1127 | case UNIT_ATTENTION: | ||
1128 | case NOT_READY: | ||
1129 | /* medium not present */ | ||
1130 | if (sshdr->asc == 0x3A) { | ||
1131 | set_media_not_present(sdkp); | ||
1132 | return 1; | ||
1133 | } | ||
1134 | } | ||
1135 | return 0; | ||
974 | } | 1136 | } |
975 | 1137 | ||
976 | /** | 1138 | /** |
977 | * sd_media_changed - check if our medium changed | 1139 | * sd_check_events - check media events |
978 | * @disk: kernel device descriptor | 1140 | * @disk: kernel device descriptor |
1141 | * @clearing: disk events currently being cleared | ||
979 | * | 1142 | * |
980 | * Returns 0 if not applicable or no change; 1 if change | 1143 | * Returns mask of DISK_EVENT_*. |
981 | * | 1144 | * |
982 | * Note: this function is invoked from the block subsystem. | 1145 | * Note: this function is invoked from the block subsystem. |
983 | **/ | 1146 | **/ |
984 | static int sd_media_changed(struct gendisk *disk) | 1147 | static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing) |
985 | { | 1148 | { |
986 | struct scsi_disk *sdkp = scsi_disk(disk); | 1149 | struct scsi_disk *sdkp = scsi_disk(disk); |
987 | struct scsi_device *sdp = sdkp->device; | 1150 | struct scsi_device *sdp = sdkp->device; |
988 | struct scsi_sense_hdr *sshdr = NULL; | 1151 | struct scsi_sense_hdr *sshdr = NULL; |
989 | int retval; | 1152 | int retval; |
990 | 1153 | ||
991 | SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_media_changed\n")); | 1154 | SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_check_events\n")); |
992 | |||
993 | if (!sdp->removable) | ||
994 | return 0; | ||
995 | 1155 | ||
996 | /* | 1156 | /* |
997 | * If the device is offline, don't send any commands - just pretend as | 1157 | * If the device is offline, don't send any commands - just pretend as |
@@ -1001,7 +1161,6 @@ static int sd_media_changed(struct gendisk *disk) | |||
1001 | */ | 1161 | */ |
1002 | if (!scsi_device_online(sdp)) { | 1162 | if (!scsi_device_online(sdp)) { |
1003 | set_media_not_present(sdkp); | 1163 | set_media_not_present(sdkp); |
1004 | retval = 1; | ||
1005 | goto out; | 1164 | goto out; |
1006 | } | 1165 | } |
1007 | 1166 | ||
@@ -1022,34 +1181,32 @@ static int sd_media_changed(struct gendisk *disk) | |||
1022 | sshdr); | 1181 | sshdr); |
1023 | } | 1182 | } |
1024 | 1183 | ||
1025 | /* | 1184 | /* failed to execute TUR, assume media not present */ |
1026 | * Unable to test, unit probably not ready. This usually | 1185 | if (host_byte(retval)) { |
1027 | * means there is no disc in the drive. Mark as changed, | ||
1028 | * and we will figure it out later once the drive is | ||
1029 | * available again. | ||
1030 | */ | ||
1031 | if (retval || (scsi_sense_valid(sshdr) && | ||
1032 | /* 0x3a is medium not present */ | ||
1033 | sshdr->asc == 0x3a)) { | ||
1034 | set_media_not_present(sdkp); | 1186 | set_media_not_present(sdkp); |
1035 | retval = 1; | ||
1036 | goto out; | 1187 | goto out; |
1037 | } | 1188 | } |
1038 | 1189 | ||
1190 | if (media_not_present(sdkp, sshdr)) | ||
1191 | goto out; | ||
1192 | |||
1039 | /* | 1193 | /* |
1040 | * For removable scsi disk we have to recognise the presence | 1194 | * For removable scsi disk we have to recognise the presence |
1041 | * of a disk in the drive. This is kept in the struct scsi_disk | 1195 | * of a disk in the drive. |
1042 | * struct and tested at open ! Daniel Roche (dan@lectra.fr) | ||
1043 | */ | 1196 | */ |
1197 | if (!sdkp->media_present) | ||
1198 | sdp->changed = 1; | ||
1044 | sdkp->media_present = 1; | 1199 | sdkp->media_present = 1; |
1045 | |||
1046 | retval = sdp->changed; | ||
1047 | sdp->changed = 0; | ||
1048 | out: | 1200 | out: |
1049 | if (retval != sdkp->previous_state) | 1201 | /* |
1050 | sdev_evt_send_simple(sdp, SDEV_EVT_MEDIA_CHANGE, GFP_KERNEL); | 1202 | * sdp->changed is set under the following conditions: |
1051 | sdkp->previous_state = retval; | 1203 | * |
1204 | * Medium present state has changed in either direction. | ||
1205 | * Device has indicated UNIT_ATTENTION. | ||
1206 | */ | ||
1052 | kfree(sshdr); | 1207 | kfree(sshdr); |
1208 | retval = sdp->changed ? DISK_EVENT_MEDIA_CHANGE : 0; | ||
1209 | sdp->changed = 0; | ||
1053 | return retval; | 1210 | return retval; |
1054 | } | 1211 | } |
1055 | 1212 | ||
@@ -1072,7 +1229,7 @@ static int sd_sync_cache(struct scsi_disk *sdkp) | |||
1072 | * flush everything. | 1229 | * flush everything. |
1073 | */ | 1230 | */ |
1074 | res = scsi_execute_req(sdp, cmd, DMA_NONE, NULL, 0, &sshdr, | 1231 | res = scsi_execute_req(sdp, cmd, DMA_NONE, NULL, 0, &sshdr, |
1075 | SD_TIMEOUT, SD_MAX_RETRIES, NULL); | 1232 | SD_FLUSH_TIMEOUT, SD_MAX_RETRIES, NULL); |
1076 | if (res == 0) | 1233 | if (res == 0) |
1077 | break; | 1234 | break; |
1078 | } | 1235 | } |
@@ -1142,7 +1299,7 @@ static const struct block_device_operations sd_fops = { | |||
1142 | #ifdef CONFIG_COMPAT | 1299 | #ifdef CONFIG_COMPAT |
1143 | .compat_ioctl = sd_compat_ioctl, | 1300 | .compat_ioctl = sd_compat_ioctl, |
1144 | #endif | 1301 | #endif |
1145 | .media_changed = sd_media_changed, | 1302 | .check_events = sd_check_events, |
1146 | .revalidate_disk = sd_revalidate_disk, | 1303 | .revalidate_disk = sd_revalidate_disk, |
1147 | .unlock_native_capacity = sd_unlock_native_capacity, | 1304 | .unlock_native_capacity = sd_unlock_native_capacity, |
1148 | }; | 1305 | }; |
@@ -1153,6 +1310,12 @@ static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd) | |||
1153 | u64 end_lba = blk_rq_pos(scmd->request) + (scsi_bufflen(scmd) / 512); | 1310 | u64 end_lba = blk_rq_pos(scmd->request) + (scsi_bufflen(scmd) / 512); |
1154 | u64 bad_lba; | 1311 | u64 bad_lba; |
1155 | int info_valid; | 1312 | int info_valid; |
1313 | /* | ||
1314 | * resid is optional but mostly filled in. When it's unused, | ||
1315 | * its value is zero, so we assume the whole buffer transferred | ||
1316 | */ | ||
1317 | unsigned int transferred = scsi_bufflen(scmd) - scsi_get_resid(scmd); | ||
1318 | unsigned int good_bytes; | ||
1156 | 1319 | ||
1157 | if (scmd->request->cmd_type != REQ_TYPE_FS) | 1320 | if (scmd->request->cmd_type != REQ_TYPE_FS) |
1158 | return 0; | 1321 | return 0; |
@@ -1186,7 +1349,8 @@ static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd) | |||
1186 | /* This computation should always be done in terms of | 1349 | /* This computation should always be done in terms of |
1187 | * the resolution of the device's medium. | 1350 | * the resolution of the device's medium. |
1188 | */ | 1351 | */ |
1189 | return (bad_lba - start_lba) * scmd->device->sector_size; | 1352 | good_bytes = (bad_lba - start_lba) * scmd->device->sector_size; |
1353 | return min(good_bytes, transferred); | ||
1190 | } | 1354 | } |
1191 | 1355 | ||
1192 | /** | 1356 | /** |
@@ -1204,12 +1368,10 @@ static int sd_done(struct scsi_cmnd *SCpnt) | |||
1204 | struct scsi_disk *sdkp = scsi_disk(SCpnt->request->rq_disk); | 1368 | struct scsi_disk *sdkp = scsi_disk(SCpnt->request->rq_disk); |
1205 | int sense_valid = 0; | 1369 | int sense_valid = 0; |
1206 | int sense_deferred = 0; | 1370 | int sense_deferred = 0; |
1371 | unsigned char op = SCpnt->cmnd[0]; | ||
1207 | 1372 | ||
1208 | if (SCpnt->request->cmd_flags & REQ_DISCARD) { | 1373 | if ((SCpnt->request->cmd_flags & REQ_DISCARD) && !result) |
1209 | if (!result) | 1374 | scsi_set_resid(SCpnt, 0); |
1210 | scsi_set_resid(SCpnt, 0); | ||
1211 | return good_bytes; | ||
1212 | } | ||
1213 | 1375 | ||
1214 | if (result) { | 1376 | if (result) { |
1215 | sense_valid = scsi_command_normalize_sense(SCpnt, &sshdr); | 1377 | sense_valid = scsi_command_normalize_sense(SCpnt, &sshdr); |
@@ -1248,10 +1410,17 @@ static int sd_done(struct scsi_cmnd *SCpnt) | |||
1248 | SCpnt->result = 0; | 1410 | SCpnt->result = 0; |
1249 | memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); | 1411 | memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); |
1250 | break; | 1412 | break; |
1251 | case ABORTED_COMMAND: /* DIF: Target detected corruption */ | 1413 | case ABORTED_COMMAND: |
1252 | case ILLEGAL_REQUEST: /* DIX: Host detected corruption */ | 1414 | if (sshdr.asc == 0x10) /* DIF: Target detected corruption */ |
1253 | if (sshdr.asc == 0x10) | 1415 | good_bytes = sd_completed_bytes(SCpnt); |
1416 | break; | ||
1417 | case ILLEGAL_REQUEST: | ||
1418 | if (sshdr.asc == 0x10) /* DIX: Host detected corruption */ | ||
1254 | good_bytes = sd_completed_bytes(SCpnt); | 1419 | good_bytes = sd_completed_bytes(SCpnt); |
1420 | /* INVALID COMMAND OPCODE or INVALID FIELD IN CDB */ | ||
1421 | if ((sshdr.asc == 0x20 || sshdr.asc == 0x24) && | ||
1422 | (op == UNMAP || op == WRITE_SAME_16 || op == WRITE_SAME)) | ||
1423 | sd_config_discard(sdkp, SD_LBP_DISABLE); | ||
1255 | break; | 1424 | break; |
1256 | default: | 1425 | default: |
1257 | break; | 1426 | break; |
@@ -1278,23 +1447,6 @@ static int sd_done(struct scsi_cmnd *SCpnt) | |||
1278 | return good_bytes; | 1447 | return good_bytes; |
1279 | } | 1448 | } |
1280 | 1449 | ||
1281 | static int media_not_present(struct scsi_disk *sdkp, | ||
1282 | struct scsi_sense_hdr *sshdr) | ||
1283 | { | ||
1284 | |||
1285 | if (!scsi_sense_valid(sshdr)) | ||
1286 | return 0; | ||
1287 | /* not invoked for commands that could return deferred errors */ | ||
1288 | if (sshdr->sense_key != NOT_READY && | ||
1289 | sshdr->sense_key != UNIT_ATTENTION) | ||
1290 | return 0; | ||
1291 | if (sshdr->asc != 0x3A) /* medium not present */ | ||
1292 | return 0; | ||
1293 | |||
1294 | set_media_not_present(sdkp); | ||
1295 | return 1; | ||
1296 | } | ||
1297 | |||
1298 | /* | 1450 | /* |
1299 | * spinup disk - called only in sd_revalidate_disk() | 1451 | * spinup disk - called only in sd_revalidate_disk() |
1300 | */ | 1452 | */ |
@@ -1469,7 +1621,7 @@ static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
1469 | */ | 1621 | */ |
1470 | if (sdp->removable && | 1622 | if (sdp->removable && |
1471 | sense_valid && sshdr->sense_key == NOT_READY) | 1623 | sense_valid && sshdr->sense_key == NOT_READY) |
1472 | sdp->changed = 1; | 1624 | set_media_not_present(sdkp); |
1473 | 1625 | ||
1474 | /* | 1626 | /* |
1475 | * We used to set media_present to 0 here to indicate no media | 1627 | * We used to set media_present to 0 here to indicate no media |
@@ -1498,6 +1650,9 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
1498 | unsigned long long lba; | 1650 | unsigned long long lba; |
1499 | unsigned sector_size; | 1651 | unsigned sector_size; |
1500 | 1652 | ||
1653 | if (sdp->no_read_capacity_16) | ||
1654 | return -EINVAL; | ||
1655 | |||
1501 | do { | 1656 | do { |
1502 | memset(cmd, 0, 16); | 1657 | memset(cmd, 0, 16); |
1503 | cmd[0] = SERVICE_ACTION_IN; | 1658 | cmd[0] = SERVICE_ACTION_IN; |
@@ -1554,7 +1709,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
1554 | } | 1709 | } |
1555 | 1710 | ||
1556 | /* Logical blocks per physical block exponent */ | 1711 | /* Logical blocks per physical block exponent */ |
1557 | sdkp->hw_sector_size = (1 << (buffer[13] & 0xf)) * sector_size; | 1712 | sdkp->physical_block_size = (1 << (buffer[13] & 0xf)) * sector_size; |
1558 | 1713 | ||
1559 | /* Lowest aligned logical block */ | 1714 | /* Lowest aligned logical block */ |
1560 | alignment = ((buffer[14] & 0x3f) << 8 | buffer[15]) * sector_size; | 1715 | alignment = ((buffer[14] & 0x3f) << 8 | buffer[15]) * sector_size; |
@@ -1563,17 +1718,13 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
1563 | sd_printk(KERN_NOTICE, sdkp, | 1718 | sd_printk(KERN_NOTICE, sdkp, |
1564 | "physical block alignment offset: %u\n", alignment); | 1719 | "physical block alignment offset: %u\n", alignment); |
1565 | 1720 | ||
1566 | if (buffer[14] & 0x80) { /* TPE */ | 1721 | if (buffer[14] & 0x80) { /* LBPME */ |
1567 | struct request_queue *q = sdp->request_queue; | 1722 | sdkp->lbpme = 1; |
1568 | 1723 | ||
1569 | sdkp->thin_provisioning = 1; | 1724 | if (buffer[14] & 0x40) /* LBPRZ */ |
1570 | q->limits.discard_granularity = sdkp->hw_sector_size; | 1725 | sdkp->lbprz = 1; |
1571 | q->limits.max_discard_sectors = 0xffffffff; | ||
1572 | 1726 | ||
1573 | if (buffer[14] & 0x40) /* TPRZ */ | 1727 | sd_config_discard(sdkp, SD_LBP_WS16); |
1574 | q->limits.discard_zeroes_data = 1; | ||
1575 | |||
1576 | queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q); | ||
1577 | } | 1728 | } |
1578 | 1729 | ||
1579 | sdkp->capacity = lba + 1; | 1730 | sdkp->capacity = lba + 1; |
@@ -1626,6 +1777,15 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
1626 | sector_size = get_unaligned_be32(&buffer[4]); | 1777 | sector_size = get_unaligned_be32(&buffer[4]); |
1627 | lba = get_unaligned_be32(&buffer[0]); | 1778 | lba = get_unaligned_be32(&buffer[0]); |
1628 | 1779 | ||
1780 | if (sdp->no_read_capacity_16 && (lba == 0xffffffff)) { | ||
1781 | /* Some buggy (usb cardreader) devices return an lba of | ||
1782 | 0xffffffff when the want to report a size of 0 (with | ||
1783 | which they really mean no media is present) */ | ||
1784 | sdkp->capacity = 0; | ||
1785 | sdkp->physical_block_size = sector_size; | ||
1786 | return sector_size; | ||
1787 | } | ||
1788 | |||
1629 | if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) { | 1789 | if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) { |
1630 | sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a " | 1790 | sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a " |
1631 | "kernel compiled with support for large block " | 1791 | "kernel compiled with support for large block " |
@@ -1635,7 +1795,7 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
1635 | } | 1795 | } |
1636 | 1796 | ||
1637 | sdkp->capacity = lba + 1; | 1797 | sdkp->capacity = lba + 1; |
1638 | sdkp->hw_sector_size = sector_size; | 1798 | sdkp->physical_block_size = sector_size; |
1639 | return sector_size; | 1799 | return sector_size; |
1640 | } | 1800 | } |
1641 | 1801 | ||
@@ -1756,10 +1916,10 @@ got_data: | |||
1756 | (unsigned long long)sdkp->capacity, | 1916 | (unsigned long long)sdkp->capacity, |
1757 | sector_size, cap_str_10, cap_str_2); | 1917 | sector_size, cap_str_10, cap_str_2); |
1758 | 1918 | ||
1759 | if (sdkp->hw_sector_size != sector_size) | 1919 | if (sdkp->physical_block_size != sector_size) |
1760 | sd_printk(KERN_NOTICE, sdkp, | 1920 | sd_printk(KERN_NOTICE, sdkp, |
1761 | "%u-byte physical blocks\n", | 1921 | "%u-byte physical blocks\n", |
1762 | sdkp->hw_sector_size); | 1922 | sdkp->physical_block_size); |
1763 | } | 1923 | } |
1764 | } | 1924 | } |
1765 | 1925 | ||
@@ -1773,7 +1933,8 @@ got_data: | |||
1773 | else if (sector_size == 256) | 1933 | else if (sector_size == 256) |
1774 | sdkp->capacity >>= 1; | 1934 | sdkp->capacity >>= 1; |
1775 | 1935 | ||
1776 | blk_queue_physical_block_size(sdp->request_queue, sdkp->hw_sector_size); | 1936 | blk_queue_physical_block_size(sdp->request_queue, |
1937 | sdkp->physical_block_size); | ||
1777 | sdkp->device->sector_size = sector_size; | 1938 | sdkp->device->sector_size = sector_size; |
1778 | } | 1939 | } |
1779 | 1940 | ||
@@ -1861,16 +2022,26 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) | |||
1861 | 2022 | ||
1862 | int dbd; | 2023 | int dbd; |
1863 | int modepage; | 2024 | int modepage; |
2025 | int first_len; | ||
1864 | struct scsi_mode_data data; | 2026 | struct scsi_mode_data data; |
1865 | struct scsi_sense_hdr sshdr; | 2027 | struct scsi_sense_hdr sshdr; |
1866 | int old_wce = sdkp->WCE; | 2028 | int old_wce = sdkp->WCE; |
1867 | int old_rcd = sdkp->RCD; | 2029 | int old_rcd = sdkp->RCD; |
1868 | int old_dpofua = sdkp->DPOFUA; | 2030 | int old_dpofua = sdkp->DPOFUA; |
1869 | 2031 | ||
1870 | if (sdp->skip_ms_page_8) | 2032 | first_len = 4; |
1871 | goto defaults; | 2033 | if (sdp->skip_ms_page_8) { |
1872 | 2034 | if (sdp->type == TYPE_RBC) | |
1873 | if (sdp->type == TYPE_RBC) { | 2035 | goto defaults; |
2036 | else { | ||
2037 | if (sdp->skip_ms_page_3f) | ||
2038 | goto defaults; | ||
2039 | modepage = 0x3F; | ||
2040 | if (sdp->use_192_bytes_for_3f) | ||
2041 | first_len = 192; | ||
2042 | dbd = 0; | ||
2043 | } | ||
2044 | } else if (sdp->type == TYPE_RBC) { | ||
1874 | modepage = 6; | 2045 | modepage = 6; |
1875 | dbd = 8; | 2046 | dbd = 8; |
1876 | } else { | 2047 | } else { |
@@ -1879,13 +2050,15 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) | |||
1879 | } | 2050 | } |
1880 | 2051 | ||
1881 | /* cautiously ask */ | 2052 | /* cautiously ask */ |
1882 | res = sd_do_mode_sense(sdp, dbd, modepage, buffer, 4, &data, &sshdr); | 2053 | res = sd_do_mode_sense(sdp, dbd, modepage, buffer, first_len, |
2054 | &data, &sshdr); | ||
1883 | 2055 | ||
1884 | if (!scsi_status_is_good(res)) | 2056 | if (!scsi_status_is_good(res)) |
1885 | goto bad_sense; | 2057 | goto bad_sense; |
1886 | 2058 | ||
1887 | if (!data.header_length) { | 2059 | if (!data.header_length) { |
1888 | modepage = 6; | 2060 | modepage = 6; |
2061 | first_len = 0; | ||
1889 | sd_printk(KERN_ERR, sdkp, "Missing header in MODE_SENSE response\n"); | 2062 | sd_printk(KERN_ERR, sdkp, "Missing header in MODE_SENSE response\n"); |
1890 | } | 2063 | } |
1891 | 2064 | ||
@@ -1898,30 +2071,61 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) | |||
1898 | */ | 2071 | */ |
1899 | if (len < 3) | 2072 | if (len < 3) |
1900 | goto bad_sense; | 2073 | goto bad_sense; |
1901 | if (len > 20) | 2074 | else if (len > SD_BUF_SIZE) { |
1902 | len = 20; | 2075 | sd_printk(KERN_NOTICE, sdkp, "Truncating mode parameter " |
1903 | 2076 | "data from %d to %d bytes\n", len, SD_BUF_SIZE); | |
1904 | /* Take headers and block descriptors into account */ | 2077 | len = SD_BUF_SIZE; |
1905 | len += data.header_length + data.block_descriptor_length; | 2078 | } |
1906 | if (len > SD_BUF_SIZE) | 2079 | if (modepage == 0x3F && sdp->use_192_bytes_for_3f) |
1907 | goto bad_sense; | 2080 | len = 192; |
1908 | 2081 | ||
1909 | /* Get the data */ | 2082 | /* Get the data */ |
1910 | res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr); | 2083 | if (len > first_len) |
2084 | res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, | ||
2085 | &data, &sshdr); | ||
1911 | 2086 | ||
1912 | if (scsi_status_is_good(res)) { | 2087 | if (scsi_status_is_good(res)) { |
1913 | int offset = data.header_length + data.block_descriptor_length; | 2088 | int offset = data.header_length + data.block_descriptor_length; |
1914 | 2089 | ||
1915 | if (offset >= SD_BUF_SIZE - 2) { | 2090 | while (offset < len) { |
1916 | sd_printk(KERN_ERR, sdkp, "Malformed MODE SENSE response\n"); | 2091 | u8 page_code = buffer[offset] & 0x3F; |
1917 | goto defaults; | 2092 | u8 spf = buffer[offset] & 0x40; |
2093 | |||
2094 | if (page_code == 8 || page_code == 6) { | ||
2095 | /* We're interested only in the first 3 bytes. | ||
2096 | */ | ||
2097 | if (len - offset <= 2) { | ||
2098 | sd_printk(KERN_ERR, sdkp, "Incomplete " | ||
2099 | "mode parameter data\n"); | ||
2100 | goto defaults; | ||
2101 | } else { | ||
2102 | modepage = page_code; | ||
2103 | goto Page_found; | ||
2104 | } | ||
2105 | } else { | ||
2106 | /* Go to the next page */ | ||
2107 | if (spf && len - offset > 3) | ||
2108 | offset += 4 + (buffer[offset+2] << 8) + | ||
2109 | buffer[offset+3]; | ||
2110 | else if (!spf && len - offset > 1) | ||
2111 | offset += 2 + buffer[offset+1]; | ||
2112 | else { | ||
2113 | sd_printk(KERN_ERR, sdkp, "Incomplete " | ||
2114 | "mode parameter data\n"); | ||
2115 | goto defaults; | ||
2116 | } | ||
2117 | } | ||
1918 | } | 2118 | } |
1919 | 2119 | ||
1920 | if ((buffer[offset] & 0x3f) != modepage) { | 2120 | if (modepage == 0x3F) { |
2121 | sd_printk(KERN_ERR, sdkp, "No Caching mode page " | ||
2122 | "present\n"); | ||
2123 | goto defaults; | ||
2124 | } else if ((buffer[offset] & 0x3f) != modepage) { | ||
1921 | sd_printk(KERN_ERR, sdkp, "Got wrong page\n"); | 2125 | sd_printk(KERN_ERR, sdkp, "Got wrong page\n"); |
1922 | goto defaults; | 2126 | goto defaults; |
1923 | } | 2127 | } |
1924 | 2128 | Page_found: | |
1925 | if (modepage == 8) { | 2129 | if (modepage == 8) { |
1926 | sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0); | 2130 | sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0); |
1927 | sdkp->RCD = ((buffer[offset + 2] & 0x01) != 0); | 2131 | sdkp->RCD = ((buffer[offset + 2] & 0x01) != 0); |
@@ -2017,7 +2221,6 @@ static void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer) | |||
2017 | */ | 2221 | */ |
2018 | static void sd_read_block_limits(struct scsi_disk *sdkp) | 2222 | static void sd_read_block_limits(struct scsi_disk *sdkp) |
2019 | { | 2223 | { |
2020 | struct request_queue *q = sdkp->disk->queue; | ||
2021 | unsigned int sector_sz = sdkp->device->sector_size; | 2224 | unsigned int sector_sz = sdkp->device->sector_size; |
2022 | const int vpd_len = 64; | 2225 | const int vpd_len = 64; |
2023 | unsigned char *buffer = kmalloc(vpd_len, GFP_KERNEL); | 2226 | unsigned char *buffer = kmalloc(vpd_len, GFP_KERNEL); |
@@ -2032,29 +2235,46 @@ static void sd_read_block_limits(struct scsi_disk *sdkp) | |||
2032 | blk_queue_io_opt(sdkp->disk->queue, | 2235 | blk_queue_io_opt(sdkp->disk->queue, |
2033 | get_unaligned_be32(&buffer[12]) * sector_sz); | 2236 | get_unaligned_be32(&buffer[12]) * sector_sz); |
2034 | 2237 | ||
2035 | /* Thin provisioning enabled and page length indicates TP support */ | 2238 | if (buffer[3] == 0x3c) { |
2036 | if (sdkp->thin_provisioning && buffer[3] == 0x3c) { | 2239 | unsigned int lba_count, desc_count; |
2037 | unsigned int lba_count, desc_count, granularity; | ||
2038 | 2240 | ||
2039 | lba_count = get_unaligned_be32(&buffer[20]); | 2241 | sdkp->max_ws_blocks = |
2040 | desc_count = get_unaligned_be32(&buffer[24]); | 2242 | (u32) min_not_zero(get_unaligned_be64(&buffer[36]), |
2243 | (u64)0xffffffff); | ||
2041 | 2244 | ||
2042 | if (lba_count) { | 2245 | if (!sdkp->lbpme) |
2043 | q->limits.max_discard_sectors = | 2246 | goto out; |
2044 | lba_count * sector_sz >> 9; | ||
2045 | 2247 | ||
2046 | if (desc_count) | 2248 | lba_count = get_unaligned_be32(&buffer[20]); |
2047 | sdkp->unmap = 1; | 2249 | desc_count = get_unaligned_be32(&buffer[24]); |
2048 | } | ||
2049 | 2250 | ||
2050 | granularity = get_unaligned_be32(&buffer[28]); | 2251 | if (lba_count && desc_count) |
2252 | sdkp->max_unmap_blocks = lba_count; | ||
2051 | 2253 | ||
2052 | if (granularity) | 2254 | sdkp->unmap_granularity = get_unaligned_be32(&buffer[28]); |
2053 | q->limits.discard_granularity = granularity * sector_sz; | ||
2054 | 2255 | ||
2055 | if (buffer[32] & 0x80) | 2256 | if (buffer[32] & 0x80) |
2056 | q->limits.discard_alignment = | 2257 | sdkp->unmap_alignment = |
2057 | get_unaligned_be32(&buffer[32]) & ~(1 << 31); | 2258 | get_unaligned_be32(&buffer[32]) & ~(1 << 31); |
2259 | |||
2260 | if (!sdkp->lbpvpd) { /* LBP VPD page not provided */ | ||
2261 | |||
2262 | if (sdkp->max_unmap_blocks) | ||
2263 | sd_config_discard(sdkp, SD_LBP_UNMAP); | ||
2264 | else | ||
2265 | sd_config_discard(sdkp, SD_LBP_WS16); | ||
2266 | |||
2267 | } else { /* LBP VPD page tells us what to use */ | ||
2268 | |||
2269 | if (sdkp->lbpu && sdkp->max_unmap_blocks) | ||
2270 | sd_config_discard(sdkp, SD_LBP_UNMAP); | ||
2271 | else if (sdkp->lbpws) | ||
2272 | sd_config_discard(sdkp, SD_LBP_WS16); | ||
2273 | else if (sdkp->lbpws10) | ||
2274 | sd_config_discard(sdkp, SD_LBP_WS10); | ||
2275 | else | ||
2276 | sd_config_discard(sdkp, SD_LBP_DISABLE); | ||
2277 | } | ||
2058 | } | 2278 | } |
2059 | 2279 | ||
2060 | out: | 2280 | out: |
@@ -2087,6 +2307,32 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp) | |||
2087 | kfree(buffer); | 2307 | kfree(buffer); |
2088 | } | 2308 | } |
2089 | 2309 | ||
2310 | /** | ||
2311 | * sd_read_block_provisioning - Query provisioning VPD page | ||
2312 | * @disk: disk to query | ||
2313 | */ | ||
2314 | static void sd_read_block_provisioning(struct scsi_disk *sdkp) | ||
2315 | { | ||
2316 | unsigned char *buffer; | ||
2317 | const int vpd_len = 8; | ||
2318 | |||
2319 | if (sdkp->lbpme == 0) | ||
2320 | return; | ||
2321 | |||
2322 | buffer = kmalloc(vpd_len, GFP_KERNEL); | ||
2323 | |||
2324 | if (!buffer || scsi_get_vpd_page(sdkp->device, 0xb2, buffer, vpd_len)) | ||
2325 | goto out; | ||
2326 | |||
2327 | sdkp->lbpvpd = 1; | ||
2328 | sdkp->lbpu = (buffer[5] >> 7) & 1; /* UNMAP */ | ||
2329 | sdkp->lbpws = (buffer[5] >> 6) & 1; /* WRITE SAME(16) with UNMAP */ | ||
2330 | sdkp->lbpws10 = (buffer[5] >> 5) & 1; /* WRITE SAME(10) with UNMAP */ | ||
2331 | |||
2332 | out: | ||
2333 | kfree(buffer); | ||
2334 | } | ||
2335 | |||
2090 | static int sd_try_extended_inquiry(struct scsi_device *sdp) | 2336 | static int sd_try_extended_inquiry(struct scsi_device *sdp) |
2091 | { | 2337 | { |
2092 | /* | 2338 | /* |
@@ -2109,7 +2355,7 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
2109 | struct scsi_disk *sdkp = scsi_disk(disk); | 2355 | struct scsi_disk *sdkp = scsi_disk(disk); |
2110 | struct scsi_device *sdp = sdkp->device; | 2356 | struct scsi_device *sdp = sdkp->device; |
2111 | unsigned char *buffer; | 2357 | unsigned char *buffer; |
2112 | unsigned ordered; | 2358 | unsigned flush = 0; |
2113 | 2359 | ||
2114 | SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, | 2360 | SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, |
2115 | "sd_revalidate_disk\n")); | 2361 | "sd_revalidate_disk\n")); |
@@ -2138,6 +2384,7 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
2138 | sd_read_capacity(sdkp, buffer); | 2384 | sd_read_capacity(sdkp, buffer); |
2139 | 2385 | ||
2140 | if (sd_try_extended_inquiry(sdp)) { | 2386 | if (sd_try_extended_inquiry(sdp)) { |
2387 | sd_read_block_provisioning(sdkp); | ||
2141 | sd_read_block_limits(sdkp); | 2388 | sd_read_block_limits(sdkp); |
2142 | sd_read_block_characteristics(sdkp); | 2389 | sd_read_block_characteristics(sdkp); |
2143 | } | 2390 | } |
@@ -2151,17 +2398,15 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
2151 | 2398 | ||
2152 | /* | 2399 | /* |
2153 | * We now have all cache related info, determine how we deal | 2400 | * We now have all cache related info, determine how we deal |
2154 | * with ordered requests. Note that as the current SCSI | 2401 | * with flush requests. |
2155 | * dispatch function can alter request order, we cannot use | ||
2156 | * QUEUE_ORDERED_TAG_* even when ordered tag is supported. | ||
2157 | */ | 2402 | */ |
2158 | if (sdkp->WCE) | 2403 | if (sdkp->WCE) { |
2159 | ordered = sdkp->DPOFUA | 2404 | flush |= REQ_FLUSH; |
2160 | ? QUEUE_ORDERED_DRAIN_FUA : QUEUE_ORDERED_DRAIN_FLUSH; | 2405 | if (sdkp->DPOFUA) |
2161 | else | 2406 | flush |= REQ_FUA; |
2162 | ordered = QUEUE_ORDERED_DRAIN; | 2407 | } |
2163 | 2408 | ||
2164 | blk_queue_ordered(sdkp->disk->queue, ordered); | 2409 | blk_queue_flush(sdkp->disk->queue, flush); |
2165 | 2410 | ||
2166 | set_capacity(disk, sdkp->capacity); | 2411 | set_capacity(disk, sdkp->capacity); |
2167 | kfree(buffer); | 2412 | kfree(buffer); |
@@ -2252,11 +2497,10 @@ static void sd_probe_async(void *data, async_cookie_t cookie) | |||
2252 | index = sdkp->index; | 2497 | index = sdkp->index; |
2253 | dev = &sdp->sdev_gendev; | 2498 | dev = &sdp->sdev_gendev; |
2254 | 2499 | ||
2255 | if (index < SD_MAX_DISKS) { | 2500 | gd->major = sd_major((index & 0xf0) >> 4); |
2256 | gd->major = sd_major((index & 0xf0) >> 4); | 2501 | gd->first_minor = ((index & 0xf) << 4) | (index & 0xfff00); |
2257 | gd->first_minor = ((index & 0xf) << 4) | (index & 0xfff00); | 2502 | gd->minors = SD_MINORS; |
2258 | gd->minors = SD_MINORS; | 2503 | |
2259 | } | ||
2260 | gd->fops = &sd_fops; | 2504 | gd->fops = &sd_fops; |
2261 | gd->private_data = &sdkp->driver; | 2505 | gd->private_data = &sdkp->driver; |
2262 | gd->queue = sdkp->device->request_queue; | 2506 | gd->queue = sdkp->device->request_queue; |
@@ -2278,8 +2522,10 @@ static void sd_probe_async(void *data, async_cookie_t cookie) | |||
2278 | 2522 | ||
2279 | gd->driverfs_dev = &sdp->sdev_gendev; | 2523 | gd->driverfs_dev = &sdp->sdev_gendev; |
2280 | gd->flags = GENHD_FL_EXT_DEVT; | 2524 | gd->flags = GENHD_FL_EXT_DEVT; |
2281 | if (sdp->removable) | 2525 | if (sdp->removable) { |
2282 | gd->flags |= GENHD_FL_REMOVABLE; | 2526 | gd->flags |= GENHD_FL_REMOVABLE; |
2527 | gd->events |= DISK_EVENT_MEDIA_CHANGE; | ||
2528 | } | ||
2283 | 2529 | ||
2284 | add_disk(gd); | 2530 | add_disk(gd); |
2285 | sd_dif_config_host(sdkp); | 2531 | sd_dif_config_host(sdkp); |
@@ -2346,6 +2592,12 @@ static int sd_probe(struct device *dev) | |||
2346 | if (error) | 2592 | if (error) |
2347 | goto out_put; | 2593 | goto out_put; |
2348 | 2594 | ||
2595 | if (index >= SD_MAX_DISKS) { | ||
2596 | error = -ENODEV; | ||
2597 | sdev_printk(KERN_WARNING, sdp, "SCSI disk (sd) name space exhausted.\n"); | ||
2598 | goto out_free_index; | ||
2599 | } | ||
2600 | |||
2349 | error = sd_format_disk_name("sd", index, gd->disk_name, DISK_NAME_LEN); | 2601 | error = sd_format_disk_name("sd", index, gd->disk_name, DISK_NAME_LEN); |
2350 | if (error) | 2602 | if (error) |
2351 | goto out_free_index; | 2603 | goto out_free_index; |
@@ -2355,7 +2607,6 @@ static int sd_probe(struct device *dev) | |||
2355 | sdkp->disk = gd; | 2607 | sdkp->disk = gd; |
2356 | sdkp->index = index; | 2608 | sdkp->index = index; |
2357 | atomic_set(&sdkp->openers, 0); | 2609 | atomic_set(&sdkp->openers, 0); |
2358 | sdkp->previous_state = 1; | ||
2359 | 2610 | ||
2360 | if (!sdp->request_queue->rq_timeout) { | 2611 | if (!sdp->request_queue->rq_timeout) { |
2361 | if (sdp->type != TYPE_MOD) | 2612 | if (sdp->type != TYPE_MOD) |