From 9b3f3cbf2eefc348664d1f09f07bbbcb607aadde Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Thu, 18 Jul 2019 18:27:05 +0200 Subject: [PATCH 224/325] dsl_dataset_hold_obj: Tolereate zap_lookup() failing with ENXIO Fixes a panic when all the vdevs dissappear while the pool is being imported. panic: solaris assert: zaperr == 0 (0x6 == 0x0), file: /usr/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c, line: 527 cpuid = 1 KDB: stack backtrace: db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe0234aae720 vpanic() at vpanic+0x17e/frame 0xfffffe0234aae780 panic() at panic+0x43/frame 0xfffffe0234aae7e0 assfail3() at assfail3+0x2c/frame 0xfffffe0234aae800 dsl_dataset_hold_obj() at dsl_dataset_hold_obj+0x380/frame 0xfffffe0234aae910 dmu_objset_find_dp_impl() at dmu_objset_find_dp_impl+0x285/frame 0xfffffe0234aae9a0 dmu_objset_find_dp_cb() at dmu_objset_find_dp_cb+0x25/frame 0xfffffe0234aae9c0 taskq_run() at taskq_run+0x10/frame 0xfffffe0234aae9e0 taskqueue_run_locked() at taskqueue_run_locked+0x154/frame 0xfffffe0234aaea40 taskqueue_thread_loop() at taskqueue_thread_loop+0x98/frame 0xfffffe0234aaea70 fork_exit() at fork_exit+0x83/frame 0xfffffe0234aaeab0 fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe0234aaeab0 --- trap 0, rip = 0, rsp = 0, rbp = 0 --- Obtained from: ElectroBSD --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c index f226c0244004..a7c5d8f97a7c 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c @@ -523,7 +523,7 @@ dsl_dataset_hold_obj(dsl_pool_t *dp, uint64_t dsobj, void *tag, DS_FIELD_BOOKMARK_NAMES, sizeof (ds->ds_bookmarks), 1, &ds->ds_bookmarks); - if (zaperr != ENOENT) + if (zaperr != ENOENT && zaperr != ENXIO) VERIFY0(zaperr); } } else { -- 2.32.0