> I think I finally figured out where the problem comes from.
> 
> The "- LABELSECTOR" on line 144 is indeed causing it and should be
> removed. But it has been added here for a reason: to balance the "+
> LABELSECTOR" in the writedisklabel function below, when this part of the
> code was factorized years ago
> <http://www.openbsd.org/cgi-bin/cvsweb/src/sys/arch/macppc/macppc/disksubr.c.diff?r1=1.55;r2=1.56;f=h>

Right.

> As far as I can tell, LABELSECTOR is an MBR related constant and
> probably shouldn't have been put in a DPME code in the first place.

Not quite.  LABELSECTOR is not a MBR related constant.  It is a
machine-dependent block offset from the start-of-openbsd-area where
the native disklabel is placed.  It exists on MBR-based machines, but
it also exists on machines which do not use MBR's.

In this case, if we are reading a non-native label though (and then
spoofing a label from that), LABELSECTOR is invalid.

So your diff to readdpmelabel() looks correct.
 
> But
> in practice, at that time it wasn't a problem since the "hfspartoff"
> variable was only used (indirectly) by the writedisklabel function.
> Unfortunately this was no longer the case when bounds were added
> <http://www.openbsd.org/cgi-bin/cvsweb/src/sys/arch/macppc/macppc/disksubr.c.diff?r1=1.61;r2=1.63;f=h>

I think you have also done the right thing for the writedisklabel part:
Only add the LABELSECTOR if it is a native label.

I will give this a try for a bit and get back to you.

ps. Please try to indent code in the same existing style.

> So, here is my patch to fix the issue.
> ====================================================================
> diff -u -r1.69 disksubr.c
> --- disksubr.c        26 Feb 2011 13:07:48 -0000      1.69
> +++ disksubr.c        21 May 2011 15:29:35 -0000
> @@ -141,7 +141,7 @@
>                               *s = (*s - 'a' + 'A');
> 
>               if (strcmp(part->pmPartType, PART_TYPE_OPENBSD) == 0) {
> -                     hfspartoff = part->pmPyPartStart - LABELSECTOR;
> +                     hfspartoff = part->pmPyPartStart;
>                       hfspartend = hfspartoff + part->pmPartBlkCnt;
>                       if (partoffp) {
>                               *partoffp = hfspartoff;
> @@ -176,7 +176,7 @@
>               return (0);
> 
>       /* next, dig out disk label */
> -     bp->b_blkno = hfspartoff + LABELSECTOR;
> +     bp->b_blkno = hfspartoff;
>       bp->b_bcount = lp->d_secsize;
>       bp->b_flags = B_BUSY | B_READ | B_RAW;
>       (*strat)(bp);
> @@ -201,12 +201,17 @@
>       bp = geteblk((int)lp->d_secsize);
>       bp->b_dev = dev;
> 
> -     if (readdpmelabel(bp, strat, lp, &partoff, 1) != NULL &&
> -         readdoslabel(bp, strat, lp, &partoff, 1) != NULL)
> -             goto done;
> +     if (readdpmelabel(bp, strat, lp, &partoff, 1) != NULL)
> +     {
> +             if (readdoslabel(bp, strat, lp, &partoff, 1) != NULL)
> +                     goto done;
> +             else
> +                     bp->b_blkno = partoff + LABELSECTOR;
> +     }
> +     else
> +             bp->b_blkno = partoff;
> 
>       /* Read it in, slap the new label in, and write it back out */
> -     bp->b_blkno = partoff + LABELSECTOR;
>       bp->b_bcount = lp->d_secsize;
>       bp->b_flags = B_BUSY | B_READ | B_RAW;
>       (*strat)(bp);
> ====================================================================
> 
> Here are 2 outputs from the disklabel tool, first before the patch...
> 
> OpenBSD area: 53706878-58605119; size: 4898241; free: 4898241
> 
> ... and after the patch.
> 
> OpenBSD area: 53706879-58605120; size: 4898241; free: 4898241
> 
> 
> I saw that the socppc port has the same piece of code in its
> "socppc/disksubr.c" file. I can't test on this platform but my best
> guess is it has the same problem.
> 
> 
> On 05/08/2011 11:56 PM, Mathieu Olivier wrote:
> > Hi.
> > 
> > I recently made some space on my old iBook G4 (1.2 GHz, late 2004 model)
> > to put a few extra partitions, for a Linux, an OpenBSD 4.9, and a shared
> > data partition using FAT32.
> > 
> > During the installation process, I briefly struggled with the disklabel
> > tool before realizing that my problems came from the fact that it gave
> > me an incorrect automatic layout to begin with: the root partition was
> > starting one sector *ahead* of the OpenBSD partition itself. I fixed the
> > layout manually, but the "boundstart" displayed by disklabel is still
> > incorrect on my running system, as you can see from those outputs of
> > pdisk and disklabel respectively:
> > 
> > 
> > # pdisk wd0
> > Edit wd0 -
> > Command (? for help): p
> > 
> > Partition map (with 512 byte blocks) on 'wd0'
> >  #:                type name        length   base     ( size )
> >  1: Apple_partition_map Apple           63 @ 1
> >  2:     Apple_Bootstrap untitled      1954 @ 39935392
> >  3:           Apple_HFS Untitled  39673184 @ 262208   ( 18.9G)
> >  4:     Apple_UNIX_SVR2 LinuxRoot 10742188 @ 39937346 (  5.1G)
> >  5:     Apple_UNIX_SVR2 swap        585938 @ 50679534 (286.1M)
> >  6:     Apple_UNIX_SVR2 Shared     2441407 @ 51265472 (  1.2G)
> >  7:          Apple_Free Extra       262144 @ 64       (128.0M)
> >  8:             OpenBSD OpenBSD    4898241 @ 53706879 (  2.3G)
> > 
> > Device block size=512, Number of Blocks=58605120 (27.9G)
> > DeviceType=0x0, DeviceId=0x0
> > 
> > Command (? for help): q
> > 
> > # disklabel wd0
> > # /dev/rwd0c:
> > type: ESDI
> > disk: ESDI/IDE disk
> > label: TOSHIBA MK3025GA
> > duid: c2997bcd646b6636
> > flags:
> > bytes/sector: 512
> > sectors/track: 63
> > tracks/cylinder: 16
> > sectors/cylinder: 1008
> > cylinders: 58140
> > total sectors: 58605120
> > boundstart: 53706878
> > boundend: 58605119
> > drivedata: 0
> > 
> > 16 partitions:
> > #                size           offset  fstype [fsize bsize  cpg]
> >   a:          4499968         53706880  4.2BSD   2048 16384    1 # /
> >   b:           398241         58206879    swap
> >   c:         58605120                0  unused
> >   i:         39673184           262208     HFS
> >   j:          2441407         51265472   MSDOS
> > 
> > 
> > I read some documentation and source files to try to figure out where
> > this problem comes from, and I stepped across a very suspicious line of
> > code, in "src/sys/arch/macppc/macppc/disksubr.c"
> > <http://www.openbsd.org/cgi-bin/cvsweb/src/sys/arch/macppc/macppc/disksubr.c?annotate=1.69>.
> > 
> > Line 144: "hfspartoff = part->pmPyPartStart - LABELSECTOR;"
> > 
> > And, if I'm not mistaken, LABELSECTOR is equal to 1 on MacPPC, and
> > hfspartoff is used to initialize the boundstart 6 lines later... So
> > coincidence or real bug ?  :)
> > 
> 
> -- 
> Mathieu Olivier  <moliv...@users.sourceforge.net>

Reply via email to