From a9191491be0d3de4e98e74984d9ca2ab0bdcc22f Mon Sep 17 00:00:00 2001 From: xtraeme Date: Sat, 1 Mar 2008 16:33:29 +0000 Subject: [PATCH] RAID 1/1+0 volumes may only be created with foreground initialization, use the quick_init member in the ARC_FW_CREATE_VOLUME command code. You can now create RAID 1/1+0 volumes through bioctl(8), but only one volume will be initialized; the other ones that need initialization will wait until the first is done. --- sys/dev/pci/arcmsr.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/sys/dev/pci/arcmsr.c b/sys/dev/pci/arcmsr.c index 145bb7e6a615..f82873724886 100644 --- a/sys/dev/pci/arcmsr.c +++ b/sys/dev/pci/arcmsr.c @@ -1,4 +1,4 @@ -/* $NetBSD: arcmsr.c,v 1.16 2008/03/01 13:56:46 xtraeme Exp $ */ +/* $NetBSD: arcmsr.c,v 1.17 2008/03/01 16:33:29 xtraeme Exp $ */ /* $OpenBSD: arc.c,v 1.68 2007/10/27 03:28:27 dlg Exp $ */ /* @@ -21,7 +21,7 @@ #include "bio.h" #include -__KERNEL_RCSID(0, "$NetBSD: arcmsr.c,v 1.16 2008/03/01 13:56:46 xtraeme Exp $"); +__KERNEL_RCSID(0, "$NetBSD: arcmsr.c,v 1.17 2008/03/01 16:33:29 xtraeme Exp $"); #include #include @@ -959,6 +959,9 @@ arc_bio_volops(struct arc_softc *sc, struct bioc_volops *bc) req_cvolset.cache = 1; /* always enabled */ req_cvolset.speed = 4; /* always max speed */ + if (bc->bc_level == 1) + req_cvolset.quick_init = 1; /* foreground init */ + error = arc_msgbuf(sc, &req_cvolset, sizeof(req_cvolset), reply, sizeof(reply)); if (error != 0) @@ -971,6 +974,15 @@ arc_bio_volops(struct arc_softc *sc, struct bioc_volops *bc) return error; } + /* + * If we are creating a RAID 1 or RAID 1+0 volume, + * the volume will be created immediately but it won't + * be available until the initialization is done... so + * don't bother attaching the sd(4) device. + */ + if (bc->bc_level == 1) + break; + /* * Do a rescan on the bus to attach the device associated * with the new volume. @@ -1281,6 +1293,11 @@ arc_bio_vol(struct arc_softc *sc, struct bioc_vol *bv) } else if (status & ARC_FW_VOL_STATUS_CHECKING) { bv->bv_status = BIOC_SVCHECKING; bv->bv_percent = htole32(volinfo->progress); + } else if (status & ARC_FW_VOL_STATUS_NEED_INIT) { + bv->bv_status = BIOC_SVOFFLINE; + } else { + printf("%s: volume %d status 0x%x\n", + device_xname(&sc->sc_dev), bv->bv_volid, status); } blocks = (uint64_t)htole32(volinfo->capacity2) << 32; @@ -1839,7 +1856,7 @@ arc_refresh_sensors(struct sysmon_envsys *sme, envsys_data_t *edata) /* Current sensor is handling a volume */ switch (bv.bv_status) { case BIOC_SVOFFLINE: - edata->value_cur = ENVSYS_DRIVE_FAIL; + edata->value_cur = ENVSYS_DRIVE_OFFLINE; edata->state = ENVSYS_SCRITICAL; break; case BIOC_SVDEGRADED: