Changeset View
Changeset View
Standalone View
Standalone View
head/sys/geom/bde/g_bde.c
Show First 20 Lines • Show All 82 Lines • ▼ Show 20 Lines | g_bde_orphan(struct g_consumer *cp) | ||||
g_trace(G_T_TOPOLOGY, "g_bde_orphan(%p/%s)", cp, cp->provider->name); | g_trace(G_T_TOPOLOGY, "g_bde_orphan(%p/%s)", cp, cp->provider->name); | ||||
g_topology_assert(); | g_topology_assert(); | ||||
gp = cp->geom; | gp = cp->geom; | ||||
sc = gp->softc; | sc = gp->softc; | ||||
gp->flags |= G_GEOM_WITHER; | gp->flags |= G_GEOM_WITHER; | ||||
LIST_FOREACH(pp, &gp->provider, provider) | LIST_FOREACH(pp, &gp->provider, provider) | ||||
g_wither_provider(pp, ENXIO); | g_wither_provider(pp, ENXIO); | ||||
bzero(sc, sizeof(struct g_bde_softc)); /* destroy evidence */ | explicit_bzero(sc, sizeof(struct g_bde_softc)); /* destroy evidence */ | ||||
return; | return; | ||||
} | } | ||||
static int | static int | ||||
g_bde_access(struct g_provider *pp, int dr, int dw, int de) | g_bde_access(struct g_provider *pp, int dr, int dw, int de) | ||||
{ | { | ||||
struct g_geom *gp; | struct g_geom *gp; | ||||
struct g_consumer *cp; | struct g_consumer *cp; | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | do { | ||||
mediasize = cp->provider->mediasize; | mediasize = cp->provider->mediasize; | ||||
sc = g_malloc(sizeof(struct g_bde_softc), M_WAITOK | M_ZERO); | sc = g_malloc(sizeof(struct g_bde_softc), M_WAITOK | M_ZERO); | ||||
gp->softc = sc; | gp->softc = sc; | ||||
sc->geom = gp; | sc->geom = gp; | ||||
sc->consumer = cp; | sc->consumer = cp; | ||||
error = g_bde_decrypt_lock(sc, pass, key, | error = g_bde_decrypt_lock(sc, pass, key, | ||||
mediasize, sectorsize, NULL); | mediasize, sectorsize, NULL); | ||||
bzero(sc->sha2, sizeof sc->sha2); | explicit_bzero(sc->sha2, sizeof sc->sha2); | ||||
if (error) | if (error) | ||||
break; | break; | ||||
kp = &sc->key; | kp = &sc->key; | ||||
/* Initialize helper-fields */ | /* Initialize helper-fields */ | ||||
kp->keys_per_sector = kp->sectorsize / G_BDE_SKEYLEN; | kp->keys_per_sector = kp->sectorsize / G_BDE_SKEYLEN; | ||||
kp->zone_cont = kp->keys_per_sector * kp->sectorsize; | kp->zone_cont = kp->keys_per_sector * kp->sectorsize; | ||||
kp->zone_width = kp->zone_cont + kp->sectorsize; | kp->zone_width = kp->zone_cont + kp->sectorsize; | ||||
Show All 15 Lines | do { | ||||
pp->stripesize = kp->zone_cont; | pp->stripesize = kp->zone_cont; | ||||
pp->stripeoffset = 0; | pp->stripeoffset = 0; | ||||
pp->mediasize = sc->mediasize; | pp->mediasize = sc->mediasize; | ||||
pp->sectorsize = sc->sectorsize; | pp->sectorsize = sc->sectorsize; | ||||
g_error_provider(pp, 0); | g_error_provider(pp, 0); | ||||
break; | break; | ||||
} while (0); | } while (0); | ||||
if (pass != NULL) | if (pass != NULL) | ||||
bzero(pass, SHA512_DIGEST_LENGTH); | explicit_bzero(pass, SHA512_DIGEST_LENGTH); | ||||
if (key != NULL) | if (key != NULL) | ||||
bzero(key, 16); | explicit_bzero(key, 16); | ||||
if (error == 0) | if (error == 0) | ||||
return; | return; | ||||
g_access(cp, -1, -1, -1); | g_access(cp, -1, -1, -1); | ||||
g_detach(cp); | g_detach(cp); | ||||
g_destroy_consumer(cp); | g_destroy_consumer(cp); | ||||
if (gp->softc != NULL) | if (gp->softc != NULL) | ||||
g_free(gp->softc); | g_free(gp->softc); | ||||
g_destroy_geom(gp); | g_destroy_geom(gp); | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | g_bde_destroy_geom(struct gctl_req *req, struct g_class *mp, struct g_geom *gp) | ||||
sc->dead = 1; | sc->dead = 1; | ||||
wakeup(sc); | wakeup(sc); | ||||
g_access(cp, -1, -1, -1); | g_access(cp, -1, -1, -1); | ||||
g_detach(cp); | g_detach(cp); | ||||
g_destroy_consumer(cp); | g_destroy_consumer(cp); | ||||
while (sc->dead != 2 && !LIST_EMPTY(&pp->consumers)) | while (sc->dead != 2 && !LIST_EMPTY(&pp->consumers)) | ||||
tsleep(sc, PRIBIO, "g_bdedie", hz); | tsleep(sc, PRIBIO, "g_bdedie", hz); | ||||
mtx_destroy(&sc->worklist_mutex); | mtx_destroy(&sc->worklist_mutex); | ||||
bzero(&sc->key, sizeof sc->key); | explicit_bzero(&sc->key, sizeof sc->key); | ||||
g_free(sc); | g_free(sc); | ||||
g_wither_geom(gp, ENXIO); | g_wither_geom(gp, ENXIO); | ||||
return (0); | return (0); | ||||
} | } | ||||
static void | static void | ||||
g_bde_ctlreq(struct gctl_req *req, struct g_class *mp, char const *verb) | g_bde_ctlreq(struct gctl_req *req, struct g_class *mp, char const *verb) | ||||
{ | { | ||||
Show All 29 Lines |