Skip to content

Commit

Permalink
Revert "[SCSI] extend the last_sector_bug flag to cover more sectors"
Browse files Browse the repository at this point in the history
This reverts commit 2b14290, 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>
  • Loading branch information
Linus Torvalds committed Aug 4, 2008
1 parent 8f616cd commit fca082c
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 23 deletions.
21 changes: 6 additions & 15 deletions drivers/scsi/sd.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,6 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
struct gendisk *disk = rq->rq_disk;
struct scsi_disk *sdkp;
sector_t block = rq->sector;
sector_t threshold;
unsigned int this_count = rq->nr_sectors;
unsigned int timeout = sdp->timeout;
int ret;
Expand Down Expand Up @@ -423,21 +422,13 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
}

/*
* Some SD card readers can't handle multi-sector accesses which touch
* the last one or two hardware sectors. Split accesses as needed.
* Some devices (some sdcards for one) don't like it if the
* last sector gets read in a larger then 1 sector read.
*/
threshold = get_capacity(disk) - SD_LAST_BUGGY_SECTORS *
(sdp->sector_size / 512);

if (unlikely(sdp->last_sector_bug && block + this_count > threshold)) {
if (block < threshold) {
/* Access up to the threshold but not beyond */
this_count = threshold - block;
} else {
/* Access only a single hardware sector */
this_count = sdp->sector_size / 512;
}
}
if (unlikely(sdp->last_sector_bug &&
rq->nr_sectors > sdp->sector_size / 512 &&
block + this_count == get_capacity(disk)))
this_count -= sdp->sector_size / 512;

SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt, "block=%llu\n",
(unsigned long long)block));
Expand Down
6 changes: 0 additions & 6 deletions drivers/scsi/sd.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,6 @@
*/
#define SD_BUF_SIZE 512

/*
* Number of sectors at the end of the device to avoid multi-sector
* accesses to in the case of last_sector_bug
*/
#define SD_LAST_BUGGY_SECTORS 8

struct scsi_disk {
struct scsi_driver *driver; /* always &sd_template */
struct scsi_device *device;
Expand Down
3 changes: 1 addition & 2 deletions include/scsi/scsi_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,7 @@ struct scsi_device {
unsigned fix_capacity:1; /* READ_CAPACITY is too high by 1 */
unsigned guess_capacity:1; /* READ_CAPACITY might be too high by 1 */
unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */
unsigned last_sector_bug:1; /* do not use multisector accesses on
SD_LAST_BUGGY_SECTORS */
unsigned last_sector_bug:1; /* Always read last sector in a 1 sector read */

DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
struct list_head event_list; /* asserted events */
Expand Down

0 comments on commit fca082c

Please sign in to comment.