summaryrefslogtreecommitdiffstats
path: root/sys/geom
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2010-10-22 22:54:26 +0000
committerpjd <pjd@FreeBSD.org>2010-10-22 22:54:26 +0000
commita4a3ac19b48225c5191901d1e7c8985da69e9d66 (patch)
tree8e93294b3bc9055bbfb259a6907b4101974cbcdc /sys/geom
parentc24b1dbd261e0b6db3b3e6a580ea5866d2058fd8 (diff)
downloadFreeBSD-src-a4a3ac19b48225c5191901d1e7c8985da69e9d66.zip
FreeBSD-src-a4a3ac19b48225c5191901d1e7c8985da69e9d66.tar.gz
Close a race between checking if device is already suspended and suspending it.
Diffstat (limited to 'sys/geom')
-rw-r--r--sys/geom/eli/g_eli_ctl.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/sys/geom/eli/g_eli_ctl.c b/sys/geom/eli/g_eli_ctl.c
index f1dbfbd..cad962d 100644
--- a/sys/geom/eli/g_eli_ctl.c
+++ b/sys/geom/eli/g_eli_ctl.c
@@ -840,10 +840,6 @@ g_eli_ctl_resume(struct gctl_req *req, struct g_class *mp)
gctl_error(req, "Provider %s is invalid.", name);
return;
}
- if (!(sc->sc_flags & G_ELI_FLAG_SUSPEND)) {
- gctl_error(req, "Provider %s not suspended.", name);
- return;
- }
cp = LIST_FIRST(&sc->sc_geom->consumer);
pp = cp->provider;
error = g_eli_read_metadata(mp, pp, &md);
@@ -880,14 +876,18 @@ g_eli_ctl_resume(struct gctl_req *req, struct g_class *mp)
G_ELI_DEBUG(1, "Using Master Key %u for %s.", nkey, pp->name);
mtx_lock(&sc->sc_queue_mtx);
- /* Restore sc_mkey, sc_ekeys, sc_akey and sc_ivkey. */
- g_eli_mkey_propagate(sc, mkey);
- sc->sc_flags &= ~G_ELI_FLAG_SUSPEND;
+ if (!(sc->sc_flags & G_ELI_FLAG_SUSPEND))
+ gctl_error(req, "Device %s is not suspended.", name);
+ else {
+ /* Restore sc_mkey, sc_ekeys, sc_akey and sc_ivkey. */
+ g_eli_mkey_propagate(sc, mkey);
+ sc->sc_flags &= ~G_ELI_FLAG_SUSPEND;
+ G_ELI_DEBUG(1, "Resumed %s.", pp->name);
+ wakeup(sc);
+ }
mtx_unlock(&sc->sc_queue_mtx);
bzero(mkey, sizeof(mkey));
bzero(&md, sizeof(md));
- G_ELI_DEBUG(1, "Resumed %s.", pp->name);
- wakeup(sc);
}
static int
OpenPOWER on IntegriCloud