summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe
diff options
context:
space:
mode:
authormlelstv <mlelstv@NetBSD.org>2016-01-04 13:15:17 +0000
committermlelstv <mlelstv@NetBSD.org>2016-01-04 13:15:17 +0000
commit6dfa6b4dddec1a24e432b36de078a77b362774db (patch)
treeda988c576ab92f24c5c175ddd320ee5aa87e3eb4 /sys/dev/raidframe
parentf78a006601d972bd26235d0ea88ee1bdee54ac68 (diff)
prevent unconfigure/detach while background threads are running.
Diffstat (limited to 'sys/dev/raidframe')
-rw-r--r--sys/dev/raidframe/rf_netbsdkintf.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/dev/raidframe/rf_netbsdkintf.c b/sys/dev/raidframe/rf_netbsdkintf.c
index 7527e3ca40d..7f23ccc59ac 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.336 2016/01/04 11:12:40 mlelstv Exp $ */
+/* $NetBSD: rf_netbsdkintf.c,v 1.337 2016/01/04 13:15:17 mlelstv Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2008-2011 The NetBSD Foundation, Inc.
@@ -101,7 +101,7 @@
***********************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.336 2016/01/04 11:12:40 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.337 2016/01/04 13:15:17 mlelstv Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -967,7 +967,10 @@ raid_detach_unlocked(struct raid_softc *rs)
raidPtr = &rs->sc_r;
- if (DK_BUSY(dksc, 0))
+ if (DK_BUSY(dksc, 0) ||
+ raidPtr->recon_in_progress != 0 ||
+ raidPtr->parity_rewrite_in_progress != 0 ||
+ raidPtr->copyback_in_progress != 0)
return EBUSY;
if ((rs->sc_flags & RAIDF_INITED) == 0)
@@ -1180,7 +1183,10 @@ raidioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
if ((error = raidlock(rs)) != 0)
return (error);
- if (DK_BUSY(dksc, pmask))
+ if (DK_BUSY(dksc, pmask) ||
+ raidPtr->recon_in_progress != 0 ||
+ raidPtr->parity_rewrite_in_progress != 0 ||
+ raidPtr->copyback_in_progress != 0)
retcode = EBUSY;
else {
/* detach and free on close */