From owner-freebsd-stable Fri Oct 27 17:31:22 2000 Delivered-To: freebsd-stable@freebsd.org Received: from earth.backplane.com (placeholder-dcat-1076843399.broadbandoffice.net [64.47.83.135]) by hub.freebsd.org (Postfix) with ESMTP id E0DC837B479; Fri, 27 Oct 2000 17:31:13 -0700 (PDT) Received: (from dillon@localhost) by earth.backplane.com (8.11.1/8.9.3) id e9S0VCl55795; Fri, 27 Oct 2000 17:31:12 -0700 (PDT) (envelope-from dillon) Date: Fri, 27 Oct 2000 17:31:12 -0700 (PDT) From: Matt Dillon Message-Id: <200010280031.e9S0VCl55795@earth.backplane.com> To: John Baldwin Cc: Terry Lambert , (Paul Saab) , (Danny Braniss) , freebsd-stable@FreeBSD.org, hackers@FreeBSD.org, (Matt Dillon) Subject: Re: Really odd "BTX halted" problem booting FreeBSD on VALinux h References: Sender: owner-freebsd-stable@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG :> I think you are specifying the wrong arguments to disklabel; I :> seem to rememebr a -w/-W distinction... : :Nope. : :> In any case, I'm running with a disklabel inside a DOS partition :> on all but one box of mine, and always have been. I installed :> 4.1 on my laptop that way. : :Sysinstall can create a disklabel inside of a MBR slice fine. The :problem is that the disklabel(8) _program_ itself doesn't know how :to create a virgin disklabel for a MBR slice. : :-- : :John Baldwin -- http://www.FreeBSD.org/~jhb/ The patchset I put on the lists earlier today will allow disklabel to install a virgin label on a slice. Did it not get out? As matters currently stand, disklabel can only edit a preexisting label on a slice. I'll post it again... included below (this time without the file descriptor cruft that snuck into my previous posting of the patch). With the patch you can do this: # optional dd if you are paranoid # dd if=/dev/zero of=/dev/da0 bs=32k count=4 fdisk -I da0 disklabel -w -r da0s1 auto That's much preferable to having to use sysinstall if all you want to do is initialize a label on a slice. -Matt Index: sbin/disklabel/disklabel.c =================================================================== RCS file: /home/ncvs/src/sbin/disklabel/disklabel.c,v retrieving revision 1.28.2.3 diff -u -r1.28.2.3 disklabel.c --- sbin/disklabel/disklabel.c 2000/07/01 06:47:46 1.28.2.3 +++ sbin/disklabel/disklabel.c 2000/10/27 19:24:00 @@ -1347,10 +1347,17 @@ warn("cannot open %s", namebuf); return (NULL); } - if (ioctl(f, DIOCGDINFO, &lab) < 0) { - warn("ioctl DIOCGDINFO"); - close(f); - return (NULL); + + /* + * Try to use the new get-virgin-label ioctl. If it fails, + * fallback to the old get-disdk-info ioctl. + */ + if (ioctl(f, DIOCGDVIRGIN, &lab) < 0) { + if (ioctl(f, DIOCGDINFO, &lab) < 0) { + warn("ioctl DIOCGDINFO"); + close(f); + return (NULL); + } } close(f); lab.d_boot0 = NULL; Index: sys/kern/subr_diskslice.c =================================================================== RCS file: /home/ncvs/src/sys/kern/subr_diskslice.c,v retrieving revision 1.82 diff -u -r1.82 subr_diskslice.c --- sys/kern/subr_diskslice.c 2000/01/28 11:51:08 1.82 +++ sys/kern/subr_diskslice.c 2000/10/27 19:23:28 @@ -366,12 +366,46 @@ int slice; struct diskslice *sp; struct diskslices *ssp; + struct partition *pp; slice = dkslice(dev); ssp = *sspp; sp = &ssp->dss_slices[slice]; lp = sp->ds_label; switch (cmd) { + + case DIOCGDVIRGIN: + lp = (struct disklabel *)data; + if (ssp->dss_slices[WHOLE_DISK_SLICE].ds_label) { + *lp = *ssp->dss_slices[WHOLE_DISK_SLICE].ds_label; + } else { + bzero(lp, sizeof(struct disklabel)); + } + + lp->d_magic = DISKMAGIC; + lp->d_magic2 = DISKMAGIC; + pp = &lp->d_partitions[RAW_PART]; + pp->p_offset = 0; + pp->p_size = sp->ds_size; + + lp->d_npartitions = MAXPARTITIONS; + if (lp->d_interleave == 0) + lp->d_interleave = 1; + if (lp->d_rpm == 0) + lp->d_rpm = 3600; + if (lp->d_nsectors == 0) + lp->d_nsectors = 32; + if (lp->d_ntracks == 0) + lp->d_ntracks = 64; + + lp->d_bbsize = BBSIZE; + lp->d_sbsize = SBSIZE; + lp->d_secpercyl = lp->d_nsectors * lp->d_ntracks; + lp->d_ncylinders = sp->ds_size / lp->d_secpercyl; + lp->d_secperunit = sp->ds_size; + lp->d_checksum = 0; + lp->d_checksum = dkcksum(lp); + return (0); case DIOCGDINFO: if (lp == NULL) To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-stable" in the body of the message