It looks like there is two place where partitionSizeHi is ignored in
rf_netbsdkintf.c.  I guess we should define access macros for it (and
also for numBlocks) to prevent further mistakes.

The patch below is against netbsd-5 branch.

enami.

Index: raidframevar.h
===================================================================
RCS file: /cvsroot/src/sys/dev/raidframe/raidframevar.h,v
retrieving revision 1.12.10.2
diff -u -r1.12.10.2 raidframevar.h
--- raidframevar.h      21 Nov 2010 22:06:53 -0000      1.12.10.2
+++ raidframevar.h      13 Feb 2011 06:04:27 -0000
@@ -475,6 +475,22 @@
        u_int partitionSizeHi;/* The top 32-bits of the partitionSize member. */
        int future_use2[42];  /* More future expansion */
 } RF_ComponentLabel_t;
+#define        RF_COMPONENT_LABEL_NUMBLOCKS(cl)                        \
+       ((((RF_SectorCount_t)(cl)->numBlocksHi) << 32) |        \
+           (cl)->numBlocks)
+#define        RF_COMPONENT_LABEL_SET_NUMBLOCKS(cl, siz)       \
+       do {                                            \
+               (cl)->numBlocksHi = (siz) >> 32;        \
+               (cl)->numBlocks = (siz);                \
+       } while (0)
+#define        RF_COMPONENT_LABEL_PARTITIONSIZE(cl)                    \
+       ((((RF_SectorCount_t)(cl)->partitionSizeHi) << 32) |    \
+           (cl)->partitionSize)
+#define        RF_COMPONENT_LABEL_SET_PARTITIONSIZE(cl, siz)   \
+       do {                                            \
+               (cl)->partitionSizeHi = (siz) >> 32;    \
+               (cl)->partitionSize = (siz);            \
+       } while (0)
 
 typedef struct RF_SingleComponent_s {
        int row;
Index: rf_copyback.c
===================================================================
RCS file: /cvsroot/src/sys/dev/raidframe/rf_copyback.c,v
retrieving revision 1.41.20.2
diff -u -r1.41.20.2 rf_copyback.c
--- rf_copyback.c       21 Nov 2010 22:06:53 -0000      1.41.20.2
+++ rf_copyback.c       13 Feb 2011 06:04:28 -0000
@@ -212,8 +212,8 @@
 
        c_label->row = 0;
        c_label->column = fcol;
-       c_label->partitionSize = raidPtr->Disks[fcol].partitionSize;
-       c_label->partitionSizeHi = raidPtr->Disks[fcol].partitionSize >> 32;
+       RF_COMPONENT_LABEL_SET_PARTITIONSIZE(c_label,
+           raidPtr->Disks[fcol].partitionSize);
 
        raidflush_component_label(raidPtr, fcol);
 
Index: rf_disks.c
===================================================================
RCS file: /cvsroot/src/sys/dev/raidframe/rf_disks.c,v
retrieving revision 1.70.10.4
diff -u -r1.70.10.4 rf_disks.c
--- rf_disks.c  7 Jan 2011 23:25:59 -0000       1.70.10.4
+++ rf_disks.c  13 Feb 2011 06:04:29 -0000
@@ -452,9 +452,8 @@
                if (ac!=NULL) {
                        /* Found it.  Configure it.. */
                        diskPtr->blockSize = ac->clabel->blockSize;
-                       diskPtr->numBlocks = ac->clabel->numBlocks;
-                       diskPtr->numBlocks |=
-                           (uint64_t)ac->clabel->numBlocksHi << 32;
+                       diskPtr->numBlocks =
+                           RF_COMPONENT_LABEL_NUMBLOCKS(ac->clabel);
                        /* Note: rf_protectedSectors is already
                           factored into numBlocks here */
                        raidPtr->raid_cinfo[c].ci_vp = ac->vp;
Index: rf_netbsdkintf.c
===================================================================
RCS file: /cvsroot/src/sys/dev/raidframe/rf_netbsdkintf.c,v
retrieving revision 1.250.4.10
diff -u -r1.250.4.10 rf_netbsdkintf.c
--- rf_netbsdkintf.c    7 Jan 2011 23:27:51 -0000       1.250.4.10
+++ rf_netbsdkintf.c    13 Feb 2011 06:04:31 -0000
@@ -1304,8 +1304,8 @@
                                ci_label->serial_number = 
                                    raidPtr->serial_number;
                                ci_label->row = 0; /* we dont' pretend to 
support more */
-                               ci_label->partitionSize =
-                                   diskPtr->partitionSize;
+                               RF_COMPONENT_LABEL_SET_PARTITIONSIZE(ci_label,
+                                   diskPtr->partitionSize);
                                ci_label->column = column;
                                raidflush_component_label(raidPtr, column);
                        }
@@ -2947,7 +2947,7 @@
        if (!raidread_component_label(secsize, dev, vp, clabel)) {
                /* Got the label.  Does it look reasonable? */
                if (rf_reasonable_label(clabel) && 
-                   (clabel->partitionSize <= size)) {
+                   (RF_COMPONENT_LABEL_PARTITIONSIZE(clabel) <= size)) {
                        rf_fix_old_label_size(clabel, numsecs);
 #ifdef DEBUG
                        printf("Component on: %s: %llu\n",
@@ -3177,9 +3177,9 @@
 void
 rf_print_component_label(RF_ComponentLabel_t *clabel)
 {
-       uint64_t numBlocks = clabel->numBlocks;
+       uint64_t numBlocks;
 
-       numBlocks |= (uint64_t)clabel->numBlocksHi << 32;
+       numBlocks = RF_COMPONENT_LABEL_NUMBLOCKS(clabel);
 
        printf("   Row: %d Column: %d Num Rows: %d Num Columns: %d\n",
               clabel->row, clabel->column,
@@ -3312,8 +3312,8 @@
            (clabel1->parityConfig == clabel2->parityConfig) &&
            (clabel1->maxOutstanding == clabel2->maxOutstanding) &&
            (clabel1->blockSize == clabel2->blockSize) &&
-           (clabel1->numBlocks == clabel2->numBlocks) &&
-           (clabel1->numBlocksHi == clabel2->numBlocksHi) &&
+           RF_COMPONENT_LABEL_NUMBLOCKS(clabel1) ==
+           RF_COMPONENT_LABEL_NUMBLOCKS(clabel2) &&
            (clabel1->autoconfigure == clabel2->autoconfigure) &&
            (clabel1->root_partition == clabel2->root_partition) &&
            (clabel1->last_unit == clabel2->last_unit) &&
@@ -3577,8 +3577,7 @@
        clabel->SUsPerRU = raidPtr->Layout.SUsPerRU;
 
        clabel->blockSize = raidPtr->bytesPerSector;
-       clabel->numBlocks = raidPtr->sectorsPerDisk;
-       clabel->numBlocksHi = raidPtr->sectorsPerDisk >> 32;
+       RF_COMPONENT_LABEL_SET_NUMBLOCKS(clabel, raidPtr->sectorsPerDisk);
 
        /* XXX not portable */
        clabel->parityConfig = raidPtr->Layout.map->parityConfig;
Index: rf_reconstruct.c
===================================================================
RCS file: /cvsroot/src/sys/dev/raidframe/rf_reconstruct.c,v
retrieving revision 1.105.4.4
diff -u -r1.105.4.4 rf_reconstruct.c
--- rf_reconstruct.c    21 Nov 2010 22:06:53 -0000      1.105.4.4
+++ rf_reconstruct.c    13 Feb 2011 06:04:32 -0000
@@ -296,9 +296,8 @@
                c_label->column = col;
                c_label->clean = RF_RAID_DIRTY;
                c_label->status = rf_ds_optimal;
-               c_label->partitionSize = raidPtr->Disks[scol].partitionSize;
-               c_label->partitionSizeHi =
-                  raidPtr->Disks[scol].partitionSize >> 32;
+               RF_COMPONENT_LABEL_SET_PARTITIONSIZE(c_label,
+                   raidPtr->Disks[scol].partitionSize);
 
                /* We've just done a rebuild based on all the other
                   disks, so at this point the parity is known to be

Reply via email to