summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe
diff options
context:
space:
mode:
authoroster <oster@NetBSD.org>2000-06-04 02:05:13 +0000
committeroster <oster@NetBSD.org>2000-06-04 02:05:13 +0000
commit0b63accce028b7345bb7e11e2c2a8dd0617483d1 (patch)
treeb905bd8bf4d5704de77762c842bdd4c3f194d949 /sys/dev/raidframe
parentbd70b1984f9c7c4b6d29b902ec0d0342ed0beab5 (diff)
Merge rf_update_component_labels() and rf_final_update_component_labels().
Diffstat (limited to 'sys/dev/raidframe')
-rw-r--r--sys/dev/raidframe/rf_driver.c8
-rw-r--r--sys/dev/raidframe/rf_kintf.h8
-rw-r--r--sys/dev/raidframe/rf_netbsdkintf.c119
-rw-r--r--sys/dev/raidframe/rf_reconstruct.c5
4 files changed, 31 insertions, 109 deletions
diff --git a/sys/dev/raidframe/rf_driver.c b/sys/dev/raidframe/rf_driver.c
index 58fc4a28dee..e3f8c0434ec 100644
--- a/sys/dev/raidframe/rf_driver.c
+++ b/sys/dev/raidframe/rf_driver.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_driver.c,v 1.36 2000/05/29 01:43:04 oster Exp $ */
+/* $NetBSD: rf_driver.c,v 1.37 2000/06/04 02:05:13 oster Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -276,7 +276,7 @@ rf_Shutdown(raidPtr)
raidPtr->valid = 0;
- rf_final_update_component_labels(raidPtr);
+ rf_update_component_labels(raidPtr, RF_FINAL_COMPONENT_UPDATE);
rf_UnconfigureVnodes(raidPtr);
@@ -722,7 +722,7 @@ rf_SetReconfiguredMode(raidPtr, row, col)
raidPtr->numFailures++;
raidPtr->Disks[row][col].status = rf_ds_dist_spared;
raidPtr->status[row] = rf_rs_reconfigured;
- rf_update_component_labels(raidPtr);
+ rf_update_component_labels(raidPtr, RF_NORMAL_COMPONENT_UPDATE);
/* install spare table only if declustering + distributed sparing
* architecture. */
if (raidPtr->Layout.map->flags & RF_BD_DECLUSTERED)
@@ -746,7 +746,7 @@ rf_FailDisk(
raidPtr->numFailures++;
raidPtr->Disks[frow][fcol].status = rf_ds_failed;
raidPtr->status[frow] = rf_rs_degraded;
- rf_update_component_labels(raidPtr);
+ rf_update_component_labels(raidPtr, RF_NORMAL_COMPONENT_UPDATE);
RF_UNLOCK_MUTEX(raidPtr->mutex);
if (initRecon)
rf_ReconstructFailedDisk(raidPtr, frow, fcol);
diff --git a/sys/dev/raidframe/rf_kintf.h b/sys/dev/raidframe/rf_kintf.h
index 73e7377d428..f8ba93e56cd 100644
--- a/sys/dev/raidframe/rf_kintf.h
+++ b/sys/dev/raidframe/rf_kintf.h
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_kintf.h,v 1.13 2000/06/04 01:39:49 oster Exp $ */
+/* $NetBSD: rf_kintf.h,v 1.14 2000/06/04 02:05:13 oster Exp $ */
/*
* rf_kintf.h
*
@@ -43,8 +43,10 @@ int rf_DispatchKernelIO(RF_DiskQueue_t * queue, RF_DiskQueueData_t * req);
int raidwrite_component_label(dev_t, struct vnode *, RF_ComponentLabel_t *);
int raidread_component_label(dev_t, struct vnode *, RF_ComponentLabel_t *);
-void rf_update_component_labels( RF_Raid_t *);
-void rf_final_update_component_labels( RF_Raid_t *);
+
+#define RF_NORMAL_COMPONENT_UPDATE 0
+#define RF_FINAL_COMPONENT_UPDATE 1
+void rf_update_component_labels(RF_Raid_t *, int);
int raidlookup(char *, struct proc *, struct vnode **);
int raidmarkclean(dev_t dev, struct vnode *b_vp, int);
int raidmarkdirty(dev_t dev, struct vnode *b_vp, int);
diff --git a/sys/dev/raidframe/rf_netbsdkintf.c b/sys/dev/raidframe/rf_netbsdkintf.c
index 5ab44f135bd..e3f41b1be19 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.90 2000/06/03 16:44:43 oster Exp $ */
+/* $NetBSD: rf_netbsdkintf.c,v 1.91 2000/06/04 02:05:13 oster Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -633,7 +633,8 @@ raidclose(dev, flags, fmt, p)
#if 0
printf("Last one on raid%d. Updating status.\n",unit);
#endif
- rf_final_update_component_labels( raidPtrs[unit] );
+ rf_update_component_labels(raidPtrs[unit],
+ RF_FINAL_COMPONENT_UPDATE);
}
raidunlock(rs);
@@ -1587,7 +1588,8 @@ raidstart(raidPtr)
/* quick check to see if anything has died recently */
RF_LOCK_MUTEX(raidPtr->mutex);
if (raidPtr->numNewFailures > 0) {
- rf_update_component_labels(raidPtr);
+ rf_update_component_labels(raidPtr,
+ RF_NORMAL_COMPONENT_UPDATE);
raidPtr->numNewFailures--;
}
RF_UNLOCK_MUTEX(raidPtr->mutex);
@@ -2327,8 +2329,9 @@ rf_markalldirty(raidPtr)
void
-rf_update_component_labels(raidPtr)
+rf_update_component_labels(raidPtr, final)
RF_Raid_t *raidPtr;
+ int final;
{
RF_ComponentLabel_t clabel;
int sparecol;
@@ -2360,100 +2363,14 @@ rf_update_component_labels(raidPtr)
raidPtr->Disks[r][c].dev,
raidPtr->raid_cinfo[r][c].ci_vp,
&clabel);
- }
- /* else we don't touch it.. */
- }
- }
-
- for( c = 0; c < raidPtr->numSpare ; c++) {
- sparecol = raidPtr->numCol + c;
- if (raidPtr->Disks[0][sparecol].status == rf_ds_used_spare) {
- /*
-
- we claim this disk is "optimal" if it's
- rf_ds_used_spare, as that means it should be
- directly substitutable for the disk it replaced.
- We note that too...
-
- */
-
- for(i=0;i<raidPtr->numRow;i++) {
- for(j=0;j<raidPtr->numCol;j++) {
- if ((raidPtr->Disks[i][j].spareRow ==
- 0) &&
- (raidPtr->Disks[i][j].spareCol ==
- sparecol)) {
- srow = i;
- scol = j;
- break;
+ if (final == RF_FINAL_COMPONENT_UPDATE) {
+ if (raidPtr->parity_good == RF_RAID_CLEAN) {
+ raidmarkclean(
+ raidPtr->Disks[r][c].dev,
+ raidPtr->raid_cinfo[r][c].ci_vp,
+ raidPtr->mod_counter);
}
}
- }
-
- /* XXX shouldn't *really* need this... */
- raidread_component_label(
- raidPtr->Disks[0][sparecol].dev,
- raidPtr->raid_cinfo[0][sparecol].ci_vp,
- &clabel);
- /* make sure status is noted */
-
- raid_init_component_label(raidPtr, &clabel);
-
- clabel.mod_counter = raidPtr->mod_counter;
- clabel.row = srow;
- clabel.column = scol;
- clabel.status = rf_ds_optimal;
-
- raidwrite_component_label(
- raidPtr->Disks[0][sparecol].dev,
- raidPtr->raid_cinfo[0][sparecol].ci_vp,
- &clabel);
- }
- }
- /* printf("Component labels updated\n"); */
-}
-
-
-void
-rf_final_update_component_labels(raidPtr)
- RF_Raid_t *raidPtr;
-{
- RF_ComponentLabel_t clabel;
- int sparecol;
- int r,c;
- int i,j;
- int srow, scol;
-
- srow = -1;
- scol = -1;
-
- /* XXX should do extra checks to make sure things really are clean,
- rather than blindly setting the clean bit... */
-
- raidPtr->mod_counter++;
-
- for (r = 0; r < raidPtr->numRow; r++) {
- for (c = 0; c < raidPtr->numCol; c++) {
- if (raidPtr->Disks[r][c].status == rf_ds_optimal) {
- raidread_component_label(
- raidPtr->Disks[r][c].dev,
- raidPtr->raid_cinfo[r][c].ci_vp,
- &clabel);
- /* make sure status is noted */
- clabel.status = rf_ds_optimal;
- /* bump the counter */
- clabel.mod_counter = raidPtr->mod_counter;
-
- raidwrite_component_label(
- raidPtr->Disks[r][c].dev,
- raidPtr->raid_cinfo[r][c].ci_vp,
- &clabel);
- if (raidPtr->parity_good == RF_RAID_CLEAN) {
- raidmarkclean(
- raidPtr->Disks[r][c].dev,
- raidPtr->raid_cinfo[r][c].ci_vp,
- raidPtr->mod_counter);
- }
}
/* else we don't touch it.. */
}
@@ -2502,10 +2419,12 @@ rf_final_update_component_labels(raidPtr)
raidPtr->Disks[0][sparecol].dev,
raidPtr->raid_cinfo[0][sparecol].ci_vp,
&clabel);
- if (raidPtr->parity_good == RF_RAID_CLEAN) {
- raidmarkclean( raidPtr->Disks[0][sparecol].dev,
- raidPtr->raid_cinfo[0][sparecol].ci_vp,
- raidPtr->mod_counter);
+ if (final == RF_FINAL_COMPONENT_UPDATE) {
+ if (raidPtr->parity_good == RF_RAID_CLEAN) {
+ raidmarkclean( raidPtr->Disks[0][sparecol].dev,
+ raidPtr->raid_cinfo[0][sparecol].ci_vp,
+ raidPtr->mod_counter);
+ }
}
}
}
diff --git a/sys/dev/raidframe/rf_reconstruct.c b/sys/dev/raidframe/rf_reconstruct.c
index b882d70d55c..769879e0648 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.25 2000/05/31 00:52:36 oster Exp $ */
+/* $NetBSD: rf_reconstruct.c,v 1.26 2000/06/04 02:05:13 oster Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
* All rights reserved.
@@ -435,7 +435,8 @@ rf_ReconstructInPlace(raidPtr, row, col)
raidPtr->numFailures++;
raidPtr->Disks[row][col].status = rf_ds_failed;
raidPtr->status[row] = rf_rs_degraded;
- rf_update_component_labels(raidPtr);
+ rf_update_component_labels(raidPtr,
+ RF_NORMAL_COMPONENT_UPDATE);
}
while (raidPtr->reconInProgress) {