From: "Tord Øygard" <torden88@yahoo.no>
To: Andries.Brouwer@cwi.nl
Cc: alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org
Subject: Re: [Bug 588] New: 2.5.67 won't get the real partition table for hdb
Date: Wed, 16 Apr 2003 15:31:54 +0000 [thread overview]
Message-ID: <3E9D776A.5030107@yahoo.no> (raw)
In-Reply-To: <UTC200304161304.h3GD45t18903.aeb@smtp.cwi.nl>
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
>
>
>
>
next prev parent reply other threads:[~2003-04-16 13:20 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-04-16 13:04 [Bug 588] New: 2.5.67 won't get the real partition table for hdb Andries.Brouwer
2003-04-16 15:31 ` Tord Øygard [this message]
-- strict thread matches above, loose matches on Subject: below --
2003-04-16 14:39 Andries.Brouwer
2003-04-15 15:50 Martin J. Bligh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3E9D776A.5030107@yahoo.no \
--to=torden88@yahoo.no \
--cc=Andries.Brouwer@cwi.nl \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.