[syslinux:master] diskio: move strict CHS start value check into chs_rdwr_sectors()
syslinux-bot for H. Peter Anvin
hpa at linux.intel.com
Fri Jul 16 16:30:04 PDT 2010
Commit-ID: bd23fe1f1d376284bf02556d84e6d6fa8111fd00
Gitweb: http://syslinux.zytor.com/commit/bd23fe1f1d376284bf02556d84e6d6fa8111fd00
Author: H. Peter Anvin <hpa at linux.intel.com>
AuthorDate: Fri, 16 Jul 2010 16:29:17 -0700
Committer: H. Peter Anvin <hpa at linux.intel.com>
CommitDate: Fri, 16 Jul 2010 16:29:17 -0700
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 at linux.intel.com>
---
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 cf9bf49..51f2f39 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],
More information about the Syslinux-commits
mailing list