this patch seems to fix my problem. i've moved the call to fix the label into rf_reasonable_label() itself, right before the valid return, and made the fix up also fix the partitionSizeHi.
greg, what do you think? .mrg. Index: rf_netbsdkintf.c =================================================================== RCS file: /cvsroot/src/sys/dev/raidframe/rf_netbsdkintf.c,v retrieving revision 1.283 diff -p -r1.283 rf_netbsdkintf.c *** rf_netbsdkintf.c 4 Mar 2011 17:45:17 -0000 1.283 --- rf_netbsdkintf.c 18 Mar 2011 09:54:39 -0000 *************** oomem: *** 2950,2956 **** /* Got the label. Does it look reasonable? */ if (rf_reasonable_label(clabel) && (rf_component_label_partitionsize(clabel) <= size)) { - rf_fix_old_label_size(clabel, numsecs); #ifdef DEBUG printf("Component on: %s: %llu\n", cname, (unsigned long long)size); --- 2950,2955 ---- *************** rf_reasonable_label(RF_ComponentLabel_t *** 3155,3161 **** * rf_fix_old_label_size() will fix it. */ rf_component_label_numblocks(clabel) > 0) { ! /* label looks reasonable enough... */ return(1); } return(0); --- 3154,3165 ---- * rf_fix_old_label_size() will fix it. */ rf_component_label_numblocks(clabel) > 0) { ! /* ! * label looks reasonable enough... ! * let's make sure it has no old garbage. ! */ ! rf_fix_old_label_size(clabel, ! rf_component_label_numblocks(clabel)); return(1); } return(0); *************** rf_reasonable_label(RF_ComponentLabel_t *** 3167,3181 **** * the newer numBlocksHi region, and this causes lossage. Since those * disks will also have numsecs set to less than 32 bits of sectors, * we can determine when this corruption has occured, and fix it. */ static void rf_fix_old_label_size(RF_ComponentLabel_t *clabel, uint64_t numsecs) { ! if (clabel->numBlocksHi && numsecs < ((uint64_t)1 << 32)) { ! printf("WARNING: total sectors < 32 bits, yet numBlocksHi set\n" ! "WARNING: resetting numBlocksHi to zero.\n"); ! clabel->numBlocksHi = 0; } } --- 3171,3198 ---- * the newer numBlocksHi region, and this causes lossage. Since those * disks will also have numsecs set to less than 32 bits of sectors, * we can determine when this corruption has occured, and fix it. + * + * The exact same problem, with the same unknown reason, happens to + * the partitionSizeHi member as well. */ static void rf_fix_old_label_size(RF_ComponentLabel_t *clabel, uint64_t numsecs) { ! if (numsecs < ((uint64_t)1 << 32)) { ! if (clabel->numBlocksHi) { ! printf("WARNING: total sectors < 32 bits, yet " ! "numBlocksHi set\n" ! "WARNING: resetting numBlocksHi to zero.\n"); ! clabel->numBlocksHi = 0; ! } ! ! if (clabel->partitionSizeHi) { ! printf("WARNING: total sectors < 32 bits, yet " ! "partitionSizeHi set\n" ! "WARNING: resetting partitionSizeHi to zero.\n"); ! clabel->partitionSizeHi = 0; ! } } }