summaryrefslogtreecommitdiff
path: root/etc/etc.i386/INSTALL.linux
diff options
context:
space:
mode:
authorMarc Espie <espie@cvs.openbsd.org>1999-01-09 17:18:21 +0000
committerMarc Espie <espie@cvs.openbsd.org>1999-01-09 17:18:21 +0000
commitb250c52a54a49bc627cbf7bd108c48fd3d2df065 (patch)
tree6d8e7d779df687e8973f476427a41c9251017200 /etc/etc.i386/INSTALL.linux
parent586b542913037a135cc720bda1262dacb290772a (diff)
linux 2.2.0 is almost out, and my OpenBSD patch finally made it to the
pre-2.2 series.
Diffstat (limited to 'etc/etc.i386/INSTALL.linux')
-rw-r--r--etc/etc.i386/INSTALL.linux180
1 files changed, 6 insertions, 174 deletions
diff --git a/etc/etc.i386/INSTALL.linux b/etc/etc.i386/INSTALL.linux
index 22b7697eafe..94745e5fee7 100644
--- a/etc/etc.i386/INSTALL.linux
+++ b/etc/etc.i386/INSTALL.linux
@@ -1,4 +1,4 @@
-$OpenBSD: INSTALL.linux,v 1.4 1998/09/25 01:58:38 espie Exp $
+$OpenBSD: INSTALL.linux,v 1.5 1999/01/09 17:18:20 espie Exp $
Warning: this document is currently being reviewed. It's not yet complete,
and probably contains loads of errors. As an example, I can't figure out
@@ -398,179 +398,11 @@ rerun lilo, and voila, OpenBSD was able to boot !
Linux and OpenBSD partitions
----------------------------
-As of 2.0.35/2.1.122, Linux does not support OpenBSD partitions. The way
-the Linux kernel works is reasonably straightforward (code in
-drivers/block/genhd.c): when detecting a BSD partition (type A5),
-it checks and parses the first block for a disklabel, and use that
-information to instantiate some new partitions,
-that will show up in that drive's partition list, exactly like extended
-partitions do show up. Unfortunately, that check is hard coded for a type A5
-(NetBSD/FreeBSD) partition, and it recognizes 8 partitions disklabels only
-anyway.
-
-Just hacking the Linux code to recognize A6 is not quite enough. You also
-need to trim down the resulting list of partitions, as your ext2fs
-partitions will now show up twice !
-I'm experimenting with the following patch, which should make it to linux-kernel
-soon:
---------------------------------------------------------------
-diff -ur linux.orig/drivers/block/genhd.c linux/drivers/block/genhd.c
---- linux.orig/drivers/block/genhd.c Mon Aug 4 20:45:35 1997
-+++ linux/drivers/block/genhd.c Thu Sep 24 18:55:31 1998
-@@ -205,11 +206,46 @@
- }
-
- #ifdef CONFIG_BSD_DISKLABEL
-+static void check_and_add_bsd_partition(struct gendisk *hd, struct bsd_partition *bsd_p)
-+{
-+ struct hd_struct *lin_p;
-+ /* check relative position of partitions. */
-+ for (lin_p = hd->part + 1; lin_p - hd->part < current_minor; lin_p++) {
-+ /* no relationship -> try again */
-+ if (lin_p->start_sect + lin_p->nr_sects <= bsd_p->p_offset
-+ || lin_p->start_sect >= bsd_p->p_offset + bsd_p->p_size)
-+ continue;
-+ /* equal -> no need to add */
-+ if (lin_p->start_sect == bsd_p->p_offset &&
-+ lin_p->nr_sects == bsd_p->p_size)
-+ return;
-+ /* bsd living within dos partition */
-+ if (lin_p->start_sect <= bsd_p->p_offset && lin_p->start_sect
-+ + lin_p->nr_sects >= bsd_p->p_offset + bsd_p->p_size) {
-+#ifdef DEBUG_BSD_DISKLABEL
-+ printk("w: %d %ld+%ld,%d+%d",
-+ lin_p - hd->part, lin_p->start_sect, lin_p->nr_sects,
-+ bsd_p->p_offset, bsd_p->p_size);
-+#endif
-+ break;
-+ }
-+ /* ouch: bsd and linux overlap. Don't even try for that partition */
-+#ifdef DEBUG_BSD_DISKLABEL
-+ printk("???: %d %ld+%ld,%d+%d",
-+ lin_p - hd->part, lin_p->start_sect, lin_p->nr_sects,
-+ bsd_p->p_offset, bsd_p->p_size);
-+#endif
-+ printk("???");
-+ return;
-+ } /* if the bsd partition is not described by DOS, we end up there */
-+ add_partition(hd, current_minor, bsd_p->p_offset, bsd_p->p_size);
-+ current_minor++;
-+}
- /*
- * Create devices for BSD partitions listed in a disklabel, under a
- * dos-like partition. See extended_partition() for more information.
- */
--static void bsd_disklabel_partition(struct gendisk *hd, kdev_t dev)
-+static void bsd_disklabel_partition(struct gendisk *hd, kdev_t dev, int max_partitions)
- {
- struct buffer_head *bh;
- struct bsd_disklabel *l;
-@@ -225,19 +261,15 @@
- return;
- }
-
-- p = &l->d_partitions[0];
-- while (p - &l->d_partitions[0] <= BSD_MAXPARTITIONS) {
-+ if (l->d_npartitions < max_partitions)
-+ max_partitions = l->d_npartitions;
-+ for (p = l->d_partitions; p - l->d_partitions < max_partitions; p++) {
- if ((current_minor & mask) >= (4 + hd->max_p))
- break;
--
-- if (p->p_fstype != BSD_FS_UNUSED) {
-- add_partition(hd, current_minor, p->p_offset, p->p_size);
-- current_minor++;
-- }
-- p++;
-+ if (p->p_fstype != BSD_FS_UNUSED)
-+ check_and_add_bsd_partition(hd, p);
- }
- brelse(bh);
--
- }
- #endif
-
-@@ -248,6 +280,11 @@
- struct partition *p;
- unsigned char *data;
- int mask = (1 << hd->minor_shift) - 1;
-+#ifdef CONFIG_BSD_DISKLABEL
-+ /* no bsd disklabel as a default */
-+ kdev_t bsd_kdev = 0;
-+ int bsd_maxpart;
-+#endif
- #ifdef CONFIG_BLK_DEV_IDE
- int tested_for_xlate = 0;
-
-@@ -365,13 +402,29 @@
- hd->part[minor].nr_sects = 2;
- }
- #ifdef CONFIG_BSD_DISKLABEL
-+ /* tag first disklabel for late recognition */
- if (SYS_IND(p) == BSD_PARTITION) {
-- printk(" <");
-- bsd_disklabel_partition(hd, MKDEV(hd->major, minor));
-- printk(" >");
-+ printk("!");
-+ if (!bsd_kdev) {
-+ bsd_kdev = MKDEV(hd->major, minor);
-+ bsd_maxpart = BSD_MAXPARTITIONS;
-+ }
-+ } else if (SYS_IND(p) == OPENBSD_PARTITION) {
-+ printk("!");
-+ if (!bsd_kdev) {
-+ bsd_kdev = MKDEV(hd->major, minor);
-+ bsd_maxpart = OPENBSD_MAXPARTITIONS;
-+ }
- }
- #endif
- }
-+#ifdef CONFIG_BSD_DISKLABEL
-+ if (bsd_kdev) {
-+ printk(" <");
-+ bsd_disklabel_partition(hd, bsd_kdev, bsd_maxpart);
-+ printk(" >");
-+ }
-+#endif
- /*
- * Check for old-style Disk Manager partition table
- */
-diff -ur linux.orig/include/linux/genhd.h linux/include/linux/genhd.h
---- linux.orig/include/linux/genhd.h Wed Mar 18 20:25:30 1998
-+++ linux/include/linux/genhd.h Thu Sep 24 18:55:43 1998
-@@ -69,12 +70,19 @@
- #ifdef CONFIG_BSD_DISKLABEL
- /*
- * BSD disklabel support by Yossi Gottlieb <yogo@math.tau.ac.il>
-+ *
-+ * updated by Marc Espie <Marc.Espie@openbsd.org>
- */
-
-+/* check against BSD src/sys/sys/disklabel.h for consistency */
-+
- #define BSD_PARTITION 0xa5 /* Partition ID */
-+#define OPENBSD_PARTITION 0xa6
-
- #define BSD_DISKMAGIC (0x82564557UL) /* The disk magic number */
- #define BSD_MAXPARTITIONS 8
-+#define OPENBSD_MAXPARTITIONS 16
-+
- #define BSD_FS_UNUSED 0 /* disklabel unused partition entry ID */
- struct bsd_disklabel {
- __u32 d_magic; /* the magic number */
-----------------------------------------------------------------------
-It does:
-- trigger the recognition of OpenBSD disklabels,
-- force bsd partitions to appear at the end of the partition list,
-- check the bsd disklabel for redundancy and consistency with the dos
-partition table, so that the same partition does not show up twice.
-
-You also need a working ufs, such as
-<ftp://sunsite.unc.edu/pub/Linux/ALPHA/ufs/u2fs-0.4.3.tar.gz>
-This package yields a new module, plus a small patch to tie the module
-with the rest of the Linux kernel. I would recommend checking that patch
-manually, as Linux module information tends to vary widely, and it is
-pretty trivial to add by hand anyway.
+As of pre4-2.2.0, the up-coming 2.2 linux kernel does incorporate my
+patch to handle OpenBSD partitions, and remove duplicate partitions that
+are referenced in both the disklabel for OpenBSD, and the MBR.
+
+You also need a working ufs, which is also going to be in linux 2.2.
Running Linux binaries under OpenBSD
------------------------------------