Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 23 Nov 2001 08:06:14 -0800 (PST)
From:      John Baldwin <jhb@FreeBSD.org>
To:        Bruce Evans <bde@zeta.org.au>
Cc:        cvs-all@FreeBSD.org, cvs-committers@FreeBSD.org, Peter Wemm <peter@wemm.org>
Subject:   Re: cvs commit: src/sys/kern subr_diskmbr.c
Message-ID:  <XFMail.011123080614.jhb@FreeBSD.org>
In-Reply-To: <20011123234342.I5572-100000@delplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help

On 23-Nov-01 Bruce Evans wrote:
> On Wed, 21 Nov 2001, John Baldwin wrote:
> 
>> On 21-Nov-01 Peter Wemm wrote:
>> > John Baldwin wrote:
>> >> Eh?  Did you not kill DD mode in userland?
>> >
>> > Not quite.  The problem was that the alternate boot1 layout was not
>> > recognized by subr_diskmbr.c as "dangerous" (and therefore ignored) so it
>> > tried to interpret it and failed messily.
>> >
>> > disklabel -r -w ad1 auto
>> > .. was failing apparently.  The whole DD thing still needs to be
>> > resolved.
>>
>> That isn't supposed to work.  You don't write a disklabel to a hard drive on
>> a
>> PC, you write a MBR using 'fdisk'.  disklabel ad1 auto should fail.  Right
>> now
>> it does DD mode.
> 
> Erm, this is supposed to work.  It works for me, at least for md instead
> of ad.  Test program:
> 
> %%%
> SOMEFILE=/tmp/zz
> cp /boot/boot1 ${SOMEFILE}
> time dd if=/dev/zero of=${SOMEFILE} oseek=99999 count=1
> mdconfig -a -t vnode -f ${SOMEFILE} -u 0
> disklabel md0
> disklabel -rw md0 auto
> disklabel md0
> mdconfig -d -u 0
> %%%
> 
> The failure for old kernels is interesting.  The size of the BSD
> compatibility slice is just 50000 intead of the size of disk because
> the bogus MBR has a bogus size of 50000.  Labelling this slice using
> "auto" should just work.  But it fails because disklabel(9) reads the
> virgin label from a wrong device (/dev/md0 instead of /dev/md0c).
> "disklabel -rw md0s4 auto" works correctly.  disklabel(8) still reads
> the virgin label from a wrong device (/dev/md0s4 instead of /dev/md0s4c),
> but this is only logically wrong since these devices are normally (and
> initially always) physically identical.
> 
>> If you don't want it to fail, it should write a disklabel (not
>> a MBR).  (If this is a non-boot disk in a FreeBSD only system this would be
>> ok.)
> 
> Well, "disklabel -rw" writes a label only, but "disklabel -Brw md0"
> writes boot blocks to /dev/md0c, wherever that is.  If md0 is empty,
> then md0c is is the whole of md0 and boot1 gets written to the MBR.
> On the next open after all minors on md0 are closed, the bogus partition
> table in boot1 gets used.  I copied boot1 to the MBR explicitly in the
> above test (just to get the bogus partition table and show that it
> doesn't break "auto").

Yes, I'm saying that this is wrong. :)  boot1 shouldn't have a MBR in it.  That
is the real layering violation.  disklabel doesn't grok MBR's at all, rather,
we've hacked boot1 to provide a MBR when disklabel takes over a disk.  Since
Peter has fixed the bug in it, it is now just ugly rather than broken as well. 
It's still somewhat broken however as anything that tries to check such a
labeled disk and tries to find a valid MBR is going to choke.

> Bruce

-- 

John Baldwin <jhb@FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/

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?XFMail.011123080614.jhb>