From c37d85679ea23e8ab0deaca0ce618f3d714c3b37 Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Mon, 16 Mar 2015 14:40:57 +0100 Subject: [PATCH] g_eli_ctl_configure: Do not try to read or write metadata for onetime providers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... as it may result in a panic due to garbage data. [599] panic: eli_metadata_encode: Unsupported version 2153383315. [599] cpuid = 1 [599] KDB: stack backtrace: [599] db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe00785d1650 [599] panic() at panic+0x1c1/frame 0xfffffe00785d1710 [599] eli_metadata_encode() at eli_metadata_encode+0xe5/frame 0xfffffe00785d17c0 [599] g_eli_ctl_configure() at g_eli_ctl_configure+0xb14/frame 0xfffffe00785d1b30 [599] g_eli_config() at g_eli_config+0x187/frame 0xfffffe00785d1b70 [599] g_run_events() at g_run_events+0x330/frame 0xfffffe00785d1bb0 [599] fork_exit() at fork_exit+0x9a/frame 0xfffffe00785d1bf0 [599] fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe00785d1bf0 [599] --- trap 0, rip = 0, rsp = 0xfffffe00785d1cb0, rbp = 0 --- [599] KDB: enter: panic [...] ) at pcpu.h:219 219 pcpu.h: No such file or directory. in pcpu.h (kgdb) where (kgdb) where #0 doadump (textdump=Unhandled dwarf expression opcode 0x93 ) at pcpu.h:219 #1 0xffffffff802fb28e in db_dump (dummy=, dummy2=Unhandled dwarf expression opcode 0x93 ) at /usr/src/sys/ddb/db_command.c:533 #2 0xffffffff802fad6c in db_command (cmd_table=0x0) at /usr/src/sys/ddb/db_command.c:440 #3 0xffffffff802faad4 in db_command_loop () at /usr/src/sys/ddb/db_command.c:493 #4 0xffffffff802fd690 in db_trap (type=, code=Unhandled dwarf expression opcode 0x93 ) at /usr/src/sys/ddb/db_main.c:251 #5 0xffffffff805929fe in kdb_trap (type=Unhandled dwarf expression opcode 0x93 ) at /usr/src/sys/kern/subr_kdb.c:654 #6 0xffffffff808215f7 in trap (frame=0xfffffe00785d1580) at /usr/src/sys/amd64/amd64/trap.c:542 #7 0xffffffff80804c02 in calltrap () at /usr/src/sys/amd64/amd64/exception.S:235 #8 0xffffffff805920ee in kdb_enter (why=0xffffffff808efb35 "panic", msg=0x32
) at cpufunc.h:63 #9 0xffffffff8054ed71 in panic (fmt=) at /usr/src/sys/kern/kern_shutdown.c:740 #10 0xffffffff81ba1925 in eli_metadata_encode (md=0xfffffe00785d1928, data=0xfffff800064b5e00 "Cleared Kernel D\223\005Z\200") at g_eli.h:290 #11 0xffffffff81b9eea4 in g_eli_ctl_configure (req=0xfffffe00943dfa20, mp=0xffffffff81baa0c8) at /usr/src/sys/modules/geom/geom_eli/../../../geom/eli/g_eli_ctl.c:521 #12 0xffffffff81b9cfa7 in g_eli_config (req=0xfffffe00943dfa20, mp=0xffffffff81baa0c8, verb=0xfffff8000265bdc0 "configure") at /usr/src/sys/modules/geom/geom_eli/../../../geom/eli/g_eli_ctl.c:1096 #13 0xffffffff8049c8e0 in g_run_events () at /usr/src/sys/geom/geom_event.c:265 #14 0xffffffff80513eda in fork_exit (callout=0xffffffff8049ed40 , arg=0x0, frame=0xfffffe00785d1c00) at /usr/src/sys/kern/kern_fork.c:996 #15 0xffffffff8080513e in fork_trampoline () at /usr/src/sys/amd64/amd64/exception.S:610 #16 0x0000000000000000 in ?? () Current language: auto; currently minimal (kgdb) f 10 #10 0xffffffff81ba1925 in eli_metadata_encode (md=0xfffffe00785d1928, data=0xfffff800064b5e00 "Cleared Kernel D\223\005Z\200") at g_eli.h:290 290 panic("%s: Unsupported version %u.", __func__, (kgdb) p *md $1 = {md_magic = "Cleared Kernel D", md_version = 2153383315, md_flags = 4294967295, md_ealgo = 0, md_keylen = 0, md_aalgo = 0, md_provsize = 18446603931800174592, md_sectorsize = 443613183, md_keys = 93 ']', md_iterations = -130952, md_salt = "ÿ®µY\200ÿÿÿÿ \000\000\000\000\000\000\000 \005Z\200\n\000\000\000\020æ¢\207ÿ\001\000\000D«\212\200ÿÿÿÿ\016ö\215\200ÿÿÿÿ\017ö\215\200ÿÿÿÿ°\032]x\000þÿ", md_mkeys = "ÿ9¥Y\200ÿÿÿÿ", '\0' , "\n\000\000\000Ðå¢\207ÿ\001\000\000~ö\215\200ÿÿÿÿ0\032]x\000\000\000\000ð\032]x\000þÿÿ", '\0' , "\200\000\000\000\000\020\032]x\000þÿÿ&ûW\200ÿÿÿÿ\000\000\000\000\000\000\000\000\000ÅR\201\001\000\000\000\000\000T\002\000øÿÿ\001\000\000\000\000\000\000\000 \032]x\000þÿÿ¿nU\200ÿÿÿÿ\200\032]x\000þÿÿFÜW\200ÿÿÿÿ\0001£/\000øÿÿ\000\000\000\000Ä\000\000P\200»E\201ÿÿÿÿ\000ÅR\201ÿÿÿÿ\001\000\000\000\001\000\000\000\000\000T\002\000øÿÿ", '\0' ..., md_hash = "ÿ\004\000\000\000\000\000\000\000\000\000T\002\000øÿ"} --- sys/geom/eli/g_eli_ctl.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/sys/geom/eli/g_eli_ctl.c b/sys/geom/eli/g_eli_ctl.c index f8caf46..5941545 100644 --- a/sys/geom/eli/g_eli_ctl.c +++ b/sys/geom/eli/g_eli_ctl.c @@ -491,14 +491,16 @@ g_eli_ctl_configure(struct gctl_req *req, struct g_class *mp) continue; } - cp = LIST_FIRST(&sc->sc_geom->consumer); - pp = cp->provider; - error = g_eli_read_metadata(mp, pp, &md); - if (error != 0) { - gctl_error(req, - "Cannot read metadata from %s (error=%d).", - prov, error); - continue; + if (!(sc->sc_flags & G_ELI_FLAG_ONETIME)) { + cp = LIST_FIRST(&sc->sc_geom->consumer); + pp = cp->provider; + error = g_eli_read_metadata(mp, pp, &md); + if (error != 0) { + gctl_error(req, + "Cannot read metadata from %s (error=%d).", + prov, error); + continue; + } } if (*boot) { @@ -517,6 +519,11 @@ g_eli_ctl_configure(struct gctl_req *req, struct g_class *mp) sc->sc_flags &= ~G_ELI_FLAG_DELETE; } + if (sc->sc_flags & G_ELI_FLAG_ONETIME) { + /* There's no metadata on disk so we are done here. */ + continue; + } + sector = malloc(pp->sectorsize, M_ELI, M_WAITOK | M_ZERO); eli_metadata_encode(&md, sector); error = g_write_data(cp, pp->mediasize - pp->sectorsize, sector, -- 2.3.0