summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe
diff options
context:
space:
mode:
authoroster <oster@NetBSD.org>2000-02-24 23:39:21 +0000
committeroster <oster@NetBSD.org>2000-02-24 23:39:21 +0000
commitbdd659fc7f2082fd88403d4f7658495e3b314d86 (patch)
treec0b3f80134a7a51d5599f52d43548f80257dd1de /sys/dev/raidframe
parenta84d573e155dea7dca4909541eec5339816e30be (diff)
Deal with unconfiguring components in the autoconfigure case.
Diffstat (limited to 'sys/dev/raidframe')
-rw-r--r--sys/dev/raidframe/rf_driver.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/sys/dev/raidframe/rf_driver.c b/sys/dev/raidframe/rf_driver.c
index bc0161cd07e..1908e79c23d 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.30 2000/02/23 03:44:02 oster Exp $ */
+/* $NetBSD: rf_driver.c,v 1.31 2000/02/24 23:39:21 oster Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -296,10 +296,17 @@ rf_UnconfigureVnodes( raidPtr )
for (r = 0; r < raidPtr->numRow; r++) {
for (c = 0; c < raidPtr->numCol; c++) {
printf("Closing vnode for row: %d col: %d\n", r, c);
- if (raidPtr->raid_cinfo[r][c].ci_vp) {
- VOP_UNLOCK(raidPtr->raid_cinfo[r][c].ci_vp, 0);
- (void) vn_close(raidPtr->raid_cinfo[r][c].ci_vp,
- FREAD | FWRITE, p->p_ucred, p);
+ if (raidPtr->raid_cinfo[r][c].ci_vp != NULL) {
+ if (raidPtr->Disks[r][c].auto_configured == 1) {
+ VOP_CLOSE(raidPtr->raid_cinfo[r][c].ci_vp,
+ FREAD, NOCRED, 0);
+ vput(raidPtr->raid_cinfo[r][c].ci_vp);
+
+ } else {
+ VOP_UNLOCK(raidPtr->raid_cinfo[r][c].ci_vp, 0);
+ (void) vn_close(raidPtr->raid_cinfo[r][c].ci_vp,
+ FREAD | FWRITE, p->p_ucred, p);
+ }
raidPtr->raid_cinfo[r][c].ci_vp = NULL;
} else {
printf("vnode was NULL\n");
@@ -310,9 +317,16 @@ rf_UnconfigureVnodes( raidPtr )
for (r = 0; r < raidPtr->numSpare; r++) {
printf("Closing vnode for spare: %d\n", r);
if (raidPtr->raid_cinfo[0][raidPtr->numCol + r].ci_vp) {
- VOP_UNLOCK(raidPtr->raid_cinfo[0][raidPtr->numCol + r].ci_vp, 0);
- (void) vn_close(raidPtr->raid_cinfo[0][raidPtr->numCol + r].ci_vp,
- FREAD | FWRITE, p->p_ucred, p);
+ if (raidPtr->Disks[r][c].auto_configured == 1) {
+ VOP_CLOSE(raidPtr->raid_cinfo[0][raidPtr->numCol +r].ci_vp,
+ FREAD, NOCRED, 0);
+ vput(raidPtr->raid_cinfo[0][raidPtr->numCol +r].ci_vp);
+
+ } else {
+ VOP_UNLOCK(raidPtr->raid_cinfo[0][raidPtr->numCol + r].ci_vp, 0);
+ (void) vn_close(raidPtr->raid_cinfo[0][raidPtr->numCol + r].ci_vp,
+ FREAD | FWRITE, p->p_ucred, p);
+ }
raidPtr->raid_cinfo[0][raidPtr->numCol + r].ci_vp = NULL;
} else {
printf("vnode was NULL\n");