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

Reply via email to