Partitions>8: Increase the number of supported partitions from 8 to 16.
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 4 Mar 2004 01:38:01 +0000 (01:38 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 4 Mar 2004 01:38:01 +0000 (01:38 +0000)
Decrease the number of supported slices from 32 to 16.  Note that the
5.x boot2 code, which we adopted, was being installed just after the old
disklabel.  This commit moves the boot code install to the next logical
sector (aka 4.x) in order to accomodate the larger label.

Fix newfs to not hardcode 'h' as the last partition.

Also modify 'disklabel' to not complain about preexisting garbage past
partition #8, and to detect and refuse to overwrite the old bootcode
with the new larger label until after you have installed new boot code.

sbin/disklabel/disklabel.c
sys/amd64/include/bootinfo.h
sys/i386/include/bootinfo.h
sys/platform/pc32/include/bootinfo.h
sys/sys/disklabel.h
sys/sys/disklabel32.h
sys/sys/diskslice.h
sys/sys/odisklabel.h

index 975cfa4..089b4c2 100644 (file)
@@ -37,7 +37,7 @@
  * @(#)disklabel.c     1.2 (Symmetric) 11/28/85
  * @(#)disklabel.c      8.2 (Berkeley) 1/7/94
  * $FreeBSD: src/sbin/disklabel/disklabel.c,v 1.28.2.15 2003/01/24 16:18:16 des Exp $
- * $DragonFly: src/sbin/disklabel/disklabel.c,v 1.4 2003/11/10 06:14:44 dillon Exp $
+ * $DragonFly: src/sbin/disklabel/disklabel.c,v 1.5 2004/03/04 01:38:01 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -107,6 +107,7 @@ int checklabel(struct disklabel *);
 void   setbootflag(struct disklabel *);
 void   Warning(const char *, ...) __printflike(1, 2);
 void   usage(void);
+int    checkoldboot(int f, const char *bootbuf);
 struct disklabel *getvirginlabel(void);
 
 #define        DEFEDITOR       _PATH_VI
@@ -272,6 +273,8 @@ main(int argc, char *argv[])
                lp = readlabel(f);
                display(stdout, lp);
                error = checklabel(lp);
+               if (checkoldboot(f, NULL))
+                       warnx("Warning, old bootblocks detected, install new bootblocks & reinstall the disklabel");
                break;
 
        case RESTORE:
@@ -407,6 +410,9 @@ writelabel(int f, const char *boot, struct disklabel *lp)
                display(stdout, lp);
                return (0);
        } else {
+               /* make sure we are not overwriting our boot code */
+               if (checkoldboot(f, boot))
+                       errx(4, "Will not overwrite old bootblocks w/ label, install new boot blocks first!");
                setbootflag(lp);
                lp->d_magic = DISKMAGIC;
                lp->d_magic2 = DISKMAGIC;
@@ -1541,7 +1547,7 @@ checklabel(struct disklabel *lp)
                        }
                }
        }
-       for (; i < MAXPARTITIONS; i++) {
+       for (; i < 8 || i < lp->d_npartitions; i++) {
                part = 'a' + i;
                pp = &lp->d_partitions[i];
                if (pp->p_size || pp->p_offset)
@@ -1649,6 +1655,30 @@ Warning(const char *fmt, ...)
        va_end(ap);
 }
 
+/*
+ * Check to see if the bootblocks are in the wrong place.  FBsd5 bootblocks
+ * and earlier DFly bb's are packed against the old disklabel and a new
+ * disklabel would blow them up.  This is a hack that should be removed
+ * in 2006 sometime (if ever).
+ */
+
+int
+checkoldboot(int f, const char *bootbuf)
+{
+       char buf[BBSIZE];
+
+       if (bootbuf && strncmp(bootbuf + 0x402, "BTX", 3) == 0)
+               return(0);
+       lseek(f, (off_t)0, SEEK_SET);
+       if (read(f, buf, sizeof(buf)) != sizeof(buf))
+               return(0);
+       if (strncmp(buf + 0x402, "BTX", 3) == 0)  /* new location */
+               return(0);
+       if (strncmp(buf + 0x316, "BTX", 3) == 0)  /* old location */
+               return(1);
+       return(0);
+}
+
 void
 usage(void)
 {
index 75c3dcb..d46ba38 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/include/bootinfo.h,v 1.14 1999/12/29 04:32:57 peter Exp $
- * $DragonFly: src/sys/amd64/include/Attic/bootinfo.h,v 1.1 2004/02/02 08:05:52 dillon Exp $
+ * $DragonFly: src/sys/amd64/include/Attic/bootinfo.h,v 1.2 2004/03/04 01:37:49 dillon Exp $
  */
 
 #ifndef        _MACHINE_BOOTINFO_H_
@@ -113,7 +113,7 @@ extern struct bootinfo      bootinfo;
 
 #define        BASE_SLICE              2
 #define        COMPATIBILITY_SLICE     0
-#define        MAX_SLICES              32
+#define        MAX_SLICES              16
 #define        WHOLE_DISK_SLICE        1
 
 #endif /* !_MACHINE_BOOTINFO_H_ */
index c1d5b33..6309abd 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/include/bootinfo.h,v 1.14 1999/12/29 04:32:57 peter Exp $
- * $DragonFly: src/sys/i386/include/Attic/bootinfo.h,v 1.3 2003/11/10 06:12:12 dillon Exp $
+ * $DragonFly: src/sys/i386/include/Attic/bootinfo.h,v 1.4 2004/03/04 01:37:53 dillon Exp $
  */
 
 #ifndef        _MACHINE_BOOTINFO_H_
@@ -113,7 +113,7 @@ extern struct bootinfo      bootinfo;
 
 #define        BASE_SLICE              2
 #define        COMPATIBILITY_SLICE     0
-#define        MAX_SLICES              32
+#define        MAX_SLICES              16
 #define        WHOLE_DISK_SLICE        1
 
 #endif /* !_MACHINE_BOOTINFO_H_ */
index 5309079..b1bd18e 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/include/bootinfo.h,v 1.14 1999/12/29 04:32:57 peter Exp $
- * $DragonFly: src/sys/platform/pc32/include/bootinfo.h,v 1.3 2003/11/10 06:12:12 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/include/bootinfo.h,v 1.4 2004/03/04 01:37:53 dillon Exp $
  */
 
 #ifndef        _MACHINE_BOOTINFO_H_
@@ -113,7 +113,7 @@ extern struct bootinfo      bootinfo;
 
 #define        BASE_SLICE              2
 #define        COMPATIBILITY_SLICE     0
-#define        MAX_SLICES              32
+#define        MAX_SLICES              16
 #define        WHOLE_DISK_SLICE        1
 
 #endif /* !_MACHINE_BOOTINFO_H_ */
index 9a08a96..f223e13 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)disklabel.h 8.2 (Berkeley) 7/10/94
  * $FreeBSD: src/sys/sys/disklabel.h,v 1.49.2.7 2001/05/27 05:58:26 jkh Exp $
- * $DragonFly: src/sys/sys/disklabel.h,v 1.4 2003/11/10 06:12:17 dillon Exp $
+ * $DragonFly: src/sys/sys/disklabel.h,v 1.5 2004/03/04 01:37:57 dillon Exp $
  */
 
 #ifndef _SYS_DISKLABEL_H_
@@ -77,7 +77,7 @@
 
 #define DISKMAGIC      ((u_int32_t)0x82564557) /* The disk magic number */
 #ifndef MAXPARTITIONS
-#define        MAXPARTITIONS   8
+#define        MAXPARTITIONS   16
 #endif
 
 #define        LABEL_PART      2               /* partition containing label */
@@ -374,7 +374,7 @@ struct partinfo {
     _________________________________________________________________
     | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
     -----------------------------------------------------------------
-    |    TYPE     |UNIT_2 | SLICE   |  MAJOR?       |  UNIT   |PART |
+    |    TYPE     |UNIT_2 |P| SLICE |  MAJOR?       |  UNIT   |PART |
     -----------------------------------------------------------------
 */
 
@@ -382,21 +382,33 @@ struct partinfo {
 
 #define        dkmakeminor(unit, slice, part) \
                                (((slice) << 16) | (((unit) & 0x1e0) << 16) | \
-                               (((unit) & 0x1f) << 3) | (part))
+                               (((unit) & 0x1f) << 3) | (part & 7) | \
+                               ((part & 0x08) << 17))
 static __inline dev_t
 dkmodpart(dev_t dev, int part)
 {
-       return (makedev(major(dev), (minor(dev) & ~7) | part));
+       int val;
+
+       if (part < 8)
+               val = (part & 7);
+       else
+               val = (part & 7) | 0x100000;
+       return (makedev(major(dev), (minor(dev) & ~0x100007) | val));
 }
 
 static __inline dev_t
 dkmodslice(dev_t dev, int slice)
 {
-       return (makedev(major(dev), (minor(dev) & ~0x1f0000) | (slice << 16)));
+       return (makedev(major(dev), (minor(dev) & ~0x0f0000) | (slice << 16)));
+}
+
+static __inline int
+dkpart(dev_t dev)
+{
+       return (((minor(dev) >> 17) & 0x08) | (minor(dev) & 7));
 }
 
-#define        dkpart(dev)             (minor(dev) & 7)
-#define        dkslice(dev)            ((minor(dev) >> 16) & 0x1f)
+#define        dkslice(dev)            ((minor(dev) >> 16) & 0x0f)
 #define        dktype(dev)             ((minor(dev) >> 25) & 0x7f)
 
 static __inline u_int
index da6127b..5f3d8e6 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)disklabel.h 8.2 (Berkeley) 7/10/94
  * $FreeBSD: src/sys/sys/disklabel.h,v 1.49.2.7 2001/05/27 05:58:26 jkh Exp $
- * $DragonFly: src/sys/sys/disklabel32.h,v 1.4 2003/11/10 06:12:17 dillon Exp $
+ * $DragonFly: src/sys/sys/disklabel32.h,v 1.5 2004/03/04 01:37:57 dillon Exp $
  */
 
 #ifndef _SYS_DISKLABEL_H_
@@ -77,7 +77,7 @@
 
 #define DISKMAGIC      ((u_int32_t)0x82564557) /* The disk magic number */
 #ifndef MAXPARTITIONS
-#define        MAXPARTITIONS   8
+#define        MAXPARTITIONS   16
 #endif
 
 #define        LABEL_PART      2               /* partition containing label */
@@ -374,7 +374,7 @@ struct partinfo {
     _________________________________________________________________
     | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
     -----------------------------------------------------------------
-    |    TYPE     |UNIT_2 | SLICE   |  MAJOR?       |  UNIT   |PART |
+    |    TYPE     |UNIT_2 |P| SLICE |  MAJOR?       |  UNIT   |PART |
     -----------------------------------------------------------------
 */
 
@@ -382,21 +382,33 @@ struct partinfo {
 
 #define        dkmakeminor(unit, slice, part) \
                                (((slice) << 16) | (((unit) & 0x1e0) << 16) | \
-                               (((unit) & 0x1f) << 3) | (part))
+                               (((unit) & 0x1f) << 3) | (part & 7) | \
+                               ((part & 0x08) << 17))
 static __inline dev_t
 dkmodpart(dev_t dev, int part)
 {
-       return (makedev(major(dev), (minor(dev) & ~7) | part));
+       int val;
+
+       if (part < 8)
+               val = (part & 7);
+       else
+               val = (part & 7) | 0x100000;
+       return (makedev(major(dev), (minor(dev) & ~0x100007) | val));
 }
 
 static __inline dev_t
 dkmodslice(dev_t dev, int slice)
 {
-       return (makedev(major(dev), (minor(dev) & ~0x1f0000) | (slice << 16)));
+       return (makedev(major(dev), (minor(dev) & ~0x0f0000) | (slice << 16)));
+}
+
+static __inline int
+dkpart(dev_t dev)
+{
+       return (((minor(dev) >> 17) & 0x08) | (minor(dev) & 7));
 }
 
-#define        dkpart(dev)             (minor(dev) & 7)
-#define        dkslice(dev)            ((minor(dev) >> 16) & 0x1f)
+#define        dkslice(dev)            ((minor(dev) >> 16) & 0x0f)
 #define        dktype(dev)             ((minor(dev) >> 25) & 0x7f)
 
 static __inline u_int
index ba26fde..c4b21af 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/sys/diskslice.h,v 1.36.2.1 2001/01/29 01:50:50 ken Exp $
- * $DragonFly: src/sys/sys/diskslice.h,v 1.3 2003/08/20 07:31:21 rob Exp $
+ * $DragonFly: src/sys/sys/diskslice.h,v 1.4 2004/03/04 01:37:57 dillon Exp $
  */
 
 #ifndef        _SYS_DISKSLICE_H_
@@ -39,7 +39,7 @@
 #define        COMPATIBILITY_SLICE     0
 #define        DIOCGSLICEINFO          _IOR('d', 111, struct diskslices)
 #define        DIOCSYNCSLICEINFO       _IOW('d', 112, int)
-#define        MAX_SLICES              32
+#define        MAX_SLICES              16
 #define        WHOLE_DISK_SLICE        1
 
 struct diskslice {
@@ -53,11 +53,11 @@ struct      diskslice {
        struct disklabel *ds_label;     /* BSD label, if any */
        void    *ds_dev;                /* devfs token for raw whole slice */
 #ifdef MAXPARTITIONS                   /* XXX don't depend on disklabel.h */
-#if MAXPARTITIONS !=                 /* but check consistency if possible */
+#if MAXPARTITIONS !=   16              /* but check consistency if possible */
 #error "inconsistent MAXPARTITIONS"
 #endif
 #else
-#define        MAXPARTITIONS   8
+#define        MAXPARTITIONS   16
 #endif
        void    *ds_devs[MAXPARTITIONS];        /* XXX s.b. in label */
        u_char  ds_openmask;            /* devs open */
index 58bc5e0..2c43559 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)disklabel.h 8.2 (Berkeley) 7/10/94
  * $FreeBSD: src/sys/sys/disklabel.h,v 1.49.2.7 2001/05/27 05:58:26 jkh Exp $
- * $DragonFly: src/sys/sys/Attic/odisklabel.h,v 1.4 2003/11/10 06:12:17 dillon Exp $
+ * $DragonFly: src/sys/sys/Attic/odisklabel.h,v 1.5 2004/03/04 01:37:57 dillon Exp $
  */
 
 #ifndef _SYS_DISKLABEL_H_
@@ -77,7 +77,7 @@
 
 #define DISKMAGIC      ((u_int32_t)0x82564557) /* The disk magic number */
 #ifndef MAXPARTITIONS
-#define        MAXPARTITIONS   8
+#define        MAXPARTITIONS   16
 #endif
 
 #define        LABEL_PART      2               /* partition containing label */
@@ -374,7 +374,7 @@ struct partinfo {
     _________________________________________________________________
     | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
     -----------------------------------------------------------------
-    |    TYPE     |UNIT_2 | SLICE   |  MAJOR?       |  UNIT   |PART |
+    |    TYPE     |UNIT_2 |P| SLICE |  MAJOR?       |  UNIT   |PART |
     -----------------------------------------------------------------
 */
 
@@ -382,21 +382,33 @@ struct partinfo {
 
 #define        dkmakeminor(unit, slice, part) \
                                (((slice) << 16) | (((unit) & 0x1e0) << 16) | \
-                               (((unit) & 0x1f) << 3) | (part))
+                               (((unit) & 0x1f) << 3) | (part & 7) | \
+                               ((part & 0x08) << 17))
 static __inline dev_t
 dkmodpart(dev_t dev, int part)
 {
-       return (makedev(major(dev), (minor(dev) & ~7) | part));
+       int val;
+
+       if (part < 8)
+               val = (part & 7);
+       else
+               val = (part & 7) | 0x100000;
+       return (makedev(major(dev), (minor(dev) & ~0x100007) | val));
 }
 
 static __inline dev_t
 dkmodslice(dev_t dev, int slice)
 {
-       return (makedev(major(dev), (minor(dev) & ~0x1f0000) | (slice << 16)));
+       return (makedev(major(dev), (minor(dev) & ~0x0f0000) | (slice << 16)));
+}
+
+static __inline int
+dkpart(dev_t dev)
+{
+       return (((minor(dev) >> 17) & 0x08) | (minor(dev) & 7));
 }
 
-#define        dkpart(dev)             (minor(dev) & 7)
-#define        dkslice(dev)            ((minor(dev) >> 16) & 0x1f)
+#define        dkslice(dev)            ((minor(dev) >> 16) & 0x0f)
 #define        dktype(dev)             ((minor(dev) >> 25) & 0x7f)
 
 static __inline u_int