aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-08-04 19:36:20 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-08-04 19:36:20 -0400
commitfca082c9f1e11ec07efa8d2f9f13688521253f36 (patch)
tree94a18d0aed308b44ba606261c603c63860c35c30
parent8f616cd5249e03c9e1b371623d85e76d4b86bbc1 (diff)
Revert "[SCSI] extend the last_sector_bug flag to cover more sectors"
This reverts commit 2b142900784c6e38c8d39fa57d5f95ef08e735d8, since it seems to break some other USB storage devices (at least a JMicron USB to ATA bridge). As such, while it apparently fixes some cardreaders, it would need to be made conditional on the exact reader it fixes in order to avoid causing regressions. Cc: Alan Jenkins <alan-jenkins@tuffmail.co.uk> Cc: James Bottomley <James.Bottomley@HansenPartnership.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/scsi/sd.c21
-rw-r--r--drivers/scsi/sd.h6
-rw-r--r--include/scsi/scsi_device.h3
3 files changed, 7 insertions, 23 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index e5e7d7856454..8e08d51a0f05 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -375,7 +375,6 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
375 struct gendisk *disk = rq->rq_disk; 375 struct gendisk *disk = rq->rq_disk;
376 struct scsi_disk *sdkp; 376 struct scsi_disk *sdkp;
377 sector_t block = rq->sector; 377 sector_t block = rq->sector;
378 sector_t threshold;
379 unsigned int this_count = rq->nr_sectors; 378 unsigned int this_count = rq->nr_sectors;
380 unsigned int timeout = sdp->timeout; 379 unsigned int timeout = sdp->timeout;
381 int ret; 380 int ret;
@@ -423,21 +422,13 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
423 } 422 }
424 423
425 /* 424 /*
426 * Some SD card readers can't handle multi-sector accesses which touch 425 * Some devices (some sdcards for one) don't like it if the
427 * the last one or two hardware sectors. Split accesses as needed. 426 * last sector gets read in a larger then 1 sector read.
428 */ 427 */
429 threshold = get_capacity(disk) - SD_LAST_BUGGY_SECTORS * 428 if (unlikely(sdp->last_sector_bug &&
430 (sdp->sector_size / 512); 429 rq->nr_sectors > sdp->sector_size / 512 &&
431 430 block + this_count == get_capacity(disk)))
432 if (unlikely(sdp->last_sector_bug && block + this_count > threshold)) { 431 this_count -= sdp->sector_size / 512;
433 if (block < threshold) {
434 /* Access up to the threshold but not beyond */
435 this_count = threshold - block;
436 } else {
437 /* Access only a single hardware sector */
438 this_count = sdp->sector_size / 512;
439 }
440 }
441 432
442 SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt, "block=%llu\n", 433 SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt, "block=%llu\n",
443 (unsigned long long)block)); 434 (unsigned long long)block));
diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h
index 95b9f06534d5..550b2f70a1f8 100644
--- a/drivers/scsi/sd.h
+++ b/drivers/scsi/sd.h
@@ -31,12 +31,6 @@
31 */ 31 */
32#define SD_BUF_SIZE 512 32#define SD_BUF_SIZE 512
33 33
34/*
35 * Number of sectors at the end of the device to avoid multi-sector
36 * accesses to in the case of last_sector_bug
37 */
38#define SD_LAST_BUGGY_SECTORS 8
39
40struct scsi_disk { 34struct scsi_disk {
41 struct scsi_driver *driver; /* always &sd_template */ 35 struct scsi_driver *driver; /* always &sd_template */
42 struct scsi_device *device; 36 struct scsi_device *device;
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index 291d56a19167..9cecc409f0f8 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -140,8 +140,7 @@ struct scsi_device {
140 unsigned fix_capacity:1; /* READ_CAPACITY is too high by 1 */ 140 unsigned fix_capacity:1; /* READ_CAPACITY is too high by 1 */
141 unsigned guess_capacity:1; /* READ_CAPACITY might be too high by 1 */ 141 unsigned guess_capacity:1; /* READ_CAPACITY might be too high by 1 */
142 unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */ 142 unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */
143 unsigned last_sector_bug:1; /* do not use multisector accesses on 143 unsigned last_sector_bug:1; /* Always read last sector in a 1 sector read */
144 SD_LAST_BUGGY_SECTORS */
145 144
146 DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */ 145 DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
147 struct list_head event_list; /* asserted events */ 146 struct list_head event_list; /* asserted events */