aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-08-10 18:22:42 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-08-10 18:22:42 -0400
commit2f9e825d3e0e2b407ae8f082de5c00afcf7378fb (patch)
treef8b3ee40674ce4acd5508a0a0bf52a30904caf6c /drivers/scsi
parent7ae0dea900b027cd90e8a3e14deca9a19e17638b (diff)
parentde75d60d5ea235e6e09f4962ab22541ce0fe176a (diff)
Merge branch 'for-2.6.36' of git://git.kernel.dk/linux-2.6-block
* 'for-2.6.36' of git://git.kernel.dk/linux-2.6-block: (149 commits) block: make sure that REQ_* types are seen even with CONFIG_BLOCK=n xen-blkfront: fix missing out label blkdev: fix blkdev_issue_zeroout return value block: update request stacking methods to support discards block: fix missing export of blk_types.h writeback: fix bad _bh spinlock nesting drbd: revert "delay probes", feature is being re-implemented differently drbd: Initialize all members of sync_conf to their defaults [Bugz 315] drbd: Disable delay probes for the upcomming release writeback: cleanup bdi_register writeback: add new tracepoints writeback: remove unnecessary init_timer call writeback: optimize periodic bdi thread wakeups writeback: prevent unnecessary bdi threads wakeups writeback: move bdi threads exiting logic to the forker thread writeback: restructure bdi forker loop a little writeback: move last_active to bdi writeback: do not remove bdi from bdi_list writeback: simplify bdi code a little writeback: do not lose wake-ups in bdi threads ... Fixed up pretty trivial conflicts in drivers/block/virtio_blk.c and drivers/scsi/scsi_error.c as per Jens.
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/aha1542.c25
-rw-r--r--drivers/scsi/osd/osd_initiator.c8
-rw-r--r--drivers/scsi/scsi_error.c12
-rw-r--r--drivers/scsi/scsi_lib.c14
-rw-r--r--drivers/scsi/sd.c126
-rw-r--r--drivers/scsi/sd.h2
-rw-r--r--drivers/scsi/sr.c25
-rw-r--r--drivers/scsi/sun3_NCR5380.c2
-rw-r--r--drivers/scsi/sun3_scsi.c2
-rw-r--r--drivers/scsi/sun3_scsi_vme.c2
10 files changed, 124 insertions, 94 deletions
diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c
index 2a8cf137f609..4f785f254c1f 100644
--- a/drivers/scsi/aha1542.c
+++ b/drivers/scsi/aha1542.c
@@ -52,22 +52,6 @@
52#define SCSI_BUF_PA(address) isa_virt_to_bus(address) 52#define SCSI_BUF_PA(address) isa_virt_to_bus(address)
53#define SCSI_SG_PA(sgent) (isa_page_to_bus(sg_page((sgent))) + (sgent)->offset) 53#define SCSI_SG_PA(sgent) (isa_page_to_bus(sg_page((sgent))) + (sgent)->offset)
54 54
55static void BAD_SG_DMA(Scsi_Cmnd * SCpnt,
56 struct scatterlist *sgp,
57 int nseg,
58 int badseg)
59{
60 printk(KERN_CRIT "sgpnt[%d:%d] page %p/0x%llx length %u\n",
61 badseg, nseg, sg_virt(sgp),
62 (unsigned long long)SCSI_SG_PA(sgp),
63 sgp->length);
64
65 /*
66 * Not safe to continue.
67 */
68 panic("Buffer at physical address > 16Mb used for aha1542");
69}
70
71#include<linux/stat.h> 55#include<linux/stat.h>
72 56
73#ifdef DEBUG 57#ifdef DEBUG
@@ -691,8 +675,6 @@ static int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
691 } 675 }
692 scsi_for_each_sg(SCpnt, sg, sg_count, i) { 676 scsi_for_each_sg(SCpnt, sg, sg_count, i) {
693 any2scsi(cptr[i].dataptr, SCSI_SG_PA(sg)); 677 any2scsi(cptr[i].dataptr, SCSI_SG_PA(sg));
694 if (SCSI_SG_PA(sg) + sg->length - 1 > ISA_DMA_THRESHOLD)
695 BAD_SG_DMA(SCpnt, scsi_sglist(SCpnt), sg_count, i);
696 any2scsi(cptr[i].datalen, sg->length); 678 any2scsi(cptr[i].datalen, sg->length);
697 }; 679 };
698 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain)); 680 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
@@ -1133,16 +1115,9 @@ static int __init aha1542_detect(struct scsi_host_template * tpnt)
1133 release_region(bases[indx], 4); 1115 release_region(bases[indx], 4);
1134 continue; 1116 continue;
1135 } 1117 }
1136 /* For now we do this - until kmalloc is more intelligent
1137 we are resigned to stupid hacks like this */
1138 if (SCSI_BUF_PA(shpnt) >= ISA_DMA_THRESHOLD) {
1139 printk(KERN_ERR "Invalid address for shpnt with 1542.\n");
1140 goto unregister;
1141 }
1142 if (!aha1542_test_port(bases[indx], shpnt)) 1118 if (!aha1542_test_port(bases[indx], shpnt))
1143 goto unregister; 1119 goto unregister;
1144 1120
1145
1146 base_io = bases[indx]; 1121 base_io = bases[indx];
1147 1122
1148 /* Set the Bus on/off-times as not to ruin floppy performance */ 1123 /* Set the Bus on/off-times as not to ruin floppy performance */
diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c
index ee4b6914667f..fda4de3440c4 100644
--- a/drivers/scsi/osd/osd_initiator.c
+++ b/drivers/scsi/osd/osd_initiator.c
@@ -716,7 +716,7 @@ static int _osd_req_list_objects(struct osd_request *or,
716 return PTR_ERR(bio); 716 return PTR_ERR(bio);
717 } 717 }
718 718
719 bio->bi_rw &= ~(1 << BIO_RW); 719 bio->bi_rw &= ~REQ_WRITE;
720 or->in.bio = bio; 720 or->in.bio = bio;
721 or->in.total_bytes = bio->bi_size; 721 or->in.total_bytes = bio->bi_size;
722 return 0; 722 return 0;
@@ -814,7 +814,7 @@ void osd_req_write(struct osd_request *or,
814{ 814{
815 _osd_req_encode_common(or, OSD_ACT_WRITE, obj, offset, len); 815 _osd_req_encode_common(or, OSD_ACT_WRITE, obj, offset, len);
816 WARN_ON(or->out.bio || or->out.total_bytes); 816 WARN_ON(or->out.bio || or->out.total_bytes);
817 WARN_ON(0 == bio_rw_flagged(bio, BIO_RW)); 817 WARN_ON(0 == (bio->bi_rw & REQ_WRITE));
818 or->out.bio = bio; 818 or->out.bio = bio;
819 or->out.total_bytes = len; 819 or->out.total_bytes = len;
820} 820}
@@ -829,7 +829,7 @@ int osd_req_write_kern(struct osd_request *or,
829 if (IS_ERR(bio)) 829 if (IS_ERR(bio))
830 return PTR_ERR(bio); 830 return PTR_ERR(bio);
831 831
832 bio->bi_rw |= (1 << BIO_RW); /* FIXME: bio_set_dir() */ 832 bio->bi_rw |= REQ_WRITE; /* FIXME: bio_set_dir() */
833 osd_req_write(or, obj, offset, bio, len); 833 osd_req_write(or, obj, offset, bio, len);
834 return 0; 834 return 0;
835} 835}
@@ -865,7 +865,7 @@ void osd_req_read(struct osd_request *or,
865{ 865{
866 _osd_req_encode_common(or, OSD_ACT_READ, obj, offset, len); 866 _osd_req_encode_common(or, OSD_ACT_READ, obj, offset, len);
867 WARN_ON(or->in.bio || or->in.total_bytes); 867 WARN_ON(or->in.bio || or->in.total_bytes);
868 WARN_ON(1 == bio_rw_flagged(bio, BIO_RW)); 868 WARN_ON(1 == (bio->bi_rw & REQ_WRITE));
869 or->in.bio = bio; 869 or->in.bio = bio;
870 or->in.total_bytes = len; 870 or->in.total_bytes = len;
871} 871}
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 2bf98469dc4c..bbbc186dbc1a 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -320,7 +320,7 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
320 "changed. The Linux SCSI layer does not " 320 "changed. The Linux SCSI layer does not "
321 "automatically adjust these parameters.\n"); 321 "automatically adjust these parameters.\n");
322 322
323 if (blk_barrier_rq(scmd->request)) 323 if (scmd->request->cmd_flags & REQ_HARDBARRIER)
324 /* 324 /*
325 * barrier requests should always retry on UA 325 * barrier requests should always retry on UA
326 * otherwise block will get a spurious error 326 * otherwise block will get a spurious error
@@ -1331,16 +1331,16 @@ int scsi_noretry_cmd(struct scsi_cmnd *scmd)
1331 case DID_OK: 1331 case DID_OK:
1332 break; 1332 break;
1333 case DID_BUS_BUSY: 1333 case DID_BUS_BUSY:
1334 return blk_failfast_transport(scmd->request); 1334 return (scmd->request->cmd_flags & REQ_FAILFAST_TRANSPORT);
1335 case DID_PARITY: 1335 case DID_PARITY:
1336 return blk_failfast_dev(scmd->request); 1336 return (scmd->request->cmd_flags & REQ_FAILFAST_DEV);
1337 case DID_ERROR: 1337 case DID_ERROR:
1338 if (msg_byte(scmd->result) == COMMAND_COMPLETE && 1338 if (msg_byte(scmd->result) == COMMAND_COMPLETE &&
1339 status_byte(scmd->result) == RESERVATION_CONFLICT) 1339 status_byte(scmd->result) == RESERVATION_CONFLICT)
1340 return 0; 1340 return 0;
1341 /* fall through */ 1341 /* fall through */
1342 case DID_SOFT_ERROR: 1342 case DID_SOFT_ERROR:
1343 return blk_failfast_driver(scmd->request); 1343 return (scmd->request->cmd_flags & REQ_FAILFAST_DRIVER);
1344 } 1344 }
1345 1345
1346 switch (status_byte(scmd->result)) { 1346 switch (status_byte(scmd->result)) {
@@ -1349,7 +1349,9 @@ int scsi_noretry_cmd(struct scsi_cmnd *scmd)
1349 * assume caller has checked sense and determinted 1349 * assume caller has checked sense and determinted
1350 * the check condition was retryable. 1350 * the check condition was retryable.
1351 */ 1351 */
1352 return blk_failfast_dev(scmd->request); 1352 if (scmd->request->cmd_flags & REQ_FAILFAST_DEV ||
1353 scmd->request->cmd_type == REQ_TYPE_BLOCK_PC)
1354 return 1;
1353 } 1355 }
1354 1356
1355 return 0; 1357 return 0;
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 1646fe7cbd4b..b8de389636f8 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -85,7 +85,7 @@ static void scsi_unprep_request(struct request *req)
85{ 85{
86 struct scsi_cmnd *cmd = req->special; 86 struct scsi_cmnd *cmd = req->special;
87 87
88 req->cmd_flags &= ~REQ_DONTPREP; 88 blk_unprep_request(req);
89 req->special = NULL; 89 req->special = NULL;
90 90
91 scsi_put_command(cmd); 91 scsi_put_command(cmd);
@@ -722,7 +722,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
722 sense_deferred = scsi_sense_is_deferred(&sshdr); 722 sense_deferred = scsi_sense_is_deferred(&sshdr);
723 } 723 }
724 724
725 if (blk_pc_request(req)) { /* SG_IO ioctl from block level */ 725 if (req->cmd_type == REQ_TYPE_BLOCK_PC) { /* SG_IO ioctl from block level */
726 req->errors = result; 726 req->errors = result;
727 if (result) { 727 if (result) {
728 if (sense_valid && req->sense) { 728 if (sense_valid && req->sense) {
@@ -757,7 +757,8 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
757 } 757 }
758 } 758 }
759 759
760 BUG_ON(blk_bidi_rq(req)); /* bidi not support for !blk_pc_request yet */ 760 /* no bidi support for !REQ_TYPE_BLOCK_PC yet */
761 BUG_ON(blk_bidi_rq(req));
761 762
762 /* 763 /*
763 * Next deal with any sectors which we were able to correctly 764 * Next deal with any sectors which we were able to correctly
@@ -1010,11 +1011,8 @@ int scsi_init_io(struct scsi_cmnd *cmd, gfp_t gfp_mask)
1010 1011
1011err_exit: 1012err_exit:
1012 scsi_release_buffers(cmd); 1013 scsi_release_buffers(cmd);
1013 if (error == BLKPREP_KILL) 1014 scsi_put_command(cmd);
1014 scsi_put_command(cmd); 1015 cmd->request->special = NULL;
1015 else /* BLKPREP_DEFER */
1016 scsi_unprep_request(cmd->request);
1017
1018 return error; 1016 return error;
1019} 1017}
1020EXPORT_SYMBOL(scsi_init_io); 1018EXPORT_SYMBOL(scsi_init_io);
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index cc8a1d1d915a..8e2e893db9e7 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -46,6 +46,7 @@
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>
49#include <linux/mutex.h> 50#include <linux/mutex.h>
50#include <linux/string_helpers.h> 51#include <linux/string_helpers.h>
51#include <linux/async.h> 52#include <linux/async.h>
@@ -411,54 +412,85 @@ static void sd_prot_op(struct scsi_cmnd *scmd, unsigned int dif)
411} 412}
412 413
413/** 414/**
414 * sd_prepare_discard - unmap blocks on thinly provisioned device 415 * scsi_setup_discard_cmnd - unmap blocks on thinly provisioned device
416 * @sdp: scsi device to operate one
415 * @rq: Request to prepare 417 * @rq: Request to prepare
416 * 418 *
417 * Will issue either UNMAP or WRITE SAME(16) depending on preference 419 * Will issue either UNMAP or WRITE SAME(16) depending on preference
418 * indicated by target device. 420 * indicated by target device.
419 **/ 421 **/
420static int sd_prepare_discard(struct request *rq) 422static int scsi_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq)
421{ 423{
422 struct scsi_disk *sdkp = scsi_disk(rq->rq_disk); 424 struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
423 struct bio *bio = rq->bio; 425 struct bio *bio = rq->bio;
424 sector_t sector = bio->bi_sector; 426 sector_t sector = bio->bi_sector;
425 unsigned int num = bio_sectors(bio); 427 unsigned int nr_sectors = bio_sectors(bio);
428 unsigned int len;
429 int ret;
430 struct page *page;
426 431
427 if (sdkp->device->sector_size == 4096) { 432 if (sdkp->device->sector_size == 4096) {
428 sector >>= 3; 433 sector >>= 3;
429 num >>= 3; 434 nr_sectors >>= 3;
430 } 435 }
431 436
432 rq->cmd_type = REQ_TYPE_BLOCK_PC;
433 rq->timeout = SD_TIMEOUT; 437 rq->timeout = SD_TIMEOUT;
434 438
435 memset(rq->cmd, 0, rq->cmd_len); 439 memset(rq->cmd, 0, rq->cmd_len);
436 440
441 page = alloc_page(GFP_ATOMIC | __GFP_ZERO);
442 if (!page)
443 return BLKPREP_DEFER;
444
437 if (sdkp->unmap) { 445 if (sdkp->unmap) {
438 char *buf = kmap_atomic(bio_page(bio), KM_USER0); 446 char *buf = page_address(page);
439 447
448 rq->cmd_len = 10;
440 rq->cmd[0] = UNMAP; 449 rq->cmd[0] = UNMAP;
441 rq->cmd[8] = 24; 450 rq->cmd[8] = 24;
442 rq->cmd_len = 10;
443
444 /* Ensure that data length matches payload */
445 rq->__data_len = bio->bi_size = bio->bi_io_vec->bv_len = 24;
446 451
447 put_unaligned_be16(6 + 16, &buf[0]); 452 put_unaligned_be16(6 + 16, &buf[0]);
448 put_unaligned_be16(16, &buf[2]); 453 put_unaligned_be16(16, &buf[2]);
449 put_unaligned_be64(sector, &buf[8]); 454 put_unaligned_be64(sector, &buf[8]);
450 put_unaligned_be32(num, &buf[16]); 455 put_unaligned_be32(nr_sectors, &buf[16]);
451 456
452 kunmap_atomic(buf, KM_USER0); 457 len = 24;
453 } else { 458 } else {
459 rq->cmd_len = 16;
454 rq->cmd[0] = WRITE_SAME_16; 460 rq->cmd[0] = WRITE_SAME_16;
455 rq->cmd[1] = 0x8; /* UNMAP */ 461 rq->cmd[1] = 0x8; /* UNMAP */
456 put_unaligned_be64(sector, &rq->cmd[2]); 462 put_unaligned_be64(sector, &rq->cmd[2]);
457 put_unaligned_be32(num, &rq->cmd[10]); 463 put_unaligned_be32(nr_sectors, &rq->cmd[10]);
458 rq->cmd_len = 16; 464
465 len = sdkp->device->sector_size;
459 } 466 }
460 467
461 return BLKPREP_OK; 468 blk_add_request_payload(rq, page, len);
469 ret = scsi_setup_blk_pc_cmnd(sdp, rq);
470 rq->buffer = page_address(page);
471 if (ret != BLKPREP_OK) {
472 __free_page(page);
473 rq->buffer = NULL;
474 }
475 return ret;
476}
477
478static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq)
479{
480 rq->timeout = SD_TIMEOUT;
481 rq->retries = SD_MAX_RETRIES;
482 rq->cmd[0] = SYNCHRONIZE_CACHE;
483 rq->cmd_len = 10;
484
485 return scsi_setup_blk_pc_cmnd(sdp, rq);
486}
487
488static void sd_unprep_fn(struct request_queue *q, struct request *rq)
489{
490 if (rq->cmd_flags & REQ_DISCARD) {
491 free_page((unsigned long)rq->buffer);
492 rq->buffer = NULL;
493 }
462} 494}
463 495
464/** 496/**
@@ -485,10 +517,13 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
485 * Discard request come in as REQ_TYPE_FS but we turn them into 517 * Discard request come in as REQ_TYPE_FS but we turn them into
486 * block PC requests to make life easier. 518 * block PC requests to make life easier.
487 */ 519 */
488 if (blk_discard_rq(rq)) 520 if (rq->cmd_flags & REQ_DISCARD) {
489 ret = sd_prepare_discard(rq); 521 ret = scsi_setup_discard_cmnd(sdp, rq);
490 522 goto out;
491 if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { 523 } else if (rq->cmd_flags & REQ_FLUSH) {
524 ret = scsi_setup_flush_cmnd(sdp, rq);
525 goto out;
526 } else if (rq->cmd_type == REQ_TYPE_BLOCK_PC) {
492 ret = scsi_setup_blk_pc_cmnd(sdp, rq); 527 ret = scsi_setup_blk_pc_cmnd(sdp, rq);
493 goto out; 528 goto out;
494 } else if (rq->cmd_type != REQ_TYPE_FS) { 529 } else if (rq->cmd_type != REQ_TYPE_FS) {
@@ -636,7 +671,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
636 SCpnt->cmnd[0] = VARIABLE_LENGTH_CMD; 671 SCpnt->cmnd[0] = VARIABLE_LENGTH_CMD;
637 SCpnt->cmnd[7] = 0x18; 672 SCpnt->cmnd[7] = 0x18;
638 SCpnt->cmnd[9] = (rq_data_dir(rq) == READ) ? READ_32 : WRITE_32; 673 SCpnt->cmnd[9] = (rq_data_dir(rq) == READ) ? READ_32 : WRITE_32;
639 SCpnt->cmnd[10] = protect | (blk_fua_rq(rq) ? 0x8 : 0); 674 SCpnt->cmnd[10] = protect | ((rq->cmd_flags & REQ_FUA) ? 0x8 : 0);
640 675
641 /* LBA */ 676 /* LBA */
642 SCpnt->cmnd[12] = sizeof(block) > 4 ? (unsigned char) (block >> 56) & 0xff : 0; 677 SCpnt->cmnd[12] = sizeof(block) > 4 ? (unsigned char) (block >> 56) & 0xff : 0;
@@ -661,7 +696,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
661 SCpnt->cmnd[31] = (unsigned char) this_count & 0xff; 696 SCpnt->cmnd[31] = (unsigned char) this_count & 0xff;
662 } else if (block > 0xffffffff) { 697 } else if (block > 0xffffffff) {
663 SCpnt->cmnd[0] += READ_16 - READ_6; 698 SCpnt->cmnd[0] += READ_16 - READ_6;
664 SCpnt->cmnd[1] = protect | (blk_fua_rq(rq) ? 0x8 : 0); 699 SCpnt->cmnd[1] = protect | ((rq->cmd_flags & REQ_FUA) ? 0x8 : 0);
665 SCpnt->cmnd[2] = sizeof(block) > 4 ? (unsigned char) (block >> 56) & 0xff : 0; 700 SCpnt->cmnd[2] = sizeof(block) > 4 ? (unsigned char) (block >> 56) & 0xff : 0;
666 SCpnt->cmnd[3] = sizeof(block) > 4 ? (unsigned char) (block >> 48) & 0xff : 0; 701 SCpnt->cmnd[3] = sizeof(block) > 4 ? (unsigned char) (block >> 48) & 0xff : 0;
667 SCpnt->cmnd[4] = sizeof(block) > 4 ? (unsigned char) (block >> 40) & 0xff : 0; 702 SCpnt->cmnd[4] = sizeof(block) > 4 ? (unsigned char) (block >> 40) & 0xff : 0;
@@ -682,7 +717,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
682 this_count = 0xffff; 717 this_count = 0xffff;
683 718
684 SCpnt->cmnd[0] += READ_10 - READ_6; 719 SCpnt->cmnd[0] += READ_10 - READ_6;
685 SCpnt->cmnd[1] = protect | (blk_fua_rq(rq) ? 0x8 : 0); 720 SCpnt->cmnd[1] = protect | ((rq->cmd_flags & REQ_FUA) ? 0x8 : 0);
686 SCpnt->cmnd[2] = (unsigned char) (block >> 24) & 0xff; 721 SCpnt->cmnd[2] = (unsigned char) (block >> 24) & 0xff;
687 SCpnt->cmnd[3] = (unsigned char) (block >> 16) & 0xff; 722 SCpnt->cmnd[3] = (unsigned char) (block >> 16) & 0xff;
688 SCpnt->cmnd[4] = (unsigned char) (block >> 8) & 0xff; 723 SCpnt->cmnd[4] = (unsigned char) (block >> 8) & 0xff;
@@ -691,7 +726,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
691 SCpnt->cmnd[7] = (unsigned char) (this_count >> 8) & 0xff; 726 SCpnt->cmnd[7] = (unsigned char) (this_count >> 8) & 0xff;
692 SCpnt->cmnd[8] = (unsigned char) this_count & 0xff; 727 SCpnt->cmnd[8] = (unsigned char) this_count & 0xff;
693 } else { 728 } else {
694 if (unlikely(blk_fua_rq(rq))) { 729 if (unlikely(rq->cmd_flags & REQ_FUA)) {
695 /* 730 /*
696 * This happens only if this drive failed 731 * This happens only if this drive failed
697 * 10byte rw command with ILLEGAL_REQUEST 732 * 10byte rw command with ILLEGAL_REQUEST
@@ -745,6 +780,8 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
745 * or from within the kernel (e.g. as a result of a mount(1) ). 780 * or from within the kernel (e.g. as a result of a mount(1) ).
746 * In the latter case @inode and @filp carry an abridged amount 781 * In the latter case @inode and @filp carry an abridged amount
747 * of information as noted above. 782 * of information as noted above.
783 *
784 * Locking: called with bdev->bd_mutex held.
748 **/ 785 **/
749static int sd_open(struct block_device *bdev, fmode_t mode) 786static int sd_open(struct block_device *bdev, fmode_t mode)
750{ 787{
@@ -799,7 +836,7 @@ static int sd_open(struct block_device *bdev, fmode_t mode)
799 if (!scsi_device_online(sdev)) 836 if (!scsi_device_online(sdev))
800 goto error_out; 837 goto error_out;
801 838
802 if (!sdkp->openers++ && sdev->removable) { 839 if ((atomic_inc_return(&sdkp->openers) == 1) && sdev->removable) {
803 if (scsi_block_when_processing_errors(sdev)) 840 if (scsi_block_when_processing_errors(sdev))
804 scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT); 841 scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT);
805 } 842 }
@@ -823,6 +860,8 @@ error_autopm:
823 * 860 *
824 * Note: may block (uninterruptible) if error recovery is underway 861 * Note: may block (uninterruptible) if error recovery is underway
825 * on this disk. 862 * on this disk.
863 *
864 * Locking: called with bdev->bd_mutex held.
826 **/ 865 **/
827static int sd_release(struct gendisk *disk, fmode_t mode) 866static int sd_release(struct gendisk *disk, fmode_t mode)
828{ 867{
@@ -831,7 +870,7 @@ static int sd_release(struct gendisk *disk, fmode_t mode)
831 870
832 SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_release\n")); 871 SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_release\n"));
833 872
834 if (!--sdkp->openers && sdev->removable) { 873 if (atomic_dec_return(&sdkp->openers) && sdev->removable) {
835 if (scsi_block_when_processing_errors(sdev)) 874 if (scsi_block_when_processing_errors(sdev))
836 scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW); 875 scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW);
837 } 876 }
@@ -904,7 +943,7 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode,
904 error = scsi_nonblockable_ioctl(sdp, cmd, p, 943 error = scsi_nonblockable_ioctl(sdp, cmd, p,
905 (mode & FMODE_NDELAY) != 0); 944 (mode & FMODE_NDELAY) != 0);
906 if (!scsi_block_when_processing_errors(sdp) || !error) 945 if (!scsi_block_when_processing_errors(sdp) || !error)
907 return error; 946 goto out;
908 947
909 /* 948 /*
910 * Send SCSI addressing ioctls directly to mid level, send other 949 * Send SCSI addressing ioctls directly to mid level, send other
@@ -914,13 +953,17 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode,
914 switch (cmd) { 953 switch (cmd) {
915 case SCSI_IOCTL_GET_IDLUN: 954 case SCSI_IOCTL_GET_IDLUN:
916 case SCSI_IOCTL_GET_BUS_NUMBER: 955 case SCSI_IOCTL_GET_BUS_NUMBER:
917 return scsi_ioctl(sdp, cmd, p); 956 error = scsi_ioctl(sdp, cmd, p);
957 break;
918 default: 958 default:
919 error = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, p); 959 error = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, p);
920 if (error != -ENOTTY) 960 if (error != -ENOTTY)
921 return error; 961 break;
962 error = scsi_ioctl(sdp, cmd, p);
963 break;
922 } 964 }
923 return scsi_ioctl(sdp, cmd, p); 965out:
966 return error;
924} 967}
925 968
926static void set_media_not_present(struct scsi_disk *sdkp) 969static void set_media_not_present(struct scsi_disk *sdkp)
@@ -1045,15 +1088,6 @@ static int sd_sync_cache(struct scsi_disk *sdkp)
1045 return 0; 1088 return 0;
1046} 1089}
1047 1090
1048static void sd_prepare_flush(struct request_queue *q, struct request *rq)
1049{
1050 rq->cmd_type = REQ_TYPE_BLOCK_PC;
1051 rq->timeout = SD_TIMEOUT;
1052 rq->retries = SD_MAX_RETRIES;
1053 rq->cmd[0] = SYNCHRONIZE_CACHE;
1054 rq->cmd_len = 10;
1055}
1056
1057static void sd_rescan(struct device *dev) 1091static void sd_rescan(struct device *dev)
1058{ 1092{
1059 struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); 1093 struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
@@ -1103,7 +1137,7 @@ static const struct block_device_operations sd_fops = {
1103 .owner = THIS_MODULE, 1137 .owner = THIS_MODULE,
1104 .open = sd_open, 1138 .open = sd_open,
1105 .release = sd_release, 1139 .release = sd_release,
1106 .locked_ioctl = sd_ioctl, 1140 .ioctl = sd_ioctl,
1107 .getgeo = sd_getgeo, 1141 .getgeo = sd_getgeo,
1108#ifdef CONFIG_COMPAT 1142#ifdef CONFIG_COMPAT
1109 .compat_ioctl = sd_compat_ioctl, 1143 .compat_ioctl = sd_compat_ioctl,
@@ -1120,7 +1154,7 @@ static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd)
1120 u64 bad_lba; 1154 u64 bad_lba;
1121 int info_valid; 1155 int info_valid;
1122 1156
1123 if (!blk_fs_request(scmd->request)) 1157 if (scmd->request->cmd_type != REQ_TYPE_FS)
1124 return 0; 1158 return 0;
1125 1159
1126 info_valid = scsi_get_sense_info_fld(scmd->sense_buffer, 1160 info_valid = scsi_get_sense_info_fld(scmd->sense_buffer,
@@ -1171,6 +1205,12 @@ static int sd_done(struct scsi_cmnd *SCpnt)
1171 int sense_valid = 0; 1205 int sense_valid = 0;
1172 int sense_deferred = 0; 1206 int sense_deferred = 0;
1173 1207
1208 if (SCpnt->request->cmd_flags & REQ_DISCARD) {
1209 if (!result)
1210 scsi_set_resid(SCpnt, 0);
1211 return good_bytes;
1212 }
1213
1174 if (result) { 1214 if (result) {
1175 sense_valid = scsi_command_normalize_sense(SCpnt, &sshdr); 1215 sense_valid = scsi_command_normalize_sense(SCpnt, &sshdr);
1176 if (sense_valid) 1216 if (sense_valid)
@@ -2121,7 +2161,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
2121 else 2161 else
2122 ordered = QUEUE_ORDERED_DRAIN; 2162 ordered = QUEUE_ORDERED_DRAIN;
2123 2163
2124 blk_queue_ordered(sdkp->disk->queue, ordered, sd_prepare_flush); 2164 blk_queue_ordered(sdkp->disk->queue, ordered);
2125 2165
2126 set_capacity(disk, sdkp->capacity); 2166 set_capacity(disk, sdkp->capacity);
2127 kfree(buffer); 2167 kfree(buffer);
@@ -2234,6 +2274,7 @@ static void sd_probe_async(void *data, async_cookie_t cookie)
2234 sd_revalidate_disk(gd); 2274 sd_revalidate_disk(gd);
2235 2275
2236 blk_queue_prep_rq(sdp->request_queue, sd_prep_fn); 2276 blk_queue_prep_rq(sdp->request_queue, sd_prep_fn);
2277 blk_queue_unprep_rq(sdp->request_queue, sd_unprep_fn);
2237 2278
2238 gd->driverfs_dev = &sdp->sdev_gendev; 2279 gd->driverfs_dev = &sdp->sdev_gendev;
2239 gd->flags = GENHD_FL_EXT_DEVT; 2280 gd->flags = GENHD_FL_EXT_DEVT;
@@ -2313,7 +2354,7 @@ static int sd_probe(struct device *dev)
2313 sdkp->driver = &sd_template; 2354 sdkp->driver = &sd_template;
2314 sdkp->disk = gd; 2355 sdkp->disk = gd;
2315 sdkp->index = index; 2356 sdkp->index = index;
2316 sdkp->openers = 0; 2357 atomic_set(&sdkp->openers, 0);
2317 sdkp->previous_state = 1; 2358 sdkp->previous_state = 1;
2318 2359
2319 if (!sdp->request_queue->rq_timeout) { 2360 if (!sdp->request_queue->rq_timeout) {
@@ -2372,6 +2413,7 @@ static int sd_remove(struct device *dev)
2372 2413
2373 async_synchronize_full(); 2414 async_synchronize_full();
2374 blk_queue_prep_rq(sdkp->device->request_queue, scsi_prep_fn); 2415 blk_queue_prep_rq(sdkp->device->request_queue, scsi_prep_fn);
2416 blk_queue_unprep_rq(sdkp->device->request_queue, NULL);
2375 device_del(&sdkp->dev); 2417 device_del(&sdkp->dev);
2376 del_gendisk(sdkp->disk); 2418 del_gendisk(sdkp->disk);
2377 sd_shutdown(dev); 2419 sd_shutdown(dev);
diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h
index 43d3caf268ef..f81a9309e6de 100644
--- a/drivers/scsi/sd.h
+++ b/drivers/scsi/sd.h
@@ -47,7 +47,7 @@ struct scsi_disk {
47 struct scsi_device *device; 47 struct scsi_device *device;
48 struct device dev; 48 struct device dev;
49 struct gendisk *disk; 49 struct gendisk *disk;
50 unsigned int openers; /* protected by BKL for now, yuck */ 50 atomic_t openers;
51 sector_t capacity; /* size in 512-byte sectors */ 51 sector_t capacity; /* size in 512-byte sectors */
52 u32 index; 52 u32 index;
53 unsigned short hw_sector_size; 53 unsigned short hw_sector_size;
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
index 0a90abc7f140..ba9c3e0387ce 100644
--- a/drivers/scsi/sr.c
+++ b/drivers/scsi/sr.c
@@ -44,6 +44,7 @@
44#include <linux/init.h> 44#include <linux/init.h>
45#include <linux/blkdev.h> 45#include <linux/blkdev.h>
46#include <linux/mutex.h> 46#include <linux/mutex.h>
47#include <linux/smp_lock.h>
47#include <linux/slab.h> 48#include <linux/slab.h>
48#include <asm/uaccess.h> 49#include <asm/uaccess.h>
49 50
@@ -466,22 +467,27 @@ static int sr_prep_fn(struct request_queue *q, struct request *rq)
466 467
467static int sr_block_open(struct block_device *bdev, fmode_t mode) 468static int sr_block_open(struct block_device *bdev, fmode_t mode)
468{ 469{
469 struct scsi_cd *cd = scsi_cd_get(bdev->bd_disk); 470 struct scsi_cd *cd;
470 int ret = -ENXIO; 471 int ret = -ENXIO;
471 472
473 lock_kernel();
474 cd = scsi_cd_get(bdev->bd_disk);
472 if (cd) { 475 if (cd) {
473 ret = cdrom_open(&cd->cdi, bdev, mode); 476 ret = cdrom_open(&cd->cdi, bdev, mode);
474 if (ret) 477 if (ret)
475 scsi_cd_put(cd); 478 scsi_cd_put(cd);
476 } 479 }
480 unlock_kernel();
477 return ret; 481 return ret;
478} 482}
479 483
480static int sr_block_release(struct gendisk *disk, fmode_t mode) 484static int sr_block_release(struct gendisk *disk, fmode_t mode)
481{ 485{
482 struct scsi_cd *cd = scsi_cd(disk); 486 struct scsi_cd *cd = scsi_cd(disk);
487 lock_kernel();
483 cdrom_release(&cd->cdi, mode); 488 cdrom_release(&cd->cdi, mode);
484 scsi_cd_put(cd); 489 scsi_cd_put(cd);
490 unlock_kernel();
485 return 0; 491 return 0;
486} 492}
487 493
@@ -493,6 +499,8 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
493 void __user *argp = (void __user *)arg; 499 void __user *argp = (void __user *)arg;
494 int ret; 500 int ret;
495 501
502 lock_kernel();
503
496 /* 504 /*
497 * Send SCSI addressing ioctls directly to mid level, send other 505 * Send SCSI addressing ioctls directly to mid level, send other
498 * ioctls to cdrom/block level. 506 * ioctls to cdrom/block level.
@@ -500,12 +508,13 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
500 switch (cmd) { 508 switch (cmd) {
501 case SCSI_IOCTL_GET_IDLUN: 509 case SCSI_IOCTL_GET_IDLUN:
502 case SCSI_IOCTL_GET_BUS_NUMBER: 510 case SCSI_IOCTL_GET_BUS_NUMBER:
503 return scsi_ioctl(sdev, cmd, argp); 511 ret = scsi_ioctl(sdev, cmd, argp);
512 goto out;
504 } 513 }
505 514
506 ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg); 515 ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg);
507 if (ret != -ENOSYS) 516 if (ret != -ENOSYS)
508 return ret; 517 goto out;
509 518
510 /* 519 /*
511 * ENODEV means that we didn't recognise the ioctl, or that we 520 * ENODEV means that we didn't recognise the ioctl, or that we
@@ -516,8 +525,12 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
516 ret = scsi_nonblockable_ioctl(sdev, cmd, argp, 525 ret = scsi_nonblockable_ioctl(sdev, cmd, argp,
517 (mode & FMODE_NDELAY) != 0); 526 (mode & FMODE_NDELAY) != 0);
518 if (ret != -ENODEV) 527 if (ret != -ENODEV)
519 return ret; 528 goto out;
520 return scsi_ioctl(sdev, cmd, argp); 529 ret = scsi_ioctl(sdev, cmd, argp);
530
531out:
532 unlock_kernel();
533 return ret;
521} 534}
522 535
523static int sr_block_media_changed(struct gendisk *disk) 536static int sr_block_media_changed(struct gendisk *disk)
@@ -531,7 +544,7 @@ static const struct block_device_operations sr_bdops =
531 .owner = THIS_MODULE, 544 .owner = THIS_MODULE,
532 .open = sr_block_open, 545 .open = sr_block_open,
533 .release = sr_block_release, 546 .release = sr_block_release,
534 .locked_ioctl = sr_block_ioctl, 547 .ioctl = sr_block_ioctl,
535 .media_changed = sr_block_media_changed, 548 .media_changed = sr_block_media_changed,
536 /* 549 /*
537 * No compat_ioctl for now because sr_block_ioctl never 550 * No compat_ioctl for now because sr_block_ioctl never
diff --git a/drivers/scsi/sun3_NCR5380.c b/drivers/scsi/sun3_NCR5380.c
index b5838d547c68..713620ed70d9 100644
--- a/drivers/scsi/sun3_NCR5380.c
+++ b/drivers/scsi/sun3_NCR5380.c
@@ -2022,7 +2022,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
2022 if((count > SUN3_DMA_MINSIZE) && (sun3_dma_setup_done 2022 if((count > SUN3_DMA_MINSIZE) && (sun3_dma_setup_done
2023 != cmd)) 2023 != cmd))
2024 { 2024 {
2025 if(blk_fs_request(cmd->request)) { 2025 if (cmd->request->cmd_type == REQ_TYPE_FS) {
2026 sun3scsi_dma_setup(d, count, 2026 sun3scsi_dma_setup(d, count,
2027 rq_data_dir(cmd->request)); 2027 rq_data_dir(cmd->request));
2028 sun3_dma_setup_done = cmd; 2028 sun3_dma_setup_done = cmd;
diff --git a/drivers/scsi/sun3_scsi.c b/drivers/scsi/sun3_scsi.c
index e606cf0a2eb7..613f5880d135 100644
--- a/drivers/scsi/sun3_scsi.c
+++ b/drivers/scsi/sun3_scsi.c
@@ -524,7 +524,7 @@ static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted,
524 struct scsi_cmnd *cmd, 524 struct scsi_cmnd *cmd,
525 int write_flag) 525 int write_flag)
526{ 526{
527 if(blk_fs_request(cmd->request)) 527 if (cmd->request->cmd_type == REQ_TYPE_FS)
528 return wanted; 528 return wanted;
529 else 529 else
530 return 0; 530 return 0;
diff --git a/drivers/scsi/sun3_scsi_vme.c b/drivers/scsi/sun3_scsi_vme.c
index aaa4fd0dd1b9..7c526b8e30ac 100644
--- a/drivers/scsi/sun3_scsi_vme.c
+++ b/drivers/scsi/sun3_scsi_vme.c
@@ -458,7 +458,7 @@ static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted,
458 struct scsi_cmnd *cmd, 458 struct scsi_cmnd *cmd,
459 int write_flag) 459 int write_flag)
460{ 460{
461 if(blk_fs_request(cmd->request)) 461 if (cmd->request->cmd_type == REQ_TYPE_FS)
462 return wanted; 462 return wanted;
463 else 463 else
464 return 0; 464 return 0;