diff options
-rw-r--r-- | sys/dev/softraid.c | 14 | ||||
-rw-r--r-- | sys/dev/softraid_raid1.c | 3 | ||||
-rw-r--r-- | sys/dev/softraidvar.h | 3 |
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 */ |