diff options
-rw-r--r-- | sys/geom/vinum/geom_vinum_drive.c | 14 | ||||
-rw-r--r-- | sys/geom/vinum/geom_vinum_plex.c | 11 | ||||
-rw-r--r-- | sys/geom/vinum/geom_vinum_volume.c | 12 |
3 files changed, 32 insertions, 5 deletions
diff --git a/sys/geom/vinum/geom_vinum_drive.c b/sys/geom/vinum/geom_vinum_drive.c index 244e169..279d569 100644 --- a/sys/geom/vinum/geom_vinum_drive.c +++ b/sys/geom/vinum/geom_vinum_drive.c @@ -535,13 +535,21 @@ gv_drive_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) d->freelist_entries = 1; TAILQ_INIT(&d->bqueue); + + /* Save it into the main configuration. */ + LIST_INSERT_HEAD(&sc->drives, d, drive); + } + + /* + * Create a bio queue mutex and a worker thread, if necessary. + */ + if (mtx_initialized(&d->bqueue_mtx) == 0) mtx_init(&d->bqueue_mtx, "gv_drive", NULL, MTX_DEF); + + if (!(d->flags & GV_DRIVE_THREAD_ACTIVE)) { kthread_create(gv_drive_worker, d, NULL, 0, 0, "gv_d %s", d->name); d->flags |= GV_DRIVE_THREAD_ACTIVE; - - /* Save it into the main configuration. */ - LIST_INSERT_HEAD(&sc->drives, d, drive); } g_access(cp, -1, 0, 0); diff --git a/sys/geom/vinum/geom_vinum_plex.c b/sys/geom/vinum/geom_vinum_plex.c index 8fa2923..5e8aafb 100644 --- a/sys/geom/vinum/geom_vinum_plex.c +++ b/sys/geom/vinum/geom_vinum_plex.c @@ -773,6 +773,17 @@ gv_plex_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) if (p->vol_sc != NULL) gv_update_vol_size(p->vol_sc, p->size); + /* + * If necessary, create a bio queue mutex and a worker thread. + */ + if (mtx_initialized(&p->bqueue_mtx) == 0) + mtx_init(&p->bqueue_mtx, "gv_plex", NULL, MTX_DEF); + if (!(p->flags & GV_PLEX_THREAD_ACTIVE)) { + kthread_create(gv_plex_worker, p, NULL, 0, 0, "gv_p %s", + p->name); + p->flags |= GV_PLEX_THREAD_ACTIVE; + } + return (NULL); /* We need to create a new geom. */ diff --git a/sys/geom/vinum/geom_vinum_volume.c b/sys/geom/vinum/geom_vinum_volume.c index 4ace9d2..307cfa8 100644 --- a/sys/geom/vinum/geom_vinum_volume.c +++ b/sys/geom/vinum/geom_vinum_volume.c @@ -314,6 +314,8 @@ gv_volume_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) first = 0; p = gp->softc; + + /* Let's see if the volume this plex wants is already configured. */ v = gv_find_vol(sc, p->volume); if (v == NULL) return (NULL); @@ -325,12 +327,18 @@ gv_volume_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) gp->softc = v; first++; TAILQ_INIT(&v->bqueue); + } else + gp = v->geom; + + /* Create bio queue mutex and worker thread, if necessary. */ + if (mtx_initialized(&v->bqueue_mtx) == 0) mtx_init(&v->bqueue_mtx, "gv_plex", NULL, MTX_DEF); + + if (!(v->flags & GV_VOL_THREAD_ACTIVE)) { kthread_create(gv_vol_worker, v, NULL, 0, 0, "gv_v %s", v->name); v->flags |= GV_VOL_THREAD_ACTIVE; - } else - gp = v->geom; + } /* * Create a new consumer and attach it to the plex geom. Since this |