Re: [Bug 588] New: 2.5.67 won't get the real partition table for hdb

From: Tord Øygard (torden88@yahoo.no)
Date: Wed Apr 16 2003 - 10:31:54 EST


Andries.Brouwer@cwi.nl wrote:

>>So if you could send me that patch, I would be glad.
>>
>>
>
>Below a patch of 2.5.67. It removes the file ide-geometry.c
>and adds the boot option "hdb=remap63" that shifts all of hdb
>by 63 sectors. (This is what the old code would do in case it
>detected OnTrack disk manager.)
>
>Please report.
>
>Andries
>
>-------------------------------------------------------------
>diff -u --recursive --new-file -X /linux/dontdiff a/Documentation/ide.txt b/Documentation/ide.txt
>--- a/Documentation/ide.txt Tue Mar 18 11:48:10 2003
>+++ b/Documentation/ide.txt Wed Apr 16 14:50:15 2003
>@@ -230,6 +230,10 @@
> "hdx=cdrom" : drive is present, and is a cdrom drive
>
> "hdx=cyl,head,sect" : disk drive is present, with specified geometry
>+
>+ "hdx=remap" : remap access of sector 0 to sector 1 (for EZD)
>+
>+ "hdx=remap63" : remap the drive: shift all by 63 sectors (for DM)
>
> "hdx=autotune" : driver will attempt to tune interface speed
> to the fastest PIO mode supported,
>diff -u --recursive --new-file -X /linux/dontdiff a/drivers/ide/Makefile b/drivers/ide/Makefile
>--- a/drivers/ide/Makefile Tue Mar 25 04:54:31 2003
>+++ b/drivers/ide/Makefile Wed Apr 16 14:46:25 2003
>@@ -12,7 +12,7 @@
>
> # Core IDE code - must come before legacy
>
>-obj-$(CONFIG_BLK_DEV_IDE) += ide-io.o ide-probe.o ide-geometry.o ide-iops.o ide-taskfile.o ide.o ide-lib.o ide-default.o
>+obj-$(CONFIG_BLK_DEV_IDE) += ide-io.o ide-probe.o ide-iops.o ide-taskfile.o ide.o ide-lib.o ide-default.o
> obj-$(CONFIG_BLK_DEV_IDEDISK) += ide-disk.o
> obj-$(CONFIG_BLK_DEV_IDECD) += ide-cd.o
> obj-$(CONFIG_BLK_DEV_IDETAPE) += ide-tape.o
>diff -u --recursive --new-file -X /linux/dontdiff a/drivers/ide/ide-geometry.c b/drivers/ide/ide-geometry.c
>--- a/drivers/ide/ide-geometry.c Tue Mar 25 04:54:31 2003
>+++ b/drivers/ide/ide-geometry.c Thu Jan 1 01:00:00 1970
>@@ -1,135 +0,0 @@
>-/*
>- * linux/drivers/ide/ide-geometry.c
>- */
>-#include <linux/config.h>
>-#include <linux/ide.h>
>-#include <linux/mc146818rtc.h>
>-#include <asm/io.h>
>-
>-extern unsigned long current_capacity (ide_drive_t *);
>-
>-/*
>- * If heads is nonzero: find a translation with this many heads and S=63.
>- * Otherwise: find out how OnTrack Disk Manager would translate the disk.
>- */
>-
>-static void ontrack(ide_drive_t *drive, int heads, unsigned int *c, int *h, int *s)
>-{
>- static const u8 dm_head_vals[] = {4, 8, 16, 32, 64, 128, 255, 0};
>- const u8 *headp = dm_head_vals;
>- unsigned long total;
>-
>- /*
>- * The specs say: take geometry as obtained from Identify,
>- * compute total capacity C*H*S from that, and truncate to
>- * 1024*255*63. Now take S=63, H the first in the sequence
>- * 4, 8, 16, 32, 64, 128, 255 such that 63*H*1024 >= total.
>- * [Please tell aeb@cwi.nl in case this computes a
>- * geometry different from what OnTrack uses.]
>- */
>- total = DRIVER(drive)->capacity(drive);
>-
>- *s = 63;
>-
>- if (heads) {
>- *h = heads;
>- *c = total / (63 * heads);
>- return;
>- }
>-
>- while (63 * headp[0] * 1024 < total && headp[1] != 0)
>- headp++;
>- *h = headp[0];
>- *c = total / (63 * headp[0]);
>-}
>-
>-/*
>- * This routine is called from the partition-table code in pt/msdos.c.
>- * It has two tasks:
>- * (i) to handle Ontrack DiskManager by offsetting everything by 63 sectors,
>- * or to handle EZdrive by remapping sector 0 to sector 1.
>- * (ii) to invent a translated geometry.
>- * Part (i) is suppressed if the user specifies the "noremap" option
>- * on the command line.
>- * Part (ii) is suppressed if the user specifies an explicit geometry.
>- *
>- * The ptheads parameter is either 0 or tells about the number of
>- * heads shown by the end of the first nonempty partition.
>- * If this is either 16, 32, 64, 128, 240 or 255 we'll believe it.
>- *
>- * The xparm parameter has the following meaning:
>- * 0 = convert to CHS with fewer than 1024 cyls
>- * using the same method as Ontrack DiskManager.
>- * 1 = same as "0", plus offset everything by 63 sectors.
>- * -1 = similar to "0", plus redirect sector 0 to sector 1.
>- * 2 = convert to a CHS geometry with "ptheads" heads.
>- *
>- * Returns 0 if the translation was not possible, if the device was not
>- * an IDE disk drive, or if a geometry was "forced" on the commandline.
>- * Returns 1 if the geometry translation was successful.
>- */
>-
>-int ide_xlate_1024 (struct block_device *bdev, int xparm, int ptheads, const char *msg)
>-{
>- ide_drive_t *drive = bdev->bd_disk->private_data;
>- const char *msg1 = "";
>- int heads = 0;
>- int c, h, s;
>- int transl = 1; /* try translation */
>- int ret = 0;
>-
>- /* remap? */
>- if (drive->remap_0_to_1 != 2) {
>- if (xparm == 1) { /* DM */
>- drive->sect0 = 63;
>- msg1 = " [remap +63]";
>- ret = 1;
>- } else if (xparm == -1) { /* EZ-Drive */
>- if (drive->remap_0_to_1 == 0) {
>- drive->remap_0_to_1 = 1;
>- msg1 = " [remap 0->1]";
>- ret = 1;
>- }
>- }
>- }
>-
>- /* There used to be code here that assigned drive->id->CHS
>- to drive->CHS and that to drive->bios_CHS. However,
>- some disks have id->C/H/S = 4092/16/63 but are larger than 2.1 GB.
>- In such cases that code was wrong. Moreover,
>- there seems to be no reason to do any of these things. */
>-
>- /* translate? */
>- if (drive->forced_geom)
>- transl = 0;
>-
>- /* does ptheads look reasonable? */
>- if (ptheads == 32 || ptheads == 64 || ptheads == 128 ||
>- ptheads == 240 || ptheads == 255)
>- heads = ptheads;
>-
>- if (xparm == 2) {
>- if (!heads ||
>- (drive->bios_head >= heads && drive->bios_sect == 63))
>- transl = 0;
>- }
>- if (xparm == -1) {
>- if (drive->bios_head > 16)
>- transl = 0; /* we already have a translation */
>- }
>-
>- if (transl) {
>- ontrack(drive, heads, &c, &h, &s);
>- drive->bios_cyl = c;
>- drive->bios_head = h;
>- drive->bios_sect = s;
>- ret = 1;
>- }
>-
>- set_capacity(drive->disk, current_capacity(drive));
>-
>- if (ret)
>- printk("%s%s [%d/%d/%d]", msg, msg1,
>- drive->bios_cyl, drive->bios_head, drive->bios_sect);
>- return ret;
>-}
>diff -u --recursive --new-file -X /linux/dontdiff a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
>--- a/drivers/ide/ide-probe.c Tue Mar 25 04:54:31 2003
>+++ b/drivers/ide/ide-probe.c Wed Apr 16 14:46:25 2003
>@@ -1442,8 +1442,6 @@
> }
>
> #ifdef MODULE
>-extern int (*ide_xlate_1024_hook)(struct block_device *, int, int, const char *);
>-
> int init_module (void)
> {
> unsigned int index;
>@@ -1452,14 +1450,12 @@
> ide_unregister(index);
> ideprobe_init();
> create_proc_ide_interfaces();
>- ide_xlate_1024_hook = ide_xlate_1024;
> return 0;
> }
>
> void cleanup_module (void)
> {
> ide_probe = NULL;
>- ide_xlate_1024_hook = 0;
> }
> MODULE_LICENSE("GPL");
> #endif /* MODULE */
>diff -u --recursive --new-file -X /linux/dontdiff a/drivers/ide/ide.c b/drivers/ide/ide.c
>--- a/drivers/ide/ide.c Tue Apr 8 09:36:37 2003
>+++ b/drivers/ide/ide.c Wed Apr 16 14:46:25 2003
>@@ -1711,6 +1711,8 @@
> * "hdx=nowerr" : ignore the WRERR_STAT bit on this drive
> * "hdx=cdrom" : drive is present, and is a cdrom drive
> * "hdx=cyl,head,sect" : disk drive is present, with specified geometry
>+ * "hdx=remap63" : add 63 to all sector numbers (for OnTrack DM)
>+ * "hdx=remap" : remap 0->1 (for EZDrive)
> * "hdx=noremap" : do not remap 0->1 even though EZD was detected
> * "hdx=autotune" : driver will attempt to tune interface speed
> * to the fastest PIO mode supported,
>@@ -1830,11 +1832,11 @@
> * Look for drive options: "hdx="
> */
> if (s[0] == 'h' && s[1] == 'd' && s[2] >= 'a' && s[2] <= max_drive) {
>- const char *hd_words[] = {"none", "noprobe", "nowerr", "cdrom",
>- "serialize", "autotune", "noautotune",
>- "slow", "swapdata", "bswap", "flash",
>- "remap", "noremap", "scsi", "biostimings",
>- NULL};
>+ const char *hd_words[] = {
>+ "none", "noprobe", "nowerr", "cdrom", "serialize",
>+ "autotune", "noautotune", "slow", "swapdata", "bswap",
>+ "flash", "remap", "noremap", "scsi", "biostimings",
>+ "remap63", NULL };
> unit = s[2] - 'a';
> hw = unit / MAX_DRIVES;
> unit = unit % MAX_DRIVES;
>@@ -1884,8 +1886,8 @@
> case -8: /* "slow" */
> drive->slow = 1;
> goto done;
>- case -9: /* "swapdata" or "bswap" */
>- case -10:
>+ case -9: /* "swapdata" */
>+ case -10: /* "bswap" */
> drive->bswap = 1;
> goto done;
> case -11: /* "flash" */
>@@ -1908,6 +1910,9 @@
> case -15: /* "biostimings" */
> drive->autotune = IDE_TUNE_BIOS;
> goto done;
>+ case -16: /* "remap63" */
>+ drive->sect0 = 63;
>+ goto done;
> case 3: /* cyl,head,sect */
> drive->media = ide_disk;
> drive->cyl = drive->bios_cyl = vals[0];
>diff -u --recursive --new-file -X /linux/dontdiff a/fs/partitions/msdos.c b/fs/partitions/msdos.c
>--- a/fs/partitions/msdos.c Mon Feb 24 23:02:56 2003
>+++ b/fs/partitions/msdos.c Wed Apr 16 14:46:25 2003
>@@ -20,27 +20,15 @@
> */
>
> #include <linux/config.h>
>-#include <linux/buffer_head.h> /* for invalidate_bdev() */
>-
>-#ifdef CONFIG_BLK_DEV_IDE
>-#include <linux/hdreg.h>
>-#include <linux/ide.h> /* IDE xlate */
>-#elif defined(CONFIG_BLK_DEV_IDE_MODULE)
>-#include <linux/module.h>
>-
>-int (*ide_xlate_1024_hook)(struct block_device *, int, int, const char *);
>-EXPORT_SYMBOL(ide_xlate_1024_hook);
>-#define ide_xlate_1024 ide_xlate_1024_hook
>-#endif
>
> #include "check.h"
> #include "msdos.h"
> #include "efi.h"
>
> /*
>- * Many architectures don't like unaligned accesses, which is
>- * frequently the case with the nr_sects and start_sect partition
>- * table entries.
>+ * Many architectures don't like unaligned accesses, while
>+ * the nr_sects and start_sect partition table entries are
>+ * at a 2 (mod 4) address.
> */
> #include <asm/unaligned.h>
>
>diff -u --recursive --new-file -X /linux/dontdiff a/include/linux/ide.h b/include/linux/ide.h
>--- a/include/linux/ide.h Tue Mar 25 04:54:45 2003
>+++ b/include/linux/ide.h Wed Apr 16 14:46:25 2003
>@@ -1317,12 +1317,6 @@
> extern int ide_wait_stat(ide_startstop_t *, ide_drive_t *, u8, u8, unsigned long);
>
> /*
>- * This routine is called from the partition-table code in genhd.c
>- * to "convert" a drive to a logical geometry with fewer than 1024 cyls.
>- */
>-extern int ide_xlate_1024(struct block_device *, int, int, const char *);
>-
>-/*
> * Return the current idea about the total capacity of this drive.
> */
> extern unsigned long current_capacity (ide_drive_t *drive);
>
>

That patch worked just fine ;)

Now it booted, and averything is nice.

But one thing:
Do I have to upgrade my modutils?
It did not want to load modules...
It said something about QM_MODULES or something...

But the patch worked fine:)
Thanks.

I will report more bugs if I find some!

Tord

>
>
>
>

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Wed Apr 23 2003 - 22:00:18 EST