Without changing behaviour for native disklabels, allow some more archs that call readdoslabel() to read/write disklabels to same place as readdoslabel() reads from.
The hppa paren chunk are to make hppa and hppa64 disksubr.c identical again. ok? .... Ken Index: hppa/hppa/disksubr.c =================================================================== RCS file: /cvs/src/sys/arch/hppa/hppa/disksubr.c,v retrieving revision 1.80 diff -u -p -r1.80 disksubr.c --- hppa/hppa/disksubr.c 16 Apr 2011 03:21:15 -0000 1.80 +++ hppa/hppa/disksubr.c 7 Jul 2011 04:55:45 -0000 @@ -108,7 +108,7 @@ readliflabel(struct buf *bp, void (*stra SET(bp->b_flags, B_BUSY | B_READ | B_RAW); (*strat)(bp); if (biowait(bp)) - return bp->b_error; + return (bp->b_error); lvp = (struct lifvol *)bp->b_data; if (lvp->vol_id != LIF_VOL_ID) { @@ -252,6 +252,7 @@ int writedisklabel(dev_t dev, void (*strat)(struct buf *), struct disklabel *lp) { int error = EIO, partoff = -1; + int offset; struct disklabel *dlp; struct buf *bp = NULL; @@ -259,12 +260,17 @@ writedisklabel(dev_t dev, void (*strat)( bp = geteblk((int)lp->d_secsize); bp->b_dev = dev; - if (readliflabel(bp, strat, lp, &partoff, 1) != 0 && - readdoslabel(bp, strat, lp, &partoff, 1) != 0) + if (readliflabel(bp, strat, lp, &partoff, 1) == 0) { + bp->b_blkno = partoff + LABELSECTOR; + offset = LABELOFFSET; + } else if (readdoslabel(bp, strat, lp, &partoff, 1) == 0) { + bp->b_blkno = DL_BLKTOSEC(lp, partoff + LABELSECTOR) * + DL_BLKSPERSEC(lp); + offset = DL_BLKOFFSET(lp, partoff + LABELSECTOR) + LABELOFFSET; + } else goto done; /* Read it in, slap the new label in, and write it back out */ - bp->b_blkno = partoff + LABELSECTOR; bp->b_bcount = lp->d_secsize; CLR(bp->b_flags, B_READ | B_WRITE | B_DONE); SET(bp->b_flags, B_BUSY | B_READ | B_RAW); @@ -272,7 +278,7 @@ writedisklabel(dev_t dev, void (*strat)( if ((error = biowait(bp)) != 0) goto done; - dlp = (struct disklabel *)(bp->b_data + LABELOFFSET); + dlp = (struct disklabel *)(bp->b_data + offset); *dlp = *lp; CLR(bp->b_flags, B_READ | B_WRITE | B_DONE); SET(bp->b_flags, B_BUSY | B_WRITE | B_RAW); Index: hppa64/hppa64/disksubr.c =================================================================== RCS file: /cvs/src/sys/arch/hppa64/hppa64/disksubr.c,v retrieving revision 1.64 diff -u -p -r1.64 disksubr.c --- hppa64/hppa64/disksubr.c 16 Apr 2011 03:21:15 -0000 1.64 +++ hppa64/hppa64/disksubr.c 7 Jul 2011 04:57:30 -0000 @@ -252,6 +252,7 @@ int writedisklabel(dev_t dev, void (*strat)(struct buf *), struct disklabel *lp) { int error = EIO, partoff = -1; + int offset; struct disklabel *dlp; struct buf *bp = NULL; @@ -259,8 +260,14 @@ writedisklabel(dev_t dev, void (*strat)( bp = geteblk((int)lp->d_secsize); bp->b_dev = dev; - if (readliflabel(bp, strat, lp, &partoff, 1) != 0 && - readdoslabel(bp, strat, lp, &partoff, 1) != 0) + if (readliflabel(bp, strat, lp, &partoff, 1) == 0) { + bp->b_blkno = partoff + LABELSECTOR; + offset = LABELOFFSET; + } else if (readdoslabel(bp, strat, lp, &partoff, 1) == 0) { + bp->b_blkno = DL_BLKTOSEC(lp, partoff + LABELSECTOR) * + DL_BLKSPERSEC(lp); + offset = DL_BLKOFFSET(lp, partoff + LABELSECTOR) + LABELOFFSET; + } else goto done; /* Read it in, slap the new label in, and write it back out */ @@ -272,7 +279,7 @@ writedisklabel(dev_t dev, void (*strat)( if ((error = biowait(bp)) != 0) goto done; - dlp = (struct disklabel *)(bp->b_data + LABELOFFSET); + dlp = (struct disklabel *)(bp->b_data + offset); *dlp = *lp; CLR(bp->b_flags, B_READ | B_WRITE | B_DONE); SET(bp->b_flags, B_BUSY | B_WRITE | B_RAW); Index: macppc/macppc/disksubr.c =================================================================== RCS file: /cvs/src/sys/arch/macppc/macppc/disksubr.c,v retrieving revision 1.72 diff -u -p -r1.72 disksubr.c --- macppc/macppc/disksubr.c 16 Apr 2011 03:21:15 -0000 1.72 +++ macppc/macppc/disksubr.c 7 Jul 2011 15:19:29 -0000 @@ -194,6 +194,7 @@ int writedisklabel(dev_t dev, void (*strat)(struct buf *), struct disklabel *lp) { int error = EIO, partoff = -1; + int offset; struct disklabel *dlp; struct buf *bp = NULL; @@ -201,12 +202,17 @@ writedisklabel(dev_t dev, void (*strat)( bp = geteblk((int)lp->d_secsize); bp->b_dev = dev; - if (readdpmelabel(bp, strat, lp, &partoff, 1) != 0 && - readdoslabel(bp, strat, lp, &partoff, 1) != 0) + if (readdpmelabel(bp, strat, lp, &partoff, 1) == 0) { + bp->b_blkno = partoff + LABELSECTOR; + offset = LABELOFFSET; + } else if (readdoslabel(bp, strat, lp, &partoff, 1) == 0) { + bp->b_blkno = DL_BLKTOSEC(lp, partoff+LABELSECTOR) * + DL_BLKSPERSEC(lp); + offset = DL_BLKOFFSET(lp, partoff + LABELSECTOR) + LABELOFFSET; + } else goto done; /* Read it in, slap the new label in, and write it back out */ - bp->b_blkno = partoff + LABELSECTOR; bp->b_bcount = lp->d_secsize; CLR(bp->b_flags, B_READ | B_WRITE | B_DONE); SET(bp->b_flags, B_BUSY | B_READ | B_RAW); @@ -214,7 +220,7 @@ writedisklabel(dev_t dev, void (*strat)( if ((error = biowait(bp)) != 0) goto done; - dlp = (struct disklabel *)(bp->b_data + LABELOFFSET); + dlp = (struct disklabel *)(bp->b_data + offset); *dlp = *lp; CLR(bp->b_flags, B_READ | B_WRITE | B_DONE); SET(bp->b_flags, B_BUSY | B_WRITE | B_RAW);