diff options
author | pjd <pjd@FreeBSD.org> | 2010-10-22 22:54:26 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2010-10-22 22:54:26 +0000 |
commit | a4a3ac19b48225c5191901d1e7c8985da69e9d66 (patch) | |
tree | 8e93294b3bc9055bbfb259a6907b4101974cbcdc /sys/geom | |
parent | c24b1dbd261e0b6db3b3e6a580ea5866d2058fd8 (diff) | |
download | FreeBSD-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.c | 18 |
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 |