summaryrefslogtreecommitdiffstats
path: root/sys/geom/vinum
diff options
context:
space:
mode:
authorle <le@FreeBSD.org>2005-08-15 17:07:47 +0000
committerle <le@FreeBSD.org>2005-08-15 17:07:47 +0000
commite3eb852545c7f5143756c06dd425a23c0638c08f (patch)
tree812ca879932f3713168f4e345bbff859600114b6 /sys/geom/vinum
parent34de5b0fcf9a9858014aacce272e8c7f00b37b92 (diff)
downloadFreeBSD-src-e3eb852545c7f5143756c06dd425a23c0638c08f.zip
FreeBSD-src-e3eb852545c7f5143756c06dd425a23c0638c08f.tar.gz
Fix a stupid logic bug introduced in geom_vinum_drive.c rev 1.18:
When a drive is newly created, it's state is initially set to 'down', so it won't allow saving the config to it (thus it will never know of itself being created). Work around this by adding a new flag, that's also checked when saving the config to a drive.
Diffstat (limited to 'sys/geom/vinum')
-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