summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe
diff options
context:
space:
mode:
authorenami <enami@NetBSD.org>2011-02-19 07:11:09 +0000
committerenami <enami@NetBSD.org>2011-02-19 07:11:09 +0000
commit57a4dce5f228d93be35489c474183fd8be90d938 (patch)
treea0975ad0fc1e88097d407112bcddc8c67cc393ee /sys/dev/raidframe
parent1c8427afe7dd8d40772ae429a8bc02d04ca6360e (diff)
Define accessors for number of blocks and partition size in the
component label and use them where appropriate. Disscussed on tech-kern.
Diffstat (limited to 'sys/dev/raidframe')
-rw-r--r--sys/dev/raidframe/raidframevar.h43
-rw-r--r--sys/dev/raidframe/rf_copyback.c8
-rw-r--r--sys/dev/raidframe/rf_disks.c9
-rw-r--r--sys/dev/raidframe/rf_netbsdkintf.c28
-rw-r--r--sys/dev/raidframe/rf_reconstruct.c9
5 files changed, 68 insertions, 29 deletions
diff --git a/sys/dev/raidframe/raidframevar.h b/sys/dev/raidframe/raidframevar.h
index aea4a7bd373..e146f913158 100644
--- a/sys/dev/raidframe/raidframevar.h
+++ b/sys/dev/raidframe/raidframevar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: raidframevar.h,v 1.14 2010/11/01 02:35:24 mrg Exp $ */
+/* $NetBSD: raidframevar.h,v 1.15 2011/02/19 07:11:09 enami 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;
diff --git a/sys/dev/raidframe/rf_copyback.c b/sys/dev/raidframe/rf_copyback.c
index 423d998772c..0c3fd0fe801 100644
--- a/sys/dev/raidframe/rf_copyback.c
+++ b/sys/dev/raidframe/rf_copyback.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_copyback.c,v 1.44 2010/11/19 06:44:40 dholland Exp $ */
+/* $NetBSD: rf_copyback.c,v 1.45 2011/02/19 07:11:09 enami 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.44 2010/11/19 06:44:40 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_copyback.c,v 1.45 2011/02/19 07:11:09 enami Exp $");
#include <dev/raidframe/raidframevar.h>
@@ -222,8 +222,8 @@ rf_CopybackReconstructedData(RF_Raid_t *raidPtr)
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);
diff --git a/sys/dev/raidframe/rf_disks.c b/sys/dev/raidframe/rf_disks.c
index 4dcb31361b4..cd82b73b81a 100644
--- a/sys/dev/raidframe/rf_disks.c
+++ b/sys/dev/raidframe/rf_disks.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_disks.c,v 1.77 2011/02/13 06:17:35 enami Exp $ */
+/* $NetBSD: rf_disks.c,v 1.78 2011/02/19 07:11:09 enami 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.77 2011/02/13 06:17:35 enami Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_disks.c,v 1.78 2011/02/19 07:11:09 enami Exp $");
#include <dev/raidframe/raidframevar.h>
@@ -455,9 +455,8 @@ rf_AutoConfigureDisks(RF_Raid_t *raidPtr, RF_Config_t *cfgPtr,
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;
diff --git a/sys/dev/raidframe/rf_netbsdkintf.c b/sys/dev/raidframe/rf_netbsdkintf.c
index d2c5f1302a5..36f814792ae 100644
--- a/sys/dev/raidframe/rf_netbsdkintf.c
+++ b/sys/dev/raidframe/rf_netbsdkintf.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_netbsdkintf.c,v 1.281 2011/02/08 20:20:27 rmind Exp $ */
+/* $NetBSD: rf_netbsdkintf.c,v 1.282 2011/02/19 07:11:09 enami Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2008 The NetBSD Foundation, Inc.
@@ -101,7 +101,7 @@
***********************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.281 2011/02/08 20:20:27 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.282 2011/02/19 07:11:09 enami Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -1299,8 +1299,8 @@ raidioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
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);
}
@@ -2949,7 +2949,7 @@ 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_component_label_partitionsize(clabel) <= size)) {
rf_fix_old_label_size(clabel, numsecs);
#ifdef DEBUG
printf("Component on: %s: %llu\n",
@@ -3151,7 +3151,12 @@ rf_reasonable_label(RF_ComponentLabel_t *clabel)
clabel->row < clabel->num_rows &&
clabel->column < clabel->num_columns &&
clabel->blockSize > 0 &&
- clabel->numBlocks > 0) {
+ /*
+ * 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... */
return(1);
}
@@ -3181,9 +3186,9 @@ rf_fix_old_label_size(RF_ComponentLabel_t *clabel, uint64_t numsecs)
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,
@@ -3316,8 +3321,8 @@ rf_does_it_fit(RF_ConfigSet_t *cset, RF_AutoConfig_t *ac)
(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) &&
@@ -3581,8 +3586,7 @@ raid_init_component_label(RF_Raid_t *raidPtr, RF_ComponentLabel_t *clabel)
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;
diff --git a/sys/dev/raidframe/rf_reconstruct.c b/sys/dev/raidframe/rf_reconstruct.c
index d6276dc5e06..f3cc67926bd 100644
--- a/sys/dev/raidframe/rf_reconstruct.c
+++ b/sys/dev/raidframe/rf_reconstruct.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_reconstruct.c,v 1.110 2010/11/19 06:44:40 dholland Exp $ */
+/* $NetBSD: rf_reconstruct.c,v 1.111 2011/02/19 07:11:09 enami 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.110 2010/11/19 06:44:40 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_reconstruct.c,v 1.111 2011/02/19 07:11:09 enami Exp $");
#include <sys/param.h>
#include <sys/time.h>
@@ -297,9 +297,8 @@ rf_ReconstructFailedDiskBasic(RF_Raid_t *raidPtr, RF_RowCol_t col)
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