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