Date: Tue, 17 Dec 2002 18:47:22 -0500 From: "Brian F. Feldman" <green@FreeBSD.org> To: "M. Warner Losh" <imp@bsdimp.com> Cc: cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/boot/i386/boot2 boot2.c Message-ID: <200212172347.gBHNlNiP014104@green.bikeshed.org> In-Reply-To: Your message of "Tue, 17 Dec 2002 16:28:42 MST." <20021217.162842.36665700.imp@bsdimp.com>
next in thread | previous in thread | raw e-mail | index | archive | help
"M. Warner Losh" <imp@bsdimp.com> wrote:
> In message: <200212172213.gBHMD7wd013565@green.bikeshed.org>
> "Brian F. Feldman" <green@FreeBSD.org> writes:
> : Warner Losh <imp@FreeBSD.org> wrote:
> : > imp 2002/12/17 14:00:06 PST
> : >
> : > Modified files:
> : > sys/boot/i386/boot2 boot2.c
> : > Log:
> : > Reduce diffs with Peter's expanded diffs:
> : > 1) Put back the keyboard printing printf, at the cost of 58 bytes.
> : > 2) Minor tweak to getstr at no apparent cost.
> :
> : Hmm, after all this work on boot2, I remain confused as to why noone else
> : working on the boot blocks seems to have any trouble reinstalling them
> : to test. Am I really the only one that had to fix disklabel.c so that it
> : would install boot blocks instead of just dying on a post-GEOM system?
> : It seems strange that it's only a few people here that would be having that
> : issue :)
>
> I had to hack disklabel.c in unnatural ways to install to test.
Is this better?
==== //depot/vendor/freebsd/src/sbin/disklabel/disklabel.8#12 (text+ko) - //depot/projects/trustedbsd/mac/sbin/disklabel/disklabel.8#10 (text+ko) ==== content
@@ -535,6 +535,7 @@
sectors/cylinder: 969
cylinders: 1211
sectors/unit: 1173930
+boot block size: 8192
rpm: 3600
interleave: 1
trackskew: 0
@@ -576,6 +577,11 @@
specifies that the drive can perform bad sector remapping.
.It Nm sectors/unit
describes the total size of the disk. This value must be correct.
+.It Nm boot block size
+specifies the total length of the boot block allowable on the disk.
+This defaults to 8192, as it always has, but may be increased if there is
+more space available, with a UFS2 filesystem as the first partition or
+via other means.
.It Nm the partition table
This is the
.Ux
@@ -818,6 +824,7 @@
sectors/cylinder: 1008
cylinders: 40633
sectors/unit: 40959009
+boot block size: 8192
rpm: 3600
interleave: 1
trackskew: 0
==== //depot/vendor/freebsd/src/sbin/disklabel/disklabel.c#26 (text+ko) - //depot/projects/trustedbsd/mac/sbin/disklabel/disklabel.c#15 (text+ko) ==== content
@@ -97,6 +97,12 @@
#ifndef BBSIZE
#define BBSIZE 8192 /* size of boot area, with label */
#endif
+/*
+ * Define an upper boundary for the boot blocks.
+ */
+#ifndef MAXBBSIZE
+#define MAXBBSIZE 262144 /* max size of boot area, with label */
+#endif
/* FIX! These are too low, but are traditional */
#define DEFAULT_NEWFS_BLOCK 8192U
@@ -142,7 +148,7 @@
char namebuf[BBSIZE], *np = namebuf;
struct disklabel lab;
-char bootarea[BBSIZE];
+char bootarea[MAXBBSIZE];
char blank[] = "";
char unknown[] = "unknown";
@@ -233,7 +239,6 @@
argv += optind;
#if NUMBOOT > 0
if (installboot) {
- rflag++;
if (op == UNSPEC)
op = WRITEBOOT;
} else {
@@ -345,6 +350,7 @@
tlab = *lp;
if (argc == 2)
makelabel(argv[1], 0, &lab);
+ lab.d_bbsize = lp->d_bbsize;
lp = makebootarea(bootarea, &lab, f);
*lp = tlab;
if (checklabel(lp) == 0)
@@ -404,7 +410,7 @@
lp->d_magic2 = DISKMAGIC;
lp->d_checksum = 0;
lp->d_checksum = dkcksum(lp);
- if (rflag) {
+ if (rflag || op == WRITEBOOT) {
/*
* First set the kernel disk label,
* then write a label to the raw disk.
@@ -413,7 +419,7 @@
* may prevent us from changing the current (in-core)
* label.
*/
- if (ioctl(f, DIOCSDINFO, lp) < 0 &&
+ if (op != WRITEBOOT && ioctl(f, DIOCSDINFO, lp) < 0 &&
errno != ENODEV && errno != ENOTTY) {
l_perror("ioctl DIOCSDINFO");
return (1);
@@ -467,15 +473,41 @@
cksum ^= *sp1++;
sl->sl_cksum = cksum;
#endif
- /*
- * write enable label sector before write (if necessary),
- * disable after writing.
- */
- flag = 1;
- (void)ioctl(f, DIOCWLABEL, &flag);
- if (write(f, boot, lp->d_bbsize) != (int)lp->d_bbsize) {
- warn("write");
- return (1);
+ if (op != WRITEBOOT) {
+ /*
+ * write enable label sector before write (if
+ * necessary), disable after writing.
+ */
+ flag = 1;
+ (void)ioctl(f, DIOCWLABEL, &flag);
+ if (write(f, boot, lp->d_bbsize) != (int)lp->d_bbsize) {
+ warn("write");
+ return (1);
+ }
+ } else {
+ /*
+ * Write out all of the boot area except
+ * for the sector reserved for the disklabel
+ * itself; that part is written only by
+ * the kernel, and we can't get it right.
+ */
+ ssize_t labelareabegin, labelareaend;
+
+ labelareabegin = (LABELSECTOR * lp->d_secsize)
+ + LABELOFFSET;
+ labelareaend = labelareabegin + lp->d_secsize;
+ if (write(f, boot, labelareabegin) !=
+ labelareabegin) {
+ warn("write");
+ return (1);
+ }
+ (void)lseek(f, (off_t)labelareaend, SEEK_SET);
+ if (write(f, boot + labelareaend,
+ lp->d_bbsize - labelareaend) !=
+ lp->d_bbsize - labelareaend) {
+ warn("write");
+ return (1);
+ }
}
#if NUMBOOT > 0
/*
@@ -486,8 +518,13 @@
return(1);
}
#endif
- flag = 0;
- (void) ioctl(f, DIOCWLABEL, &flag);
+ if (op != WRITEBOOT) {
+ flag = 0;
+ (void) ioctl(f, DIOCWLABEL, &flag);
+ } else if (ioctl(f, DIOCWDINFO, lp) < 0) {
+ l_perror("ioctl DIOCWDINFO");
+ return (1);
+ }
} else if (ioctl(f, DIOCWDINFO, lp) < 0) {
l_perror("ioctl DIOCWDINFO");
return (1);
@@ -581,10 +618,10 @@
#endif
/* XXX */
- if (dp->d_secsize == 0) {
+ if (dp->d_secsize == 0)
dp->d_secsize = DEV_BSIZE;
+ if (dp->d_bbsize == 0)
dp->d_bbsize = BBSIZE;
- }
lp = (struct disklabel *)
(boot + (LABELSECTOR * dp->d_secsize) + LABELOFFSET);
bzero((char *)lp, sizeof *lp);
@@ -596,7 +633,7 @@
*/
if (!installboot) {
if (rflag) {
- if (read(f, boot, BBSIZE) < BBSIZE)
+ if (read(f, boot, lp->d_bbsize) < lp->d_bbsize)
err(4, "%s", specname);
bzero((char *)lp, sizeof *lp);
}
@@ -754,6 +791,7 @@
fprintf(f, "sectors/cylinder: %lu\n", (u_long)lp->d_secpercyl);
fprintf(f, "cylinders: %lu\n", (u_long)lp->d_ncylinders);
fprintf(f, "sectors/unit: %lu\n", (u_long)lp->d_secperunit);
+ fprintf(f, "boot block size: %u\n", lp->d_bbsize);
fprintf(f, "rpm: %u\n", lp->d_rpm);
fprintf(f, "interleave: %u\n", lp->d_interleave);
fprintf(f, "trackskew: %u\n", lp->d_trackskew);
@@ -1092,6 +1130,16 @@
lp->d_secperunit = v;
continue;
}
+ if (streq(cp, "boot block size")) {
+ v = strtoul(tp, NULL, 10);
+ if (v == 0 || v > UINT_MAX) {
+ fprintf(stderr, "line %d: %s: bad %s\n",
+ lineno, tp, cp);
+ errors++;
+ } else
+ lp->d_bbsize = v;
+ continue;
+ }
if (streq(cp, "rpm")) {
v = strtoul(tp, NULL, 10);
if (v == 0 || v > USHRT_MAX) {
@@ -1625,10 +1673,10 @@
loclab.d_secpercyl = loclab.d_ntracks * loclab.d_nsectors;
loclab.d_ncylinders = loclab.d_secperunit / loclab.d_secpercyl;
loclab.d_npartitions = MAXPARTITIONS;
+ loclab.d_bbsize = BBSIZE;
/* Various (unneeded) compat stuff */
loclab.d_rpm = 3600;
- loclab.d_bbsize = BBSIZE;
loclab.d_interleave = 1;;
strncpy(loclab.d_typename, "amnesiac",
sizeof(loclab.d_typename));
--
Brian Fundakowski Feldman \'[ FreeBSD ]''''''''''\
<> green@FreeBSD.org <> bfeldman@tislabs.com \ The Power to Serve! \
Opinions expressed are my own. \,,,,,,,,,,,,,,,,,,,,,,\
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200212172347.gBHNlNiP014104>
