diff --git a/sys/geom/vinum/geom_vinum_init.c b/sys/geom/vinum/geom_vinum_init.c index 382ea1572b0..60c408c6839 100644 --- a/sys/geom/vinum/geom_vinum_init.c +++ b/sys/geom/vinum/geom_vinum_init.c @@ -127,6 +127,7 @@ void gv_start_vol(struct gv_volume *v) { struct gv_plex *p; + struct gv_sd *s; KASSERT(v != NULL, ("gv_start_vol: NULL v")); @@ -145,6 +146,11 @@ gv_start_vol(struct gv_volume *v) default: return; } + } else { + LIST_FOREACH(s, &p->subdisks, in_plex) { + gv_set_sd_state(s, GV_SD_UP, + GV_SETSTATE_CONFIG); + } } } else gv_sync(v); diff --git a/sys/geom/vinum/geom_vinum_state.c b/sys/geom/vinum/geom_vinum_state.c index 2f9ad596c28..4e1710815df 100644 --- a/sys/geom/vinum/geom_vinum_state.c +++ b/sys/geom/vinum/geom_vinum_state.c @@ -138,10 +138,22 @@ gv_set_sd_state(struct gv_sd *s, int newstate, int flags) case GV_SD_STALE: /* - * A stale subdisk can't be brought up directly, it - * needs to be revived or initialized first. + * A stale subdisk can be brought up only if it's part + * of a concat or striped plex that's the only one in a + * volume, or if the subdisk isn't attached to a plex. + * Otherwise it needs to be revived or initialized + * first. */ - /* FALLTHROUGH */ + p = s->plex_sc; + if (p == NULL) + break; + + if ((p->org != GV_PLEX_RAID5) && + (p->vol_sc->plexcount == 1)) + break; + else + return (-1); + default: return (-1); }