aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/sd.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/scsi/sd.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (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.c515
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
99static void sd_config_discard(struct scsi_disk *, unsigned int);
100static int sd_revalidate_disk(struct gendisk *); 100static int sd_revalidate_disk(struct gendisk *);
101static void sd_unlock_native_capacity(struct gendisk *disk); 101static void sd_unlock_native_capacity(struct gendisk *disk);
102static int sd_probe(struct device *); 102static int sd_probe(struct device *);
@@ -259,6 +259,28 @@ sd_show_protection_type(struct device *dev, struct device_attribute *attr,
259} 259}
260 260
261static ssize_t 261static ssize_t
262sd_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
283static ssize_t
262sd_show_app_tag_own(struct device *dev, struct device_attribute *attr, 284sd_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
301static 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
310static ssize_t
311sd_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
319static ssize_t
320sd_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
279static struct device_attribute sd_disk_attrs[] = { 348static 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
486static 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
609out:
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
478static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq) 617static 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
969static void set_media_not_present(struct scsi_disk *sdkp) 1108static 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
1119static 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 **/
984static int sd_media_changed(struct gendisk *disk) 1147static 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;
1048out: 1200out:
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
1281static 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 */
2018static void sd_read_block_limits(struct scsi_disk *sdkp) 2222static 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 */
2314static 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
2090static int sd_try_extended_inquiry(struct scsi_device *sdp) 2336static 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)