Module Name:    src
Committed By:   mrg
Date:           Tue Oct 30 00:33:11 UTC 2012

Modified Files:
        src/sys/dev/raidframe: rf_driver.c

Log Message:
fix a problem in half-configured raid devices, found when a "raidctl -c"
failed, and a "raidctl -C" was run afterwards, triggering mutex locking
issues.  fix this by moving alloc and destroy of mutex/condvar for a
raid device into separate functions, and call the destroy function from
the DO_RAID_FAIL() macro.

probably needs a netbsd-6 pullup.  sigh.


To generate a diff of this commit:
cvs rdiff -u -r1.129 -r1.130 src/sys/dev/raidframe/rf_driver.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/raidframe/rf_driver.c
diff -u src/sys/dev/raidframe/rf_driver.c:1.129 src/sys/dev/raidframe/rf_driver.c:1.130
--- src/sys/dev/raidframe/rf_driver.c:1.129	Fri May 27 22:48:24 2011
+++ src/sys/dev/raidframe/rf_driver.c	Tue Oct 30 00:33:11 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_driver.c,v 1.129 2011/05/27 22:48:24 yamt Exp $	*/
+/*	$NetBSD: rf_driver.c,v 1.130 2012/10/30 00:33:11 mrg Exp $	*/
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -66,7 +66,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_driver.c,v 1.129 2011/05/27 22:48:24 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_driver.c,v 1.130 2012/10/30 00:33:11 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_raid_diagnostic.h"
@@ -153,6 +153,8 @@ static RF_ShutdownList_t *globalShutdown
 static int rf_ConfigureRDFreeList(RF_ShutdownList_t ** listp);
 static int rf_AllocEmergBuffers(RF_Raid_t *);
 static void rf_FreeEmergBuffers(RF_Raid_t *);
+static void rf_destroy_mutex_cond(RF_Raid_t *);
+static void rf_alloc_mutex_cond(RF_Raid_t *);
 
 /* called at system boot time */
 int
@@ -255,16 +257,7 @@ rf_Shutdown(RF_Raid_t *raidPtr)
 
 	rf_ShutdownList(&raidPtr->shutdownList);
 
-	rf_destroy_cond2(raidPtr->waitForReconCond);
-	rf_destroy_cond2(raidPtr->adding_hot_spare_cv);
-
-	rf_destroy_mutex2(raidPtr->access_suspend_mutex);
-	rf_destroy_cond2(raidPtr->access_suspend_cv);
-
-	rf_destroy_cond2(raidPtr->outstandingCond);
-	rf_destroy_mutex2(raidPtr->rad_lock);
-
-	rf_destroy_mutex2(raidPtr->mutex);
+	rf_destroy_mutex_cond(raidPtr);
 
 	rf_UnconfigureArray();
 
@@ -289,6 +282,7 @@ rf_Shutdown(RF_Raid_t *raidPtr)
 	rf_FreeEmergBuffers(raidPtr); \
 	rf_ShutdownList(&raidPtr->shutdownList); \
 	rf_UnconfigureArray(); \
+	rf_destroy_mutex_cond(raidPtr); \
 }
 
 #define DO_RAID_INIT_CONFIGURE(f) { \
@@ -341,7 +335,8 @@ rf_Configure(RF_Raid_t *raidPtr, RF_Conf
 	}
 	rf_unlock_mutex2(configureMutex);
 
-	rf_init_mutex2(raidPtr->mutex, IPL_VM);
+	rf_alloc_mutex_cond(raidPtr);
+
 	/* set up the cleanup list.  Do this after ConfigureDebug so that
 	 * value of memDebug will be set */
 
@@ -363,17 +358,9 @@ rf_Configure(RF_Raid_t *raidPtr, RF_Conf
 	DO_RAID_INIT_CONFIGURE(rf_ConfigureEngine);
 	DO_RAID_INIT_CONFIGURE(rf_ConfigureStripeLocks);
 
-	rf_init_cond2(raidPtr->outstandingCond, "rfocond");
-	rf_init_mutex2(raidPtr->rad_lock, IPL_VM);
-
 	raidPtr->nAccOutstanding = 0;
 	raidPtr->waitShutdown = 0;
 
-	rf_init_mutex2(raidPtr->access_suspend_mutex, IPL_VM);
-	rf_init_cond2(raidPtr->access_suspend_cv, "rfquiesce");
-
-	rf_init_cond2(raidPtr->waitForReconCond, "rfrcnw");
-
 	if (ac!=NULL) {
 		/* We have an AutoConfig structure..  Don't do the
 		   normal disk configuration... call the auto config
@@ -406,8 +393,6 @@ rf_Configure(RF_Raid_t *raidPtr, RF_Conf
 	raidPtr->adding_hot_spare = 0;
 	raidPtr->recon_in_progress = 0;
 
-	rf_init_cond2(raidPtr->adding_hot_spare_cv, "raidhs");
-
 	raidPtr->maxOutstanding = cfgPtr->maxOutstandingDiskReqs;
 
 	/* autoconfigure and root_partition will actually get filled in
@@ -925,3 +910,36 @@ rf_print_unable_to_add_shutdown(const ch
 	RF_ERRORMSG3("Unable to add to shutdown list file %s line %d rc=%d\n",
 		     file, line, rc);
 }
+
+static void
+rf_alloc_mutex_cond(RF_Raid_t *raidPtr)
+{
+
+	rf_init_mutex2(raidPtr->mutex, IPL_VM);
+
+	rf_init_cond2(raidPtr->outstandingCond, "rfocond");
+	rf_init_mutex2(raidPtr->rad_lock, IPL_VM);
+
+	rf_init_mutex2(raidPtr->access_suspend_mutex, IPL_VM);
+	rf_init_cond2(raidPtr->access_suspend_cv, "rfquiesce");
+
+	rf_init_cond2(raidPtr->waitForReconCond, "rfrcnw");
+
+	rf_init_cond2(raidPtr->adding_hot_spare_cv, "raidhs");
+}
+
+static void
+rf_destroy_mutex_cond(RF_Raid_t *raidPtr)
+{
+
+	rf_destroy_cond2(raidPtr->waitForReconCond);
+	rf_destroy_cond2(raidPtr->adding_hot_spare_cv);
+
+	rf_destroy_mutex2(raidPtr->access_suspend_mutex);
+	rf_destroy_cond2(raidPtr->access_suspend_cv);
+
+	rf_destroy_cond2(raidPtr->outstandingCond);
+	rf_destroy_mutex2(raidPtr->rad_lock);
+
+	rf_destroy_mutex2(raidPtr->mutex);
+}

Reply via email to