Module Name: src Committed By: sborrill Date: Wed Jun 13 14:00:49 UTC 2012
Modified Files: src/sbin/raidctl [netbsd-5]: raidctl.c src/sys/dev/raidframe [netbsd-5]: raidframevar.h rf_copyback.c rf_disks.c rf_netbsdkintf.c rf_reconstruct.c Log Message: Pull up the following revisions(s) (requested by mrg in ticket #1774): sbin/raidctl/raidctl.c: revision 1.52 sys/dev/raidframe/raidframevar.h: revision 1.15 sys/dev/raidframe/rf_copyback.c: revision 1.45 sys/dev/raidframe/rf_disks.c: revision 1.78 sys/dev/raidframe/rf_netbsdkintf.c: revision 1.282,1.284 sys/dev/raidframe/rf_reconstruct.c: revision 1.111 Fix garbage values in partitionSizeHi with RAID array > 2TB. Stops the check against rf_component_label_partitionsize() failing and stopping auto-configure. To generate a diff of this commit: cvs rdiff -u -r1.39.4.3 -r1.39.4.4 src/sbin/raidctl/raidctl.c cvs rdiff -u -r1.12.10.2 -r1.12.10.3 src/sys/dev/raidframe/raidframevar.h cvs rdiff -u -r1.41.20.2 -r1.41.20.3 src/sys/dev/raidframe/rf_copyback.c cvs rdiff -u -r1.70.10.4 -r1.70.10.5 src/sys/dev/raidframe/rf_disks.c cvs rdiff -u -r1.250.4.11 -r1.250.4.12 src/sys/dev/raidframe/rf_netbsdkintf.c cvs rdiff -u -r1.105.4.5 -r1.105.4.6 src/sys/dev/raidframe/rf_reconstruct.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/raidctl/raidctl.c diff -u src/sbin/raidctl/raidctl.c:1.39.4.3 src/sbin/raidctl/raidctl.c:1.39.4.4 --- src/sbin/raidctl/raidctl.c:1.39.4.3 Fri Dec 11 09:37:09 2009 +++ src/sbin/raidctl/raidctl.c Wed Jun 13 14:00:48 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: raidctl.c,v 1.39.4.3 2009/12/11 09:37:09 sborrill Exp $ */ +/* $NetBSD: raidctl.c,v 1.39.4.4 2012/06/13 14:00:48 sborrill Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. @@ -39,7 +39,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: raidctl.c,v 1.39.4.3 2009/12/11 09:37:09 sborrill Exp $"); +__RCSID("$NetBSD: raidctl.c,v 1.39.4.4 2012/06/13 14:00:48 sborrill Exp $"); #endif @@ -751,9 +751,9 @@ get_component_label(int fd, char *compon printf(" sectPerSU: %d, SUsPerPU: %d, SUsPerRU: %d\n", component_label.sectPerSU, component_label.SUsPerPU, component_label.SUsPerRU); - printf(" Queue size: %d, blocksize: %d, numBlocks: %u\n", + printf(" Queue size: %d, blocksize: %d, numBlocks: %"PRIu64"\n", component_label.maxOutstanding, component_label.blockSize, - component_label.numBlocks); + rf_component_label_numblocks(&component_label)); printf(" RAID Level: %c\n", (char) component_label.parityConfig); printf(" Autoconfig: %s\n", component_label.autoconfigure ? "Yes" : "No" ); Index: src/sys/dev/raidframe/raidframevar.h diff -u src/sys/dev/raidframe/raidframevar.h:1.12.10.2 src/sys/dev/raidframe/raidframevar.h:1.12.10.3 --- src/sys/dev/raidframe/raidframevar.h:1.12.10.2 Sun Nov 21 22:06:53 2010 +++ src/sys/dev/raidframe/raidframevar.h Wed Jun 13 14:00:49 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: raidframevar.h,v 1.12.10.2 2010/11/21 22:06:53 riz Exp $ */ +/* $NetBSD: raidframevar.h,v 1.12.10.3 2012/06/13 14:00:49 sborrill Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. * All rights reserved. @@ -444,9 +444,9 @@ typedef struct RF_ComponentLabel_s { int maxOutstanding; /* maxOutstanding disk requests */ int blockSize; /* size of component block. (disklabel->d_secsize) */ - u_int numBlocks; /* number of blocks on this component. May + u_int __numBlocks; /* number of blocks on this component. May be smaller than the partition size. */ - u_int partitionSize; /* number of blocks on this *partition*. + u_int __partitionSize;/* number of blocks on this *partition*. Must exactly match the partition size from the disklabel. */ /* Parity map stuff. */ @@ -476,6 +476,43 @@ typedef struct RF_ComponentLabel_s { int future_use2[42]; /* More future expansion */ } RF_ComponentLabel_t; +/* + * Following four functions are access macros for the number of blocks + * and partition size in component label. + */ +static inline RF_SectorCount_t +rf_component_label_numblocks(const RF_ComponentLabel_t *cl) +{ + + return ((RF_SectorCount_t)cl->numBlocksHi << 32) | + cl->__numBlocks; +} + +static inline void +rf_component_label_set_numblocks(RF_ComponentLabel_t *cl, RF_SectorCount_t siz) +{ + + cl->numBlocksHi = siz >> 32; + cl->__numBlocks = siz; +} + +static inline RF_SectorCount_t +rf_component_label_partitionsize(const RF_ComponentLabel_t *cl) +{ + + return ((RF_SectorCount_t)cl->partitionSizeHi << 32) | + cl->__partitionSize; +} + +static inline void +rf_component_label_set_partitionsize(RF_ComponentLabel_t *cl, + RF_SectorCount_t siz) +{ + + cl->partitionSizeHi = siz >> 32; + cl->__partitionSize = siz; +} + typedef struct RF_SingleComponent_s { int row; int column; Index: src/sys/dev/raidframe/rf_copyback.c diff -u src/sys/dev/raidframe/rf_copyback.c:1.41.20.2 src/sys/dev/raidframe/rf_copyback.c:1.41.20.3 --- src/sys/dev/raidframe/rf_copyback.c:1.41.20.2 Sun Nov 21 22:06:53 2010 +++ src/sys/dev/raidframe/rf_copyback.c Wed Jun 13 14:00:49 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_copyback.c,v 1.41.20.2 2010/11/21 22:06:53 riz Exp $ */ +/* $NetBSD: rf_copyback.c,v 1.41.20.3 2012/06/13 14:00:49 sborrill Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -38,7 +38,7 @@ ****************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_copyback.c,v 1.41.20.2 2010/11/21 22:06:53 riz Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_copyback.c,v 1.41.20.3 2012/06/13 14:00:49 sborrill Exp $"); #include <dev/raidframe/raidframevar.h> @@ -212,8 +212,8 @@ rf_CopybackReconstructedData(RF_Raid_t * 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: src/sys/dev/raidframe/rf_disks.c diff -u src/sys/dev/raidframe/rf_disks.c:1.70.10.4 src/sys/dev/raidframe/rf_disks.c:1.70.10.5 --- src/sys/dev/raidframe/rf_disks.c:1.70.10.4 Fri Jan 7 23:25:59 2011 +++ src/sys/dev/raidframe/rf_disks.c Wed Jun 13 14:00:49 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_disks.c,v 1.70.10.4 2011/01/07 23:25:59 riz Exp $ */ +/* $NetBSD: rf_disks.c,v 1.70.10.5 2012/06/13 14:00:49 sborrill Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. * All rights reserved. @@ -60,7 +60,7 @@ ***************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_disks.c,v 1.70.10.4 2011/01/07 23:25:59 riz Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_disks.c,v 1.70.10.5 2012/06/13 14:00:49 sborrill Exp $"); #include <dev/raidframe/raidframevar.h> @@ -452,9 +452,8 @@ rf_AutoConfigureDisks(RF_Raid_t *raidPtr 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: src/sys/dev/raidframe/rf_netbsdkintf.c diff -u src/sys/dev/raidframe/rf_netbsdkintf.c:1.250.4.11 src/sys/dev/raidframe/rf_netbsdkintf.c:1.250.4.12 --- src/sys/dev/raidframe/rf_netbsdkintf.c:1.250.4.11 Fri May 20 19:24:54 2011 +++ src/sys/dev/raidframe/rf_netbsdkintf.c Wed Jun 13 14:00:49 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_netbsdkintf.c,v 1.250.4.11 2011/05/20 19:24:54 bouyer Exp $ */ +/* $NetBSD: rf_netbsdkintf.c,v 1.250.4.12 2012/06/13 14:00:49 sborrill Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -139,7 +139,7 @@ ***********************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.250.4.11 2011/05/20 19:24:54 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.250.4.12 2012/06/13 14:00:49 sborrill Exp $"); #include <sys/param.h> #include <sys/errno.h> @@ -321,7 +321,7 @@ void rf_buildroothack(RF_ConfigSet_t *); RF_AutoConfig_t *rf_find_raid_components(void); RF_ConfigSet_t *rf_create_auto_sets(RF_AutoConfig_t *); static int rf_does_it_fit(RF_ConfigSet_t *,RF_AutoConfig_t *); -static int rf_reasonable_label(RF_ComponentLabel_t *); +static int rf_reasonable_label(RF_ComponentLabel_t *, uint64_t); void rf_create_configuration(RF_AutoConfig_t *,RF_Config_t *, RF_Raid_t *); int rf_set_autoconfig(RF_Raid_t *, int); int rf_set_rootpartition(RF_Raid_t *, int); @@ -1306,8 +1306,8 @@ raidioctl(dev_t dev, u_long cmd, void *d 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); } @@ -2948,9 +2948,8 @@ oomem: if (!raidread_component_label(secsize, dev, vp, clabel)) { /* Got the label. Does it look reasonable? */ - if (rf_reasonable_label(clabel) && - (clabel->partitionSize <= size)) { - rf_fix_old_label_size(clabel, numsecs); + if (rf_reasonable_label(clabel, numsecs) && + (rf_component_label_partitionsize(clabel) <= size)) { #ifdef DEBUG printf("Component on: %s: %llu\n", cname, (unsigned long long)size); @@ -3135,7 +3134,7 @@ rf_find_raid_components() static int -rf_reasonable_label(RF_ComponentLabel_t *clabel) +rf_reasonable_label(RF_ComponentLabel_t *clabel, uint64_t numsecs) { if (((clabel->version==RF_COMPONENT_LABEL_VERSION_1) || @@ -3149,8 +3148,17 @@ rf_reasonable_label(RF_ComponentLabel_t clabel->row < clabel->num_rows && clabel->column < clabel->num_columns && clabel->blockSize > 0 && - clabel->numBlocks > 0) { - /* label looks reasonable enough... */ + /* + * numBlocksHi may contain garbage, but it is ok since + * the type is unsigned. If it is really garbage, + * 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, numsecs); return(1); } return(0); @@ -3162,15 +3170,28 @@ rf_reasonable_label(RF_ComponentLabel_t * 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 (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; + 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; + } } } @@ -3179,9 +3200,9 @@ rf_fix_old_label_size(RF_ComponentLabel_ 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, @@ -3314,8 +3335,8 @@ rf_does_it_fit(RF_ConfigSet_t *cset, RF_ (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) && @@ -3579,8 +3600,7 @@ raid_init_component_label(RF_Raid_t *rai 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: src/sys/dev/raidframe/rf_reconstruct.c diff -u src/sys/dev/raidframe/rf_reconstruct.c:1.105.4.5 src/sys/dev/raidframe/rf_reconstruct.c:1.105.4.6 --- src/sys/dev/raidframe/rf_reconstruct.c:1.105.4.5 Fri Feb 24 17:58:44 2012 +++ src/sys/dev/raidframe/rf_reconstruct.c Wed Jun 13 14:00:49 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_reconstruct.c,v 1.105.4.5 2012/02/24 17:58:44 sborrill Exp $ */ +/* $NetBSD: rf_reconstruct.c,v 1.105.4.6 2012/06/13 14:00:49 sborrill Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -33,7 +33,7 @@ ************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_reconstruct.c,v 1.105.4.5 2012/02/24 17:58:44 sborrill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_reconstruct.c,v 1.105.4.6 2012/06/13 14:00:49 sborrill Exp $"); #include <sys/param.h> #include <sys/time.h> @@ -296,9 +296,8 @@ rf_ReconstructFailedDiskBasic(RF_Raid_t 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