summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/softraid.c14
-rw-r--r--sys/dev/softraid_raid1.c3
-rw-r--r--sys/dev/softraidvar.h3
3 files changed, 13 insertions, 7 deletions
diff --git a/sys/dev/softraid.c b/sys/dev/softraid.c
index 90b9f241eaf..665ce959154 100644
--- a/sys/dev/softraid.c
+++ b/sys/dev/softraid.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid.c,v 1.135 2009/06/02 00:58:16 marco Exp $ */
+/* $OpenBSD: softraid.c,v 1.136 2009/06/02 05:49:35 marco Exp $ */
/*
* Copyright (c) 2007 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2008 Chris Kuethe <ckuethe@openbsd.org>
@@ -1799,11 +1799,15 @@ sr_ioctl_setstate(struct sr_softc *sc, struct bioc_setstate *bs)
continue;
sd = sc->sc_dis[i];
- /* XXX check that we can even do a rebuild on this discipline */
+ if (!sd->sd_rebuild) {
+ printf("%s: discipline does not support rebuild\n",
+ DEVNAME(sc));
+ goto done;
+ }
/* make sure volume is in the right state */
if (sd->sd_vol_status == BIOC_SVREBUILD) {
- printf("%s: rebuild already in progres\n", DEVNAME(sc));
+ printf("%s: rebuild already in progress\n", DEVNAME(sc));
goto done;
}
if (sd->sd_vol_status != BIOC_SVDEGRADED) {
@@ -1834,7 +1838,7 @@ sr_ioctl_setstate(struct sr_softc *sc, struct bioc_setstate *bs)
sr_meta_getdevname(sc, dev, devname, sizeof(devname));
bdsw = bdevsw_lookup(dev);
- if (bdsw->d_open(dev, FREAD | FWRITE , S_IFBLK, curproc)) {
+ if (bdsw->d_open(dev, FREAD | FWRITE, S_IFBLK, curproc)) {
DNPRINTF(SR_D_META,"%s: sr_ioctl_setstate can't "
"open %s\n", DEVNAME(sc), devname);
goto done;
@@ -1894,7 +1898,7 @@ sr_ioctl_setstate(struct sr_softc *sc, struct bioc_setstate *bs)
kthread_create_deferred(sr_rebuild, sd);
- break;
+ break; /* all done */
}
rv = 0;
diff --git a/sys/dev/softraid_raid1.c b/sys/dev/softraid_raid1.c
index f705e1befa1..1eda42004e8 100644
--- a/sys/dev/softraid_raid1.c
+++ b/sys/dev/softraid_raid1.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_raid1.c,v 1.10 2009/06/02 00:58:16 marco Exp $ */
+/* $OpenBSD: softraid_raid1.c,v 1.11 2009/06/02 05:49:35 marco Exp $ */
/*
* Copyright (c) 2007 Marco Peereboom <marco@peereboom.us>
*
@@ -59,6 +59,7 @@ sr_raid1_discipline_init(struct sr_discipline *sd)
sd->sd_type = SR_MD_RAID1;
sd->sd_max_ccb_per_wu = sd->sd_meta->ssdi.ssd_chunk_no;
sd->sd_max_wu = SR_RAID1_NOWU;
+ sd->sd_rebuild = 1;
/* Setup discipline pointers. */
sd->sd_alloc_resources = sr_raid1_alloc_resources;
diff --git a/sys/dev/softraidvar.h b/sys/dev/softraidvar.h
index 5c3a72c1ebd..aed9c9eae1e 100644
--- a/sys/dev/softraidvar.h
+++ b/sys/dev/softraidvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraidvar.h,v 1.68 2009/06/02 00:58:16 marco Exp $ */
+/* $OpenBSD: softraidvar.h,v 1.69 2009/06/02 05:49:35 marco Exp $ */
/*
* Copyright (c) 2006 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2008 Chris Kuethe <ckuethe@openbsd.org>
@@ -404,6 +404,7 @@ struct sr_discipline {
struct sr_workunit *sd_wu; /* all workunits */
u_int32_t sd_max_wu;
+ int sd_rebuild; /* can we rebuild? */
struct sr_wu_list sd_wu_freeq; /* free wu queue */
struct sr_wu_list sd_wu_pendq; /* pending wu queue */