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);