diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-08-04 19:36:20 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-08-04 19:36:20 -0400 |
commit | fca082c9f1e11ec07efa8d2f9f13688521253f36 (patch) | |
tree | 94a18d0aed308b44ba606261c603c63860c35c30 /drivers/scsi/sd.c | |
parent | 8f616cd5249e03c9e1b371623d85e76d4b86bbc1 (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>
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r-- | drivers/scsi/sd.c | 21 |
1 files changed, 6 insertions, 15 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)); |