Page MenuHomeFreeBSD

D25747.1789734276.diff
No OneTemporary

Size
6 KB
Referenced Files
None
Subscribers
None

D25747.1789734276.diff

Index: sys/geom/eli/g_eli.h
===================================================================
--- sys/geom/eli/g_eli.h
+++ sys/geom/eli/g_eli.h
@@ -164,9 +164,7 @@
struct g_eli_worker {
struct g_eli_softc *w_softc;
struct proc *w_proc;
- void *w_first_key;
u_int w_number;
- crypto_session_t w_sid;
boolean_t w_active;
LIST_ENTRY(g_eli_worker) w_next;
};
@@ -201,6 +199,8 @@
off_t sc_provsize;
u_int sc_bytes_per_sector;
u_int sc_data_per_sector;
+ crypto_session_t sc_sid;
+ void *sc_first_key;
#ifndef _KERNEL
int sc_cpubind;
#else /* _KERNEL */
Index: sys/geom/eli/g_eli.c
===================================================================
--- sys/geom/eli/g_eli.c
+++ sys/geom/eli/g_eli.c
@@ -205,9 +205,9 @@
}
KASSERT(wr != NULL, ("Invalid worker (%u).", bp->bio_pflags));
G_ELI_DEBUG(1, "Rerunning crypto %s request (sid: %p -> %p).",
- bp->bio_cmd == BIO_READ ? "READ" : "WRITE", wr->w_sid,
+ bp->bio_cmd == BIO_READ ? "READ" : "WRITE", sc->sc_sid,
crp->crp_session);
- wr->w_sid = crp->crp_session;
+ sc->sc_sid = crp->crp_session;
crp->crp_etype = 0;
error = crypto_dispatch(crp);
if (error == 0)
@@ -482,16 +482,13 @@
}
static int
-g_eli_newsession(struct g_eli_worker *wr)
+g_eli_newsession(struct g_eli_softc *sc)
{
- struct g_eli_softc *sc;
struct crypto_session_params csp;
uint32_t caps;
int error, new_crypto;
void *key;
- sc = wr->w_softc;
-
memset(&csp, 0, sizeof(csp));
csp.csp_mode = CSP_MODE_CIPHER;
csp.csp_cipher_alg = sc->sc_ealgo;
@@ -516,18 +513,18 @@
switch (sc->sc_crypto) {
case G_ELI_CRYPTO_SW_ACCEL:
case G_ELI_CRYPTO_SW:
- error = crypto_newsession(&wr->w_sid, &csp,
+ error = crypto_newsession(&sc->sc_sid, &csp,
CRYPTOCAP_F_SOFTWARE);
break;
case G_ELI_CRYPTO_HW:
- error = crypto_newsession(&wr->w_sid, &csp,
+ error = crypto_newsession(&sc->sc_sid, &csp,
CRYPTOCAP_F_HARDWARE);
break;
case G_ELI_CRYPTO_UNKNOWN:
- error = crypto_newsession(&wr->w_sid, &csp,
+ error = crypto_newsession(&sc->sc_sid, &csp,
CRYPTOCAP_F_HARDWARE | CRYPTOCAP_F_SOFTWARE);
if (error == 0) {
- caps = crypto_ses2caps(wr->w_sid);
+ caps = crypto_ses2caps(sc->sc_sid);
if (caps & CRYPTOCAP_F_HARDWARE)
new_crypto = G_ELI_CRYPTO_HW;
else if (caps & CRYPTOCAP_F_ACCEL_SOFTWARE)
@@ -548,22 +545,19 @@
if (error)
g_eli_key_drop(sc, key);
else
- wr->w_first_key = key;
+ sc->sc_first_key = key;
}
return (error);
}
static void
-g_eli_freesession(struct g_eli_worker *wr)
+g_eli_freesession(struct g_eli_softc *sc)
{
- struct g_eli_softc *sc;
-
- crypto_freesession(wr->w_sid);
- if (wr->w_first_key != NULL) {
- sc = wr->w_softc;
- g_eli_key_drop(sc, wr->w_first_key);
- wr->w_first_key = NULL;
+ crypto_freesession(sc->sc_sid);
+ if (sc->sc_first_key != NULL) {
+ g_eli_key_drop(sc, sc->sc_first_key);
+ sc->sc_first_key = NULL;
}
}
@@ -614,7 +608,6 @@
struct g_eli_softc *sc;
struct g_eli_worker *wr;
struct bio *bp;
- int error;
wr = arg;
sc = wr->w_softc;
@@ -643,7 +636,6 @@
if (sc->sc_flags & G_ELI_FLAG_DESTROY) {
g_eli_cancel(sc);
LIST_REMOVE(wr, w_next);
- g_eli_freesession(wr);
free(wr, M_ELI);
G_ELI_DEBUG(1, "Thread %s exiting.",
curthread->td_proc->p_comm);
@@ -667,19 +659,13 @@
* Suspend requested, mark the worker as
* suspended and go to sleep.
*/
- if (wr->w_active) {
- g_eli_freesession(wr);
+ if (wr->w_active)
wr->w_active = FALSE;
- }
wakeup(&sc->sc_workers);
msleep(sc, &sc->sc_queue_mtx, PRIBIO,
"geli:suspend", 0);
if (!wr->w_active &&
!(sc->sc_flags & G_ELI_FLAG_SUSPEND)) {
- error = g_eli_newsession(wr);
- KASSERT(error == 0,
- ("g_eli_newsession() failed on resume (error=%d)",
- error));
wr->w_active = TRUE;
}
goto again;
@@ -926,6 +912,18 @@
if (threads == 0)
threads = mp_ncpus;
sc->sc_cpubind = (mp_ncpus > 1 && threads == mp_ncpus);
+ error = g_eli_newsession(sc);
+ if (error != 0) {
+ if (req != NULL) {
+ gctl_error(req, "Cannot set up crypto session "
+ "for %s (error=%d).", bpp->name, error);
+ } else {
+ G_ELI_DEBUG(1, "Cannot set up crypto session "
+ "for %s (error=%d).", bpp->name, error);
+ }
+ goto failed;
+ }
+
for (i = 0; i < threads; i++) {
if (g_eli_cpu_is_disabled(i)) {
G_ELI_DEBUG(1, "%s: CPU %u disabled, skipping.",
@@ -937,23 +935,9 @@
wr->w_number = i;
wr->w_active = TRUE;
- error = g_eli_newsession(wr);
- if (error != 0) {
- free(wr, M_ELI);
- if (req != NULL) {
- gctl_error(req, "Cannot set up crypto session "
- "for %s (error=%d).", bpp->name, error);
- } else {
- G_ELI_DEBUG(1, "Cannot set up crypto session "
- "for %s (error=%d).", bpp->name, error);
- }
- goto failed;
- }
-
error = kproc_create(g_eli_worker, wr, &wr->w_proc, 0, 0,
"g_eli[%u] %s", i, bpp->name);
if (error != 0) {
- g_eli_freesession(wr);
free(wr, M_ELI);
if (req != NULL) {
gctl_error(req, "Cannot create kernel thread "
@@ -999,6 +983,7 @@
msleep(&sc->sc_workers, &sc->sc_queue_mtx, PRIBIO,
"geli:destroy", 0);
}
+ g_eli_freesession(sc);
mtx_destroy(&sc->sc_queue_mtx);
if (cp->provider != NULL) {
if (cp->acr == 1)
@@ -1048,6 +1033,7 @@
msleep(&sc->sc_workers, &sc->sc_queue_mtx, PRIBIO,
"geli:destroy", 0);
}
+ g_eli_freesession(sc);
mtx_destroy(&sc->sc_queue_mtx);
gp->softc = NULL;
g_eli_key_destroy(sc);
Index: sys/geom/eli/g_eli_integrity.c
===================================================================
--- sys/geom/eli/g_eli_integrity.c
+++ sys/geom/eli/g_eli_integrity.c
@@ -497,7 +497,7 @@
#endif
for (i = 1; i <= nsec; i++, dstoff += encr_secsize) {
- crp = crypto_getreq(wr->w_sid, M_WAITOK);
+ crp = crypto_getreq(sc->sc_sid, M_WAITOK);
authkey = (u_char *)p; p += G_ELI_AUTH_SECKEYLEN;
data_secsize = sc->sc_data_per_sector;
Index: sys/geom/eli/g_eli_privacy.c
===================================================================
--- sys/geom/eli/g_eli_privacy.c
+++ sys/geom/eli/g_eli_privacy.c
@@ -263,7 +263,7 @@
data = bp->bio_data;
for (i = 0, dstoff = bp->bio_offset; i < nsec; i++, dstoff += secsize) {
- crp = crypto_getreq(wr->w_sid, M_WAITOK);
+ crp = crypto_getreq(sc->sc_sid, M_WAITOK);
crypto_use_buf(crp, data, secsize);
crp->crp_opaque = (void *)bp;

File Metadata

Mime Type
text/plain
Expires
Fri, Sep 18, 12:24 PM (16 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29748815
Default Alt Text
D25747.1789734276.diff (6 KB)

Event Timeline