diff options
author | Otto Moerbeek <otto@cvs.openbsd.org> | 2007-05-29 06:28:17 +0000 |
---|---|---|
committer | Otto Moerbeek <otto@cvs.openbsd.org> | 2007-05-29 06:28:17 +0000 |
commit | 444b0299644e2e692c1f8d00d8b1caa0acea33a3 (patch) | |
tree | 1b53b5865bcc8b3675238c2ebdd9daf6797ccd39 | |
parent | 3f6176ec485942a0e5cfcc7e61ca01950df6452c (diff) |
Updated disklabel format to support larger disks and partitions. We
free room in struct partition by packing fragment size and
fragments/block more tighlty and use the resulting space to make
offset and size 48 bits. For the disk part we use spare fields in
struct disklabel. Kernel converts in-mem copy of the on-disk
label if needed, disklabel(8) writes new version.
We are careful to only change fields not used by bootloaders.
Conception of basic scheme by deraadt.
ok deraadt@ krw@
33 files changed, 261 insertions, 150 deletions
diff --git a/lib/libc/gen/disklabel.c b/lib/libc/gen/disklabel.c index ad5148e0cde..a921b8e0bf0 100644 --- a/lib/libc/gen/disklabel.c +++ b/lib/libc/gen/disklabel.c @@ -116,16 +116,18 @@ getdiskbyname(const char *name) if (cgetnum(buf, psize, &f) == -1) pp->p_size = 0; else { + u_int32_t fsize, frag = 8; + pp->p_size = f; getnum(pp->p_offset, poffset); - getnumdflt(pp->p_fsize, pfsize, 0); - if (pp->p_fsize) { + getnumdflt(fsize, pfsize, 0); + if (fsize) { long bsize; if (cgetnum(buf, pbsize, &bsize) == 0) - pp->p_frag = bsize / pp->p_fsize; - else - pp->p_frag = 8; + frag = bsize / fsize; + pp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(fsize, frag); } getnumdflt(pp->p_fstype, ptype, 0); if (pp->p_fstype == 0 && cgetstr(buf, ptype, &cq) > 0) diff --git a/sbin/disklabel/disklabel.c b/sbin/disklabel/disklabel.c index 3a93a1abeef..837e9c9ae2b 100644 --- a/sbin/disklabel/disklabel.c +++ b/sbin/disklabel/disklabel.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disklabel.c,v 1.109 2007/05/24 13:01:23 krw Exp $ */ +/* $OpenBSD: disklabel.c,v 1.110 2007/05/29 06:28:15 otto Exp $ */ /* * Copyright (c) 1987, 1993 @@ -39,7 +39,7 @@ static const char copyright[] = #endif /* not lint */ #ifndef lint -static const char rcsid[] = "$OpenBSD: disklabel.c,v 1.109 2007/05/24 13:01:23 krw Exp $"; +static const char rcsid[] = "$OpenBSD: disklabel.c,v 1.110 2007/05/29 06:28:15 otto Exp $"; #endif /* not lint */ #include <sys/param.h> @@ -388,6 +388,31 @@ makelabel(char *type, char *name, struct disklabel *lp) (void)strncpy(lp->d_packname, name, sizeof(lp->d_packname)); } +/* + * Convert an old disklabel to a v1 disklabel + */ +void +cvtdisklabelv1(struct disklabel *lp) +{ + int i; + + if (lp->d_version == 1) + return; + + lp->d_version = 1; + lp->d_secperunith = 0; + for (i = 0; i < MAXPARTITIONS; i++) { + struct partition *pp = &lp->d_partitions[i]; + struct __partitionv0 *v0pp = (struct __partitionv0 *) + &lp->d_partitions[i]; + + pp->p_fragblock = DISKLABELV1_FFS_FRAGBLOCK(v0pp->p_fsize, + v0pp->p_frag); + pp->p_offseth = 0; + pp->p_sizeh = 0; + } +} + int writelabel(int f, char *boot, struct disklabel *lp) { @@ -409,6 +434,7 @@ writelabel(int f, char *boot, struct disklabel *lp) lp->d_magic = DISKMAGIC; lp->d_magic2 = DISKMAGIC; lp->d_checksum = 0; + cvtdisklabelv1(lp); lp->d_checksum = dkcksum(lp); if (rflag) { #ifdef DOSLABEL @@ -930,8 +956,9 @@ makedisktab(FILE *f, struct disklabel *lp) case FS_BSDFFS: (void)fprintf(f, "b%c#%u:", c, - pp->p_fsize * pp->p_frag); - (void)fprintf(f, "f%c#%u:", c, pp->p_fsize); + DISKLABELV1_FFS_BSIZE(pp->p_fragblock)); + (void)fprintf(f, "f%c#%u:", c, + DISKLABELV1_FFS_FSIZE(pp->p_fragblock)); break; default: @@ -979,6 +1006,8 @@ display_partition(FILE *f, struct disklabel *lp, char **mp, int i, p_size = scale(pp->p_size, unit, lp); p_offset = scale(pp->p_offset, unit, lp); if (pp->p_size) { + u_int32_t frag = DISKLABELV1_FFS_FRAG(pp->p_fragblock); + u_int32_t fsize = DISKLABELV1_FFS_FSIZE(pp->p_fragblock); if (p_size < 0) fprintf(f, " %c: %13u %13u ", 'a' + i, pp->p_size, pp->p_offset); @@ -994,12 +1023,12 @@ display_partition(FILE *f, struct disklabel *lp, char **mp, int i, case FS_UNUSED: /* XXX */ fprintf(f, " %5u %5u %4.4s ", - pp->p_fsize, pp->p_fsize * pp->p_frag, ""); + fsize, fsize * frag, ""); break; case FS_BSDFFS: fprintf(f, " %5u %5u %4hu ", - pp->p_fsize, pp->p_fsize * pp->p_frag, + fsize, fsize * frag, pp->p_cpg); break; @@ -1274,7 +1303,7 @@ getasciilabel(FILE *f, struct disklabel *lp) struct partition *pp; char *tp, *s, line[BUFSIZ]; int lineno = 0, errors = 0; - u_int32_t v; + u_int32_t v, fsize; lp->d_bbsize = BBSIZE; /* XXX */ lp->d_sbsize = SBSIZE; /* XXX */ @@ -1527,19 +1556,21 @@ getasciilabel(FILE *f, struct disklabel *lp) case FS_UNUSED: /* XXX */ if (tp == NULL) /* ok to skip fsize/bsize */ break; - NXTNUM(pp->p_fsize, pp->p_fsize, &errstr); - if (pp->p_fsize == 0) + NXTNUM(fsize, fsize, &errstr); + if (fsize == 0) break; NXTNUM(v, v, &errstr); - pp->p_frag = v / pp->p_fsize; + pp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(fsize, v / fsize); break; case FS_BSDFFS: - NXTNUM(pp->p_fsize, pp->p_fsize, &errstr); - if (pp->p_fsize == 0) + NXTNUM(fsize, fsize, &errstr); + if (fsize == 0) break; NXTNUM(v, v, &errstr); - pp->p_frag = v / pp->p_fsize; + pp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(fsize, v / fsize); NXTNUM(pp->p_cpg, pp->p_cpg, &errstr); break; @@ -1642,10 +1673,12 @@ checklabel(struct disklabel *lp) part); errors++; } +#if 0 if (pp->p_frag == 0 && pp->p_fsize != 0) { warnx("partition %c: block size < fragment size", part); errors++; } +#endif } for (; i < MAXPARTITIONS; i++) { part = 'a' + i; diff --git a/sbin/disklabel/editor.c b/sbin/disklabel/editor.c index 2366dbf29d3..d7e54e2f867 100644 --- a/sbin/disklabel/editor.c +++ b/sbin/disklabel/editor.c @@ -1,4 +1,4 @@ -/* $OpenBSD: editor.c,v 1.112 2007/04/29 18:31:35 otto Exp $ */ +/* $OpenBSD: editor.c,v 1.113 2007/05/29 06:28:15 otto Exp $ */ /* * Copyright (c) 1997-2000 Todd C. Miller <Todd.Miller@courtesan.com> @@ -17,7 +17,7 @@ */ #ifndef lint -static char rcsid[] = "$OpenBSD: editor.c,v 1.112 2007/04/29 18:31:35 otto Exp $"; +static char rcsid[] = "$OpenBSD: editor.c,v 1.113 2007/05/29 06:28:15 otto Exp $"; #endif /* not lint */ #include <sys/types.h> @@ -147,7 +147,7 @@ editor(struct disklabel *lp, int f, char *dev, char *fstabfile) pp->p_offset = 0; pp->p_size = label.d_secperunit; pp->p_fstype = FS_UNUSED; - pp->p_fsize = pp->p_frag = pp->p_cpg = 0; + pp->p_fragblock = pp->p_cpg = 0; } #ifdef CYLCHECK @@ -503,11 +503,11 @@ editor_add(struct disklabel *lp, char **mp, u_int32_t *freep, char *p) pp->p_fstype = partno == 1 ? FS_SWAP : FS_BSDFFS; #if defined (__sparc__) && !defined(__sparc64__) /* can't boot from > 8k boot blocks */ - pp->p_fsize = partno == 0 ? 1024 : 2048; + pp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(partno == 0 ? 1024 : 2048, 8); #else - pp->p_fsize = 2048; + pp->p_fragblock = DISKLABELV1_FFS_FRAGBLOCK(2048, 8); #endif - pp->p_frag = 8; pp->p_cpg = 16; old_offset = pp->p_offset; old_size = pp->p_size; @@ -2054,13 +2054,18 @@ get_size(struct disklabel *lp, int partno, u_int32_t *freep, int new) int get_fsize(struct disklabel *lp, int partno) { - u_int32_t ui; + u_int32_t ui, fsize, frag; struct partition *pp = &lp->d_partitions[partno]; + + fsize = DISKLABELV1_FFS_FSIZE(pp->p_fragblock); + frag = DISKLABELV1_FFS_FRAG(pp->p_fragblock); + if (fsize == 0) + frag = 8; for (;;) { ui = getuint(lp, partno, "fragment size", "Size of fs block fragments. Usually 2048 or 512.", - pp->p_fsize, pp->p_fsize, 0, 0); + fsize, fsize, 0, 0); if (ui == UINT_MAX - 1) { fputs("Command aborted\n", stderr); return(1); @@ -2071,26 +2076,28 @@ get_fsize(struct disklabel *lp, int partno) } if (ui == 0) puts("Zero fragment size implies zero block size"); - pp->p_fsize = ui; + pp->p_fragblock = DISKLABELV1_FFS_FRAGBLOCK(ui, frag); return(0); } int get_bsize(struct disklabel *lp, int partno) { - u_int32_t ui; + u_int32_t ui, bsize, frag, fsize; struct partition *pp = &lp->d_partitions[partno]; /* Avoid dividing by zero... */ - if (pp->p_fsize == 0) { - pp->p_frag = 0; + if (pp->p_fragblock == 0) return(1); - } + + bsize = DISKLABELV1_FFS_BSIZE(pp->p_fragblock); + fsize = DISKLABELV1_FFS_FSIZE(pp->p_fragblock); + frag = DISKLABELV1_FFS_FRAG(pp->p_fragblock); for (;;) { ui = getuint(lp, partno, "block size", "Size of filesystem blocks. Usually 16384 or 4096.", - pp->p_fsize * pp->p_frag, pp->p_fsize * pp->p_frag, + fsize * frag, fsize * frag, 0, 0); /* sanity checks */ @@ -2103,16 +2110,16 @@ get_bsize(struct disklabel *lp, int partno) fprintf(stderr, "Error: block size must be at least as big " "as page size (%d).\n", getpagesize()); - else if (ui % pp->p_fsize != 0) + else if (ui % fsize != 0) fputs("Error: block size must be a multiple of the " "fragment size.\n", stderr); - else if (ui / pp->p_fsize < 1) + else if (ui / fsize < 1) fputs("Error: block size must be at least as big as " "fragment size.\n", stderr); else break; } - pp->p_frag = ui / pp->p_fsize; + pp->p_fragblock = DISKLABELV1_FFS_FRAGBLOCK(ui / frag, frag); return(0); } diff --git a/sbin/fsck_ext2fs/setup.c b/sbin/fsck_ext2fs/setup.c index 7a3767982bf..e4c1637be70 100644 --- a/sbin/fsck_ext2fs/setup.c +++ b/sbin/fsck_ext2fs/setup.c @@ -1,4 +1,4 @@ -/* $OpenBSD: setup.c,v 1.13 2005/04/30 13:56:16 niallo Exp $ */ +/* $OpenBSD: setup.c,v 1.14 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: setup.c,v 1.1 1997/06/11 11:22:01 bouyer Exp $ */ /* @@ -441,8 +441,8 @@ calcsb(char *dev, int devfd, struct m_ext2fs *fs) return (0); } memset(fs, 0, sizeof(struct m_ext2fs)); - fs->e2fs_bsize = pp->p_fsize; - fs->e2fs.e2fs_log_bsize = pp->p_fsize / 1024; + fs->e2fs_bsize = DISKLABELV1_FFS_FSIZE(pp->p_fragblock); /* XXX */ + fs->e2fs.e2fs_log_bsize = fs->e2fs_bsize / 1024; fs->e2fs.e2fs_bcount = (pp->p_size * DEV_BSIZE) / fs->e2fs_bsize; fs->e2fs.e2fs_first_dblock = (fs->e2fs.e2fs_log_bsize == 0) ? 1 : 0; fs->e2fs.e2fs_bpg = fs->e2fs_bsize * NBBY; diff --git a/sbin/fsck_ffs/setup.c b/sbin/fsck_ffs/setup.c index ada879b2f3b..3c007e05a5a 100644 --- a/sbin/fsck_ffs/setup.c +++ b/sbin/fsck_ffs/setup.c @@ -1,4 +1,4 @@ -/* $OpenBSD: setup.c,v 1.34 2007/04/18 20:49:46 otto Exp $ */ +/* $OpenBSD: setup.c,v 1.35 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: setup.c,v 1.27 1996/09/27 22:45:19 christos Exp $ */ /* @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)setup.c 8.5 (Berkeley) 11/23/94"; #else -static const char rcsid[] = "$OpenBSD: setup.c,v 1.34 2007/04/18 20:49:46 otto Exp $"; +static const char rcsid[] = "$OpenBSD: setup.c,v 1.35 2007/05/29 06:28:15 otto Exp $"; #endif #endif /* not lint */ @@ -638,8 +638,8 @@ calcsb(char *dev, int devfd, struct fs *fs) return (0); } memset(fs, 0, sizeof(struct fs)); - fs->fs_fsize = pp->p_fsize; - fs->fs_frag = pp->p_frag; + fs->fs_fsize = DISKLABELV1_FFS_FSIZE(pp->p_fragblock); + fs->fs_frag = DISKLABELV1_FFS_FRAG(pp->p_fragblock); fs->fs_bsize = fs->fs_fsize * fs->fs_frag; fs->fs_cpg = pp->p_cpg; fs->fs_nspf = fs->fs_fsize / lp->d_secsize; diff --git a/sbin/growfs/growfs.c b/sbin/growfs/growfs.c index 1d7ec8b243a..83b6668edc9 100644 --- a/sbin/growfs/growfs.c +++ b/sbin/growfs/growfs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: growfs.c,v 1.18 2007/04/23 10:18:30 pedro Exp $ */ +/* $OpenBSD: growfs.c,v 1.19 2007/05/29 06:28:16 otto Exp $ */ /* * Copyright (c) 2000 Christoph Herrmann, Thomas-Henning von Kamptz * Copyright (c) 1980, 1989, 1993 The Regents of the University of California. @@ -46,7 +46,7 @@ static const char copyright[] = Copyright (c) 1980, 1989, 1993 The Regents of the University of California.\n\ All rights reserved.\n"; -static const char rcsid[] = "$OpenBSD: growfs.c,v 1.18 2007/04/23 10:18:30 pedro Exp $"; +static const char rcsid[] = "$OpenBSD: growfs.c,v 1.19 2007/05/29 06:28:16 otto Exp $"; #endif /* not lint */ /* ********************************************************** INCLUDES ***** */ @@ -2093,8 +2093,8 @@ main(int argc, char **argv) /* * Update the disk label. */ - pp->p_fsize = sblock.fs_fsize; - pp->p_frag = sblock.fs_frag; + pp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(sblock.fs_fsize, sblock.fs_frag); pp->p_cpg = sblock.fs_cpg; return_disklabel(fso, lp, Nflag); diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c index 317260128a0..3b2cc58df5f 100644 --- a/sbin/newfs/mkfs.c +++ b/sbin/newfs/mkfs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mkfs.c,v 1.63 2007/05/19 20:12:50 otto Exp $ */ +/* $OpenBSD: mkfs.c,v 1.64 2007/05/29 06:28:16 otto Exp $ */ /* $NetBSD: mkfs.c,v 1.25 1995/06/18 21:35:38 cgd Exp $ */ /* @@ -593,8 +593,8 @@ mkfs(struct partition *pp, char *fsys, int fi, int fo, mode_t mfsmode, * be updated on disk. */ pp->p_fstype = FS_BSDFFS; - pp->p_fsize = sblock.fs_fsize; - pp->p_frag = sblock.fs_frag; + pp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(sblock.fs_fsize, sblock.fs_frag); pp->p_cpg = sblock.fs_cpg; } diff --git a/sbin/newfs/newfs.c b/sbin/newfs/newfs.c index c307fb47377..98541cf8957 100644 --- a/sbin/newfs/newfs.c +++ b/sbin/newfs/newfs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: newfs.c,v 1.64 2007/05/20 11:28:06 millert Exp $ */ +/* $OpenBSD: newfs.c,v 1.65 2007/05/29 06:28:16 otto Exp $ */ /* $NetBSD: newfs.c,v 1.20 1996/05/16 07:13:03 thorpej Exp $ */ /* @@ -168,7 +168,7 @@ main(int argc, char *argv[]) mode_t mfsmode = 0; char *fstype = NULL; char **saveargv = argv; - int ffs = 1; + int ffsflag = 1; const char *errstr; if (strstr(__progname, "mfs")) @@ -272,7 +272,7 @@ main(int argc, char *argv[]) case 't': fstype = optarg; if (strcmp(fstype, "ffs")) - ffs = 0; + ffsflag = 0; break; #ifdef MFS case 'P': @@ -283,13 +283,13 @@ main(int argc, char *argv[]) default: usage(); } - if (!ffs) + if (!ffsflag) break; } argc -= optind; argv += optind; - if (ffs && argc - mfs != 1) + if (ffsflag && argc - mfs != 1) usage(); /* Increase our data size to the max */ @@ -335,8 +335,8 @@ main(int argc, char *argv[]) mfsfakelabel.d_interleave = 1; mfsfakelabel.d_npartitions = 1; mfsfakelabel.d_partitions[0].p_size = 16384; - mfsfakelabel.d_partitions[0].p_fsize = 1024; - mfsfakelabel.d_partitions[0].p_frag = 8; + mfsfakelabel.d_partitions[0].p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(1024, 8); mfsfakelabel.d_partitions[0].p_cpg = 16; lp = &mfsfakelabel; @@ -428,12 +428,12 @@ havelabel: fatal("%s: no default sector size", argv[0]); } if (fsize == 0) { - fsize = pp->p_fsize; + fsize = DISKLABELV1_FFS_FSIZE(pp->p_fragblock); if (fsize <= 0) fsize = MAX(DFL_FRAGSIZE, lp->d_secsize); } if (bsize == 0) { - bsize = pp->p_frag * pp->p_fsize; + bsize = DISKLABELV1_FFS_BSIZE(pp->p_fragblock); if (bsize <= 0) bsize = MIN(DFL_BLKSIZE, 8 * fsize); } diff --git a/sys/adosfs/advfsops.c b/sys/adosfs/advfsops.c index f26aadfbaf9..3653ccafc8d 100644 --- a/sys/adosfs/advfsops.c +++ b/sys/adosfs/advfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: advfsops.c,v 1.25 2003/08/14 07:46:39 mickey Exp $ */ +/* $OpenBSD: advfsops.c,v 1.26 2007/05/29 06:28:16 otto Exp $ */ /* $NetBSD: advfsops.c,v 1.24 1996/12/22 10:10:12 cgd Exp $ */ /* @@ -200,8 +200,8 @@ adosfs_mountfs(devvp, mp, p) amp->secsperblk = 1; } else { - amp->bsize = parp->p_fsize * parp->p_frag; - amp->secsperblk = parp->p_frag; + amp->bsize = DISKLABELV1_FFS_BSIZE(parp->fragblock); + amp->secsperblk = DISKLABELV1_FFS_FRAG(parp->p_fragblock); } amp->rootb = (parp->p_size / amp->secsperblk - 1 + parp->p_cpg) >> 1; amp->numblks = parp->p_size / amp->secsperblk - parp->p_cpg; diff --git a/sys/arch/alpha/alpha/disksubr.c b/sys/arch/alpha/alpha/disksubr.c index 141dd05afea..8fe69125170 100644 --- a/sys/arch/alpha/alpha/disksubr.c +++ b/sys/arch/alpha/alpha/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.68 2007/05/29 05:08:19 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.69 2007/05/29 06:28:14 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.21 1996/05/03 19:42:03 christos Exp $ */ /* @@ -194,6 +194,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -450,8 +451,7 @@ setdisklabel(olp, nlp, openmask, osdep) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/amd64/amd64/disksubr.c b/sys/arch/amd64/amd64/disksubr.c index d0395f77af6..a084c728ef7 100644 --- a/sys/arch/amd64/amd64/disksubr.c +++ b/sys/arch/amd64/amd64/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.32 2007/05/29 05:08:19 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.33 2007/05/29 06:28:14 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.21 1996/05/03 19:42:03 christos Exp $ */ /* @@ -316,6 +316,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -362,8 +363,7 @@ setdisklabel(struct disklabel *olp, struct disklabel *nlp, u_long openmask, */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/arm/arm/disksubr.c b/sys/arch/arm/arm/disksubr.c index 818d8e695c5..bf75cf30c28 100644 --- a/sys/arch/arm/arm/disksubr.c +++ b/sys/arch/arm/arm/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.27 2007/05/29 05:08:19 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.28 2007/05/29 06:28:14 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.21 1996/05/03 19:42:03 christos Exp $ */ /* @@ -292,6 +292,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -340,8 +341,7 @@ setdisklabel(olp, nlp, openmask, osdep) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/aviion/aviion/disksubr.c b/sys/arch/aviion/aviion/disksubr.c index 000ff6aa2c1..13cd52806e0 100644 --- a/sys/arch/aviion/aviion/disksubr.c +++ b/sys/arch/aviion/aviion/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.18 2007/05/29 05:08:19 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.19 2007/05/29 06:28:14 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.21 1996/05/03 19:42:03 christos Exp $ */ /* @@ -292,6 +292,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -340,8 +341,7 @@ setdisklabel(olp, nlp, openmask, osdep) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/hp300/hp300/disksubr.c b/sys/arch/hp300/hp300/disksubr.c index 025a2e5b57e..84e8442e8eb 100644 --- a/sys/arch/hp300/hp300/disksubr.c +++ b/sys/arch/hp300/hp300/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.24 2007/05/29 05:08:19 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.25 2007/05/29 06:28:14 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.9 1997/04/01 03:12:13 scottr Exp $ */ /* @@ -125,6 +125,7 @@ done: bp->b_flags = B_INVAL | B_AGE; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -158,8 +159,7 @@ setdisklabel(olp, nlp, openmask, osdep) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/hppa/hppa/disksubr.c b/sys/arch/hppa/hppa/disksubr.c index 313649991d2..7b7991dbe33 100644 --- a/sys/arch/hppa/hppa/disksubr.c +++ b/sys/arch/hppa/hppa/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.48 2007/05/29 05:08:19 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.49 2007/05/29 06:28:15 otto Exp $ */ /* * Copyright (c) 1999 Michael Shalayeff @@ -197,6 +197,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -615,8 +616,7 @@ setdisklabel(olp, nlp, openmask, osdep) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/hppa64/hppa64/disksubr.c b/sys/arch/hppa64/hppa64/disksubr.c index 60bba818722..678dfee3469 100644 --- a/sys/arch/hppa64/hppa64/disksubr.c +++ b/sys/arch/hppa64/hppa64/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.31 2007/05/29 05:08:19 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.32 2007/05/29 06:28:15 otto Exp $ */ /* * Copyright (c) 1999 Michael Shalayeff @@ -193,6 +193,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -611,8 +612,7 @@ setdisklabel(olp, nlp, openmask, osdep) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/i386/i386/disksubr.c b/sys/arch/i386/i386/disksubr.c index ec7e97d05a7..7cb6237ba9a 100644 --- a/sys/arch/i386/i386/disksubr.c +++ b/sys/arch/i386/i386/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.72 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.73 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.21 1996/05/03 19:42:03 christos Exp $ */ /* @@ -316,6 +316,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -362,8 +363,7 @@ setdisklabel(struct disklabel *olp, struct disklabel *nlp, u_long openmask, */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/landisk/landisk/disksubr.c b/sys/arch/landisk/landisk/disksubr.c index c176cae4e4a..2ccb0a91e9d 100644 --- a/sys/arch/landisk/landisk/disksubr.c +++ b/sys/arch/landisk/landisk/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.15 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.16 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.21 1996/05/03 19:42:03 christos Exp $ */ /* @@ -292,6 +292,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -340,8 +341,7 @@ setdisklabel(olp, nlp, openmask, osdep) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/luna88k/luna88k/disksubr.c b/sys/arch/luna88k/luna88k/disksubr.c index 9168329f120..1112ef4a592 100644 --- a/sys/arch/luna88k/luna88k/disksubr.c +++ b/sys/arch/luna88k/luna88k/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.11 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.12 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.12 2002/02/19 17:09:44 wiz Exp $ */ /* @@ -208,6 +208,7 @@ done: bp->b_flags = B_INVAL | B_AGE | B_READ; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -453,8 +454,8 @@ disklabel_om_to_bsd(cp, lp) * XXX: (Should remove that code from newfs...) */ if (npp->p_fstype == FS_BSDFFS) { - npp->p_fsize = 1024; - npp->p_frag = 8; + npp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(1024, 8); npp->p_cpg = 16; } } diff --git a/sys/arch/mac68k/mac68k/disksubr.c b/sys/arch/mac68k/mac68k/disksubr.c index 84ec4f989c3..ad775c8b45c 100644 --- a/sys/arch/mac68k/mac68k/disksubr.c +++ b/sys/arch/mac68k/mac68k/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.32 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.33 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.22 1997/11/26 04:18:20 briggs Exp $ */ /* @@ -436,6 +436,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -481,8 +482,7 @@ setdisklabel(olp, nlp, openmask, osdep) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/macppc/macppc/disksubr.c b/sys/arch/macppc/macppc/disksubr.c index 8b274d31fe2..34ee90539af 100644 --- a/sys/arch/macppc/macppc/disksubr.c +++ b/sys/arch/macppc/macppc/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.37 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.38 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.21 1996/05/03 19:42:03 christos Exp $ */ /* @@ -381,6 +381,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -427,8 +428,7 @@ setdisklabel(struct disklabel *olp, struct disklabel *nlp, u_long openmask, */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/mips64/mips64/disksubr.c b/sys/arch/mips64/mips64/disksubr.c index f48e84212a2..f191f688e19 100644 --- a/sys/arch/mips64/mips64/disksubr.c +++ b/sys/arch/mips64/mips64/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.37 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.38 2007/05/29 06:28:15 otto Exp $ */ /* * Copyright (c) 1999 Michael Shalayeff @@ -201,6 +201,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -501,8 +502,8 @@ static struct {int m; int b;} maptab[] = { lp->d_partitions[bsd].p_size = dlp->partitions[i].blocks; lp->d_partitions[bsd].p_fstype = maptab[i].b; if (lp->d_partitions[bsd].p_fstype == FS_BSDFFS) { - lp->d_partitions[bsd].p_fsize = 1024; - lp->d_partitions[bsd].p_frag = 8; + lp->d_partitions[bsd].p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(1024, 8); lp->d_partitions[bsd].p_cpg = 16; } } @@ -561,8 +562,7 @@ setdisklabel(olp, nlp, openmask, osdep) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/mvme68k/mvme68k/disksubr.c b/sys/arch/mvme68k/mvme68k/disksubr.c index 1dd4d51b7b2..13ceb97c242 100644 --- a/sys/arch/mvme68k/mvme68k/disksubr.c +++ b/sys/arch/mvme68k/mvme68k/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.38 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.39 2007/05/29 06:28:15 otto Exp $ */ /* * Copyright (c) 1998 Steve Murphree, Jr. * Copyright (c) 1995 Dale Rahn. @@ -147,6 +147,7 @@ done: bp->b_flags = B_INVAL | B_AGE | B_READ; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -202,8 +203,7 @@ setdisklabel(olp, nlp, openmask, clp) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/mvme88k/mvme88k/disksubr.c b/sys/arch/mvme88k/mvme88k/disksubr.c index 04dbd071675..bd9535d72d7 100644 --- a/sys/arch/mvme88k/mvme88k/disksubr.c +++ b/sys/arch/mvme88k/mvme88k/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.34 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.35 2007/05/29 06:28:15 otto Exp $ */ /* * Copyright (c) 1998 Steve Murphree, Jr. * Copyright (c) 1995 Dale Rahn. @@ -144,6 +144,7 @@ done: bp->b_flags = B_INVAL | B_AGE | B_READ; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -199,8 +200,7 @@ setdisklabel(olp, nlp, openmask, clp) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/mvmeppc/mvmeppc/disksubr.c b/sys/arch/mvmeppc/mvmeppc/disksubr.c index 0b538400c3a..00d369c3c77 100644 --- a/sys/arch/mvmeppc/mvmeppc/disksubr.c +++ b/sys/arch/mvmeppc/mvmeppc/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.33 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.34 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.21 1996/05/03 19:42:03 christos Exp $ */ /* @@ -295,6 +295,7 @@ done: bp->b_flags |= B_INVAL; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -343,8 +344,7 @@ setdisklabel(olp, nlp, openmask, osdep) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/arch/sparc/sparc/disksubr.c b/sys/arch/sparc/sparc/disksubr.c index 8d9ceeaf2ac..c8394812869 100644 --- a/sys/arch/sparc/sparc/disksubr.c +++ b/sys/arch/sparc/sparc/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.43 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.44 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.16 1996/04/28 20:25:59 thorpej Exp $ */ /* @@ -186,6 +186,7 @@ done: bp->b_flags = B_INVAL | B_AGE | B_READ; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -448,8 +449,8 @@ disklabel_sun_to_bsd(cp, lp) * The sun label does not store the FFS fields, * so just set them with default values here. */ - npp->p_fsize = 2048; - npp->p_frag = 8; + npp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(2048, 8); npp->p_cpg = 16; } } @@ -481,8 +482,8 @@ disklabel_sun_to_bsd(cp, lp) } npp->p_fstype = sun_fstypes[i+8]; if (npp->p_fstype == FS_BSDFFS) { - npp->p_fsize = 2048; - npp->p_frag = 8; + npp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(2048, 8); npp->p_cpg = 16; } } diff --git a/sys/arch/sparc64/sparc64/disksubr.c b/sys/arch/sparc64/sparc64/disksubr.c index b0b4987106b..162bcb88134 100644 --- a/sys/arch/sparc64/sparc64/disksubr.c +++ b/sys/arch/sparc64/sparc64/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.21 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.22 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.13 2000/12/17 22:39:18 pk Exp $ */ /* @@ -185,6 +185,7 @@ done: bp->b_flags = B_INVAL | B_AGE | B_READ; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -445,8 +446,8 @@ disklabel_sun_to_bsd(cp, lp) * The sun label does not store the FFS fields, * so just set them with default values here. */ - npp->p_fsize = 2048; - npp->p_frag = 8; + npp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(2048, 8); npp->p_cpg = 16; } } @@ -478,8 +479,8 @@ disklabel_sun_to_bsd(cp, lp) } npp->p_fstype = sun_fstypes[i+8]; if (npp->p_fstype == FS_BSDFFS) { - npp->p_fsize = 2048; - npp->p_frag = 8; + npp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(2048, 8) npp->p_cpg = 16; } } diff --git a/sys/arch/sparc64/stand/ofwboot/ofdev.c b/sys/arch/sparc64/stand/ofwboot/ofdev.c index 870e7c347b4..e03f7d7bebc 100644 --- a/sys/arch/sparc64/stand/ofwboot/ofdev.c +++ b/sys/arch/sparc64/stand/ofwboot/ofdev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ofdev.c,v 1.8 2006/07/27 20:41:29 deraadt Exp $ */ +/* $OpenBSD: ofdev.c,v 1.9 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: ofdev.c,v 1.1 2000/08/20 14:58:41 mrg Exp $ */ /* @@ -307,8 +307,8 @@ disklabel_sun_to_bsd(cp, lp) * The sun label does not store the FFS fields, * so just set them with default values here. */ - npp->p_fsize = 1024; - npp->p_frag = 8; + npp->p_fragblock = + DISKLABELV1_FFS_FRAGBLOCK(1024, 8); npp->p_cpg = 16; } } diff --git a/sys/arch/vax/vax/disksubr.c b/sys/arch/vax/vax/disksubr.c index 59aa57f35af..c94fd2c0ff2 100644 --- a/sys/arch/vax/vax/disksubr.c +++ b/sys/arch/vax/vax/disksubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disksubr.c,v 1.34 2007/05/29 05:08:20 krw Exp $ */ +/* $OpenBSD: disksubr.c,v 1.35 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: disksubr.c,v 1.21 1999/06/30 18:48:06 ragge Exp $ */ /* @@ -185,6 +185,7 @@ done: bp->b_flags = B_INVAL | B_AGE | B_READ; brelse(bp); } + cvtdisklabelv1(lp); return (msg); } @@ -231,8 +232,7 @@ setdisklabel(olp, nlp, openmask, osdep) */ if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) { npp->p_fstype = opp->p_fstype; - npp->p_fsize = opp->p_fsize; - npp->p_frag = opp->p_frag; + npp->p_fragblock = opp->p_fragblock; npp->p_cpg = opp->p_cpg; } } diff --git a/sys/kern/spec_vnops.c b/sys/kern/spec_vnops.c index 183b66b7fde..f06ee19defe 100644 --- a/sys/kern/spec_vnops.c +++ b/sys/kern/spec_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: spec_vnops.c,v 1.39 2007/04/10 19:02:26 thib Exp $ */ +/* $OpenBSD: spec_vnops.c,v 1.40 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: spec_vnops.c,v 1.29 1996/04/22 01:42:38 christos Exp $ */ /* @@ -267,10 +267,13 @@ spec_read(v) if ((majordev = major(vp->v_rdev)) < nblkdev && (ioctl = bdevsw[majordev].d_ioctl) != NULL && (*ioctl)(vp->v_rdev, DIOCGPART, (caddr_t)&dpart, FREAD, p) == 0) { - if (dpart.part->p_fstype == FS_BSDFFS && - dpart.part->p_frag != 0 && dpart.part->p_fsize != 0) - bsize = dpart.part->p_frag * - dpart.part->p_fsize; + u_int32_t frag = + DISKLABELV1_FFS_FRAG(dpart.part->p_fragblock); + u_int32_t fsize = + DISKLABELV1_FFS_FSIZE(dpart.part->p_fragblock); + if (dpart.part->p_fstype == FS_BSDFFS && frag != 0 && + fsize != 0) + bsize = frag * fsize; } bscale = btodb(bsize); do { @@ -363,10 +366,13 @@ spec_write(v) if ((majordev = major(vp->v_rdev)) < nblkdev && (ioctl = bdevsw[majordev].d_ioctl) != NULL && (*ioctl)(vp->v_rdev, DIOCGPART, (caddr_t)&dpart, FREAD, p) == 0) { - if (dpart.part->p_fstype == FS_BSDFFS && - dpart.part->p_frag != 0 && dpart.part->p_fsize != 0) - bsize = dpart.part->p_frag * - dpart.part->p_fsize; + u_int32_t frag = + DISKLABELV1_FFS_FRAG(dpart.part->p_fragblock); + u_int32_t fsize = + DISKLABELV1_FFS_FSIZE(dpart.part->p_fragblock); + if (dpart.part->p_fstype == FS_BSDFFS && frag != 0 && + fsize != 0) + bsize = frag * fsize; } bscale = btodb(bsize); do { diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c index b085a719e56..90ca865c6f8 100644 --- a/sys/kern/subr_disk.c +++ b/sys/kern/subr_disk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: subr_disk.c,v 1.42 2007/05/18 16:26:38 drahn Exp $ */ +/* $OpenBSD: subr_disk.c,v 1.43 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: subr_disk.c,v 1.17 1996/03/16 23:17:08 christos Exp $ */ /* @@ -182,6 +182,31 @@ dkcksum(struct disklabel *lp) } /* + * Convert an old disklabel to a v1 disklabel + */ +void +cvtdisklabelv1(struct disklabel *lp) +{ + int i; + + if (lp->d_version == 1) + return; + + lp->d_version = 1; + lp->d_secperunith = 0; + for (i = 0; i < MAXPARTITIONS; i++) { + struct partition *pp = &lp->d_partitions[i]; + struct __partitionv0 *v0pp = (struct __partitionv0 *) + &lp->d_partitions[i]; + + pp->p_fragblock = DISKLABELV1_FFS_FRAGBLOCK(v0pp->p_fsize, + v0pp->p_frag); + pp->p_offseth = 0; + pp->p_sizeh = 0; + } +} + +/* * Disk error is the preface to plaintive error messages * about failing disk transfers. It prints messages of the form diff --git a/sys/miscfs/specfs/spec_vnops.c b/sys/miscfs/specfs/spec_vnops.c index 183b66b7fde..f06ee19defe 100644 --- a/sys/miscfs/specfs/spec_vnops.c +++ b/sys/miscfs/specfs/spec_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: spec_vnops.c,v 1.39 2007/04/10 19:02:26 thib Exp $ */ +/* $OpenBSD: spec_vnops.c,v 1.40 2007/05/29 06:28:15 otto Exp $ */ /* $NetBSD: spec_vnops.c,v 1.29 1996/04/22 01:42:38 christos Exp $ */ /* @@ -267,10 +267,13 @@ spec_read(v) if ((majordev = major(vp->v_rdev)) < nblkdev && (ioctl = bdevsw[majordev].d_ioctl) != NULL && (*ioctl)(vp->v_rdev, DIOCGPART, (caddr_t)&dpart, FREAD, p) == 0) { - if (dpart.part->p_fstype == FS_BSDFFS && - dpart.part->p_frag != 0 && dpart.part->p_fsize != 0) - bsize = dpart.part->p_frag * - dpart.part->p_fsize; + u_int32_t frag = + DISKLABELV1_FFS_FRAG(dpart.part->p_fragblock); + u_int32_t fsize = + DISKLABELV1_FFS_FSIZE(dpart.part->p_fragblock); + if (dpart.part->p_fstype == FS_BSDFFS && frag != 0 && + fsize != 0) + bsize = frag * fsize; } bscale = btodb(bsize); do { @@ -363,10 +366,13 @@ spec_write(v) if ((majordev = major(vp->v_rdev)) < nblkdev && (ioctl = bdevsw[majordev].d_ioctl) != NULL && (*ioctl)(vp->v_rdev, DIOCGPART, (caddr_t)&dpart, FREAD, p) == 0) { - if (dpart.part->p_fstype == FS_BSDFFS && - dpart.part->p_frag != 0 && dpart.part->p_fsize != 0) - bsize = dpart.part->p_frag * - dpart.part->p_fsize; + u_int32_t frag = + DISKLABELV1_FFS_FRAG(dpart.part->p_fragblock); + u_int32_t fsize = + DISKLABELV1_FFS_FSIZE(dpart.part->p_fragblock); + if (dpart.part->p_fstype == FS_BSDFFS && frag != 0 && + fsize != 0) + bsize = frag * fsize; } bscale = btodb(bsize); do { diff --git a/sys/sys/disklabel.h b/sys/sys/disklabel.h index a80c265aa10..f7a3e7fbf83 100644 --- a/sys/sys/disklabel.h +++ b/sys/sys/disklabel.h @@ -1,4 +1,4 @@ -/* $OpenBSD: disklabel.h,v 1.28 2006/09/26 23:33:04 krw Exp $ */ +/* $OpenBSD: disklabel.h,v 1.29 2007/05/29 06:28:14 otto Exp $ */ /* $NetBSD: disklabel.h,v 1.41 1996/05/10 23:07:37 mark Exp $ */ /* @@ -145,7 +145,9 @@ struct disklabel { u_int32_t d_flags; /* generic flags */ #define NDDATA 5 u_int32_t d_drivedata[NDDATA]; /* drive-type specific information */ -#define NSPARE 5 + u_int16_t d_secperunith; /* # of data sectors (high part) */ + u_int16_t d_version; /* version # (1=48 bit addressing) */ +#define NSPARE 4 u_int32_t d_spare[NSPARE]; /* reserved for future use */ u_int32_t d_magic2; /* the magic number (again) */ u_int16_t d_checksum; /* xor of data incl. partitions */ @@ -157,9 +159,10 @@ struct disklabel { struct partition { /* the partition table */ u_int32_t p_size; /* number of sectors in partition */ u_int32_t p_offset; /* starting sector */ - u_int32_t p_fsize; /* filesystem basic fragment size */ + u_int16_t p_offseth; /* starting sector (high part) */ + u_int16_t p_sizeh; /* number of sectors (high part) */ u_int8_t p_fstype; /* filesystem type, see below */ - u_int8_t p_frag; /* filesystem fragments per block */ + u_int8_t p_fragblock; /* encoded filesystem frag/block */ union { u_int16_t cpg; /* UFS: FS cylinders per group */ u_int16_t sgs; /* LFS: FS segment shift */ @@ -168,6 +171,20 @@ struct disklabel { #define p_sgs __partition_u1.sgs } d_partitions[MAXPARTITIONS]; /* actually may be more */ }; + + +struct __partitionv0 { /* the partition table */ + u_int32_t p_size; /* number of sectors in partition */ + u_int32_t p_offset; /* starting sector */ + u_int32_t p_fsize; /* filesystem basic fragment size */ + u_int8_t p_fstype; /* filesystem type, see below */ + u_int8_t p_frag; /* filesystem fragments per block */ + union { + u_int16_t cpg; /* UFS: FS cylinders per group */ + u_int16_t sgs; /* LFS: FS segment shift */ + } __partitionv0_u1; +}; + #else /* _LOCORE */ /* * offsets for asm boot files. @@ -181,6 +198,17 @@ struct disklabel { .set d_end_,404 /* size of disk label */ #endif /* _LOCORE */ + +#define DISKLABELV1_FFS_FRAGBLOCK(fsize, frag) \ + ((fsize) * (frag) == 0 ? 0 : \ + (((ffs((fsize) * (frag)) - 13) << 3) | (ffs(frag)))) + +#define DISKLABELV1_FFS_BSIZE(i) ((i) == 0 ? 0 : (1 << (((i) >> 3) + 12))) +#define DISKLABELV1_FFS_FRAG(i) ((i) == 0 ? 0 : (1 << (((i) & 0x07) - 1))) +#define DISKLABELV1_FFS_FSIZE(i) ((i) == 0 ? 0 : \ + (DISKLABELV1_FFS_BSIZE(i) / DISKLABELV1_FFS_FRAG(i))) + + /* d_type values: */ #define DTYPE_SMD 1 /* SMD, XSMD; VAX hp/up */ #define DTYPE_MSCP 2 /* MSCP */ @@ -354,6 +382,7 @@ struct partinfo { void diskerr(struct buf *, char *, char *, int, int, struct disklabel *); void disksort(struct buf *, struct buf *); u_int dkcksum(struct disklabel *); +void cvtdisklabelv1(struct disklabel *); int setdisklabel(struct disklabel *, struct disklabel *, u_long, struct cpu_disklabel *); char *readdisklabel(dev_t, void (*)(struct buf *), struct disklabel *, |