summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2007-05-31 00:30:11 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2007-05-31 00:30:11 +0000
commit733854e02462c8df2618a5934e2a0fc24d12d2dd (patch)
treed33d8e4ad462a7024b2e4ca3fd4974f2cb1ca51d /sys
parent77c688ad9eefb3cd2cbe587fdd038dfc3fcc63fd (diff)
extend the sun disklabel format to contain filesystem types. also,
store the information fsck needs. this allows us to create raid partitions, nicely, of course. ok miod todd krw
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/sparc/sparc/disksubr.c20
-rw-r--r--sys/arch/sparc64/sparc64/disksubr.c20
-rw-r--r--sys/dev/sun/disklabel.h54
3 files changed, 49 insertions, 45 deletions
diff --git a/sys/arch/sparc/sparc/disksubr.c b/sys/arch/sparc/sparc/disksubr.c
index c8394812869..1af6c1b0340 100644
--- a/sys/arch/sparc/sparc/disksubr.c
+++ b/sys/arch/sparc/sparc/disksubr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: disksubr.c,v 1.44 2007/05/29 06:28:15 otto Exp $ */
+/* $OpenBSD: disksubr.c,v 1.45 2007/05/31 00:30:08 deraadt Exp $ */
/* $NetBSD: disksubr.c,v 1.16 1996/04/28 20:25:59 thorpej Exp $ */
/*
@@ -424,6 +424,7 @@ disklabel_sun_to_bsd(cp, lp)
secpercyl = sl->sl_nsectors * sl->sl_ntracks;
lp->d_secpercyl = secpercyl;
lp->d_secperunit = secpercyl * sl->sl_ncylinders;
+ lp->d_version = 1; /* 48 bit addressing */
lp->d_sparespercyl = sl->sl_sparespercyl;
lp->d_acylinders = sl->sl_acylinders;
@@ -465,7 +466,7 @@ disklabel_sun_to_bsd(cp, lp)
}
/* Check to see if there's an "extended" partition table */
- if (sl->sl_xpmag == SL_XPMAG &&
+ if ((sl->sl_xpmag == SL_XPMAG || sl->sl_xpmag == SL_XPMAGTYP) &&
sun_extended_sum(sl) == sl->sl_xpsum) { /* ...yes! */
/*
* There is. Copy over the "extended" partitions.
@@ -487,6 +488,13 @@ disklabel_sun_to_bsd(cp, lp)
npp->p_cpg = 16;
}
}
+ if (sl->sl_xpmag == SL_XPMAGTYP)
+ for (i = 0; i < MAXPARTITIONS; i++) {
+ npp = &lp->d_partitions[i];
+ npp->p_fstype = sl->sl_types[i];
+ npp->p_fragblock = sl->sl_fragblock[i];
+ npp->p_cpg = sl->sl_cpg[i];
+ }
}
lp->d_checksum = 0;
@@ -554,7 +562,7 @@ disklabel_bsd_to_sun(lp, cp)
}
/* We do need to load the extended table? */
if (i < SUNXPART) {
- sl->sl_xpmag = SL_XPMAG;
+ sl->sl_xpmag = SL_XPMAGTYP;
for (i = 0; i < SUNXPART; i++) {
spp = &sl->sl_xpart[i];
npp = &lp->d_partitions[i+8];
@@ -564,6 +572,12 @@ disklabel_bsd_to_sun(lp, cp)
npp->p_offset / secpercyl;
sl->sl_xpart[i].sdkp_nsectors = npp->p_size;
}
+ for (i = 0; i < MAXPARTITIONS; i++) {
+ npp = &lp->d_partitions[i];
+ sl->sl_types[i] = npp->p_fstype;
+ sl->sl_fragblock[i] = npp->p_fragblock;
+ sl->sl_cpg[i] = npp->p_cpg;
+ }
sl->sl_xpsum = sun_extended_sum(sl);
} else {
sl->sl_xpmag = 0;
diff --git a/sys/arch/sparc64/sparc64/disksubr.c b/sys/arch/sparc64/sparc64/disksubr.c
index 58681d551d4..0be5c0a7429 100644
--- a/sys/arch/sparc64/sparc64/disksubr.c
+++ b/sys/arch/sparc64/sparc64/disksubr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: disksubr.c,v 1.23 2007/05/29 06:56:30 deraadt Exp $ */
+/* $OpenBSD: disksubr.c,v 1.24 2007/05/31 00:30:10 deraadt Exp $ */
/* $NetBSD: disksubr.c,v 1.13 2000/12/17 22:39:18 pk Exp $ */
/*
@@ -421,6 +421,7 @@ disklabel_sun_to_bsd(cp, lp)
secpercyl = sl->sl_nsectors * sl->sl_ntracks;
lp->d_secpercyl = secpercyl;
lp->d_secperunit = secpercyl * sl->sl_ncylinders;
+ lp->d_version = 1; /* 48 bit addressing */
lp->d_sparespercyl = sl->sl_sparespercyl;
lp->d_acylinders = sl->sl_acylinders;
@@ -462,7 +463,7 @@ disklabel_sun_to_bsd(cp, lp)
}
/* Check to see if there's an "extended" partition table */
- if (sl->sl_xpmag == SL_XPMAG &&
+ if ((sl->sl_xpmag == SL_XPMAG || sl->sl_xpmag == SL_XPMAGTYP) &&
sun_extended_sum(sl) == sl->sl_xpsum) { /* ...yes! */
/*
* There is. Copy over the "extended" partitions.
@@ -484,6 +485,13 @@ disklabel_sun_to_bsd(cp, lp)
npp->p_cpg = 16;
}
}
+ if (sl->sl_xpmag == SL_XPMAGTYP)
+ for (i = 0; i < MAXPARTITIONS; i++) {
+ npp = &lp->d_partitions[i];
+ npp->p_fstype = sl->sl_types[i];
+ npp->p_fragblock = sl->sl_fragblock[i];
+ npp->p_cpg = sl->sl_cpg[i];
+ }
}
lp->d_checksum = 0;
@@ -551,7 +559,7 @@ disklabel_bsd_to_sun(lp, cp)
}
/* We do need to load the extended table? */
if (i < SUNXPART) {
- sl->sl_xpmag = SL_XPMAG;
+ sl->sl_xpmag = SL_XPMAGTYP;
for (i = 0; i < SUNXPART; i++) {
spp = &sl->sl_xpart[i];
npp = &lp->d_partitions[i+8];
@@ -561,6 +569,12 @@ disklabel_bsd_to_sun(lp, cp)
npp->p_offset / secpercyl;
sl->sl_xpart[i].sdkp_nsectors = npp->p_size;
}
+ for (i = 0; i < MAXPARTITIONS; i++) {
+ npp = &lp->d_partitions[i];
+ sl->sl_types[i] = npp->p_fstype;
+ sl->sl_fragblock[i] = npp->p_fragblock;
+ sl->sl_cpg[i] = npp->p_cpg;
+ }
sl->sl_xpsum = sun_extended_sum(sl);
} else {
sl->sl_xpmag = 0;
diff --git a/sys/dev/sun/disklabel.h b/sys/dev/sun/disklabel.h
index 1b5366ec9c7..79baa56a232 100644
--- a/sys/dev/sun/disklabel.h
+++ b/sys/dev/sun/disklabel.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: disklabel.h,v 1.3 2003/06/02 23:28:04 millert Exp $ */
+/* $OpenBSD: disklabel.h,v 1.4 2007/05/31 00:30:10 deraadt Exp $ */
/* $NetBSD: disklabel.h,v 1.2 1998/08/22 14:55:28 mrg Exp $ */
/*
@@ -47,51 +47,29 @@
#define SUN_DKMAGIC 55998
-/* These are the guys that Sun's dkinfo needs... */
-#define DKIOCGGEOM _IOR('d', 2, struct sun_dkgeom) /* geometry info */
-#define DKIOCINFO _IOR('d', 8, struct sun_dkctlr) /* controller info */
-#define DKIOCGPART _IOR('d', 4, struct sun_dkpart) /* partition info */
-
-/* geometry info */
-struct sun_dkgeom {
- u_short sdkc_ncylinders; /* data cylinders */
- u_short sdkc_acylinders; /* alternate cylinders */
- u_short sdkc_xxx1;
- u_short sdkc_ntracks; /* tracks per cylinder */
- u_short sdkc_xxx2;
- u_short sdkc_nsectors; /* sectors per track */
- u_short sdkc_interleave; /* interleave factor */
- u_short sdkc_xxx3;
- u_short sdkc_xxx4;
- u_short sdkc_sparespercyl; /* spare sectors per cylinder */
- u_short sdkc_rpm; /* rotational speed */
- u_short sdkc_pcylinders; /* physical cylinders */
- u_short sdkc_xxx5[7];
-};
-
-/* controller info */
-struct sun_dkctlr {
- int sdkc_addr; /* controller address */
- short sdkc_unit; /* unit (slave) address */
- short sdkc_type; /* controller type */
- short sdkc_flags; /* flags */
-};
-
/* partition info */
struct sun_dkpart {
int sdkp_cyloffset; /* starting cylinder */
int sdkp_nsectors; /* number of sectors */
};
-#define SUNXPART 8
-#define SL_XPMAG (0x199d1fe2+SUNXPART)
+#define SUNXPART 8
+#define SL_XPMAG (0x199d1fe2+SUNXPART)
+#define SL_XPMAGTYP (0x199d1fe2+SUNXPART+1) /* contains types */
struct sun_disklabel { /* total size = 512 bytes */
- char sl_text[128];
- u_int sl_xpsum; /* additive cksum, [xl_xpmag,sl_xx1) */
- u_int sl_xpmag; /* "extended" magic number */
+ char sl_text[128];
+ u_int sl_xpsum; /* additive cksum, [xl_xpmag,sl_xx1) */
+ u_int sl_xpmag; /* "extended" magic number */
struct sun_dkpart sl_xpart[SUNXPART]; /* "extended" partitions, i through p */
- char sl_xxx1[292-8-(8*SUNXPART)]; /* [292] include sl_x* */
+ u_char sl_types[MAXPARTITIONS];
+ u_int8_t sl_fragblock[MAXPARTITIONS];
+ u_int16_t sl_cpg[MAXPARTITIONS];
+ char sl_xxx1[292 - sizeof(u_int) - sizeof(u_int) -
+ (sizeof(struct sun_dkpart) * SUNXPART) -
+ sizeof(u_char) * MAXPARTITIONS -
+ sizeof(u_int8_t) * MAXPARTITIONS -
+ sizeof(u_int16_t) * MAXPARTITIONS];
u_short sl_rpm; /* rotational speed */
u_short sl_pcylinders; /* number of physical cyls */
#define sl_pcyl sl_pcylinders /* XXX: old sun3 */
@@ -107,5 +85,3 @@ struct sun_disklabel { /* total size = 512 bytes */
u_short sl_magic; /* == SUN_DKMAGIC */
u_short sl_cksum; /* xor checksum of all shorts */
};
-
-#define SUN_LABELOFFSET 128 /* XXX we don't use this */