summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/geom/vinum/geom_vinum.c2
-rw-r--r--sys/geom/vinum/geom_vinum_drive.c7
-rw-r--r--sys/geom/vinum/geom_vinum_var.h1
3 files changed, 9 insertions, 1 deletions
diff --git a/sys/geom/vinum/geom_vinum.c b/sys/geom/vinum/geom_vinum.c
index 01ccbcb..7cddd3a 100644
--- a/sys/geom/vinum/geom_vinum.c
+++ b/sys/geom/vinum/geom_vinum.c
@@ -312,6 +312,7 @@ gv_create(struct g_geom *gp, struct gctl_req *req)
gv_config_new_drive(d);
+ d->flags |= GV_DRIVE_NEWBORN;
LIST_INSERT_HEAD(&sc->drives, d, drive);
}
@@ -461,6 +462,7 @@ gv_create(struct g_geom *gp, struct gctl_req *req)
g_destroy_consumer(cp);
} else
gv_save_config(NULL, d, sc);
+ d->flags &= ~GV_DRIVE_NEWBORN;
}
return (0);
diff --git a/sys/geom/vinum/geom_vinum_drive.c b/sys/geom/vinum/geom_vinum_drive.c
index 8027ed2..3bf237f 100644
--- a/sys/geom/vinum/geom_vinum_drive.c
+++ b/sys/geom/vinum/geom_vinum_drive.c
@@ -113,7 +113,12 @@ gv_save_config(struct g_consumer *cp, struct gv_drive *d, struct gv_softc *sc)
KASSERT(d != NULL, ("gv_save_config: null d"));
KASSERT(sc != NULL, ("gv_save_config: null sc"));
- if (d->state != GV_DRIVE_UP)
+ /*
+ * We can't save the config on a drive that isn't up, but drives that
+ * were just created aren't officially up yet, so we check a special
+ * flag.
+ */
+ if ((d->state != GV_DRIVE_UP) && !(d->flags && GV_DRIVE_NEWBORN))
return;
if (cp == NULL) {
diff --git a/sys/geom/vinum/geom_vinum_var.h b/sys/geom/vinum/geom_vinum_var.h
index 47da372..3de2b44 100644
--- a/sys/geom/vinum/geom_vinum_var.h
+++ b/sys/geom/vinum/geom_vinum_var.h
@@ -189,6 +189,7 @@ struct gv_drive {
#define GV_DRIVE_THREAD_ACTIVE 0x01 /* Drive has an active worker thread. */
#define GV_DRIVE_THREAD_DIE 0x02 /* Signal the worker thread to die. */
#define GV_DRIVE_THREAD_DEAD 0x04 /* The worker thread has died. */
+#define GV_DRIVE_NEWBORN 0x08 /* The drive was just created. */
struct gv_hdr *hdr; /* The drive header. */
OpenPOWER on IntegriCloud