Subject: Re: kern/25108: Default disklabel for cd(4)
To: None <gnats-bugs@gnats.netbsd.org>
From: David Laight <david@l8s.co.uk>
List: tech-kern
Date: 05/06/2004 21:50:31
On Thu, May 06, 2004 at 09:45:00AM +0200, Quentin Garnier wrote:
(but didn't add to the gnats entry...)
> Hi all,
>
> There is a bug in the way readdisklabel() interacts with device label
> generation routines in lower level driver. It is clearly apparent with
> cd(4), but might as well happen with other devices for which it can be
> completely normal to have neither a disklabel nor a MBR.
>
> kern/subr_disk_mbr.c is not used by all archs, only by amd64, i386 and
> ibmnws as it seems. So the issue as I will describe it only happens on
> those archs. That doesn't mean some other archs don't have their
> readdisklabel() bugged, too.
FWIW I added subr_disk_mbr.c in order to start the process of commoning
up a load of code that should never have got itself MD...
> When cd(4) wants to generate a disklabel, it calls cdgetdisklabel().
> That function first tries to call readdisklabel(), and if that function
> returns an error, it outputs it on the console and use a default label.
>
> On i386 (I confirm it does about the same on -1-6, too), readdisklabel()
> tries to find a MBR first, then tries to directly read a disklabel on
> the device.
>
> The difference between -1-6 and -current from after July, 7th, 2003, is
> that the MI readdisklabel() does not return an error if it couldn't read
> neither a MBR not a disklabel.
>
> That avoids the message "cd0: no disk label" we can see on our -1-6
> hosts, but that makes cdgetdisklabel immediately return, not generating
> a correct label.
>
> The reason why disklabel shows 4.2BSD for 'a' is that the MI
> readdisklabel sets that by default, in case it doesn't find a MBR or a
> label.
Yes - otherwise everything suffers from serious grief since nothing
excpect to have to use cd0d.
Before I wrote subr_disk_mbr.c all the partitions used to get set to
cover the whole disk....
> I think this is not a correct behaviour, and even though I agree we
> should avoid printing an error message when the case of actually having
> a MBR or a label on a CD-ROM would be very unexpected.
>
> My proposal is the following: making readdisklabel() return an empty
> string in case no relevant data was found while no error happened. Then
> the device routine that calls readdisklabel() can check the length of
> the returned message and not print it if it is empty.
That just adds code to all the drivers - which just isn't (and shouldn't be)
necessary.
> Somehow I wonder what happens for devices that first calls their default
> labelling function, and then call readdisklabel(), which inconditionally
> overwrites type for 'a'. I'd like some input on what to do here, too.
The obvious thing is for the default label (returned by readdisklabel)
to contain the fs_type from the raw partition in entry 'a'.
This patch should suffice.
David
Index: subr_disk_mbr.c
===================================================================
RCS file: /cvsroot/src/sys/kern/subr_disk_mbr.c,v
retrieving revision 1.4
diff -u -p -r1.4 subr_disk_mbr.c
--- subr_disk_mbr.c 8 Oct 2003 04:25:46 -0000 1.4
+++ subr_disk_mbr.c 6 May 2004 20:32:59 -0000
@@ -225,13 +225,15 @@ readdisklabel(dev, strat, lp, osdep)
if (lp->d_partitions[RAW_PART].p_size == 0)
lp->d_partitions[RAW_PART].p_size = 0x1fffffff;
lp->d_partitions[RAW_PART].p_offset = 0;
+ if (lp->d_partitions[RAW_PART].p_fstype == FS_UNUSED)
+ lp->d_partitions[RAW_PART].p_fstype = FS_BSDFFS;
/*
* Set partition 'a' to be the whole disk.
* Cleared if we find an mbr or a netbsd label.
*/
lp->d_partitions[0].p_size = lp->d_partitions[RAW_PART].p_size;
- lp->d_partitions[0].p_fstype = FS_BSDFFS;
+ lp->d_partitions[0].p_fstype = lp->d_partitions[RAW_PART].p_fstype;
/* get a buffer and initialize it */
a.bp = geteblk((int)lp->d_secsize);
--
David Laight: david@l8s.co.uk