diff options
author | H. Peter Anvin <hpa@linux.intel.com> | 2010-07-16 16:29:17 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2010-07-16 16:29:17 -0700 |
commit | bd23fe1f1d376284bf02556d84e6d6fa8111fd00 (patch) | |
tree | 6d187692a6932df58778052c8b1a67bccb562f19 /core/fs | |
parent | 055f763ca8c0eb69724cf5c1e5cb9511dce724f9 (diff) | |
download | syslinux-bd23fe1f1d376284bf02556d84e6d6fa8111fd00.tar.gz |
diskio: move strict CHS start value check into chs_rdwr_sectors()
It really makes more sense in chs_rdwr_sectors()...
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'core/fs')
-rw-r--r-- | core/fs/diskio.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/core/fs/diskio.c b/core/fs/diskio.c index cf9bf499..51f2f39d 100644 --- a/core/fs/diskio.c +++ b/core/fs/diskio.c @@ -9,6 +9,11 @@ #define RETRY_COUNT 6 +static inline sector_t chs_max(const struct disk *disk) +{ + return (disk->h * disk->s) << 10; +} + static int chs_rdwr_sectors(struct disk *disk, void *buf, sector_t lba, size_t count, bool is_write) { @@ -25,7 +30,7 @@ static int chs_rdwr_sectors(struct disk *disk, void *buf, int retry; uint32_t maxtransfer = disk->maxtransfer; - if (lba + disk->part_start >= 1024*256*63) + if (lba + disk->part_start >= chs_max(disk)) return 0; /* Impossible CHS request */ memset(&ireg, 0, sizeof ireg); @@ -227,15 +232,16 @@ static int edd_rdwr_sectors(struct disk *disk, void *buf, * EDD-capable but aren't; the known such systems return * error code AH=1 (invalid function), but let's not * assume that for now. + * + * Try to fall back to CHS. If the LBA is absurd, the + * chs_max() test in chs_rdwr_sectors() will catch it. */ - if (lba < ((disk->h * disk->s) << 10)) { - done = chs_rdwr_sectors(disk, buf, lba - disk->part_start, - count, is_write); - if (done == (count << sector_shift)) { - /* Successful, assume this is a CHS disk */ - disk->rdwr_sectors = chs_rdwr_sectors; - return done; - } + done = chs_rdwr_sectors(disk, buf, lba - disk->part_start, + count, is_write); + if (done == (count << sector_shift)) { + /* Successful, assume this is a CHS disk */ + disk->rdwr_sectors = chs_rdwr_sectors; + return done; } printf("EDD: Error %04x %s sector %llu\n", oreg.eax.w[0], |