[Bug 220916] kernel panic when reboot -r to zfs root because ASSERT(spa->spa_state == POOL_STATE_UNINITIALIZED); is triggered in spa_remove()

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Sat Jul 22 01:17:04 UTC 2017


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=220916

            Bug ID: 220916
           Summary: kernel panic when reboot -r to zfs root because
                    ASSERT(spa->spa_state == POOL_STATE_UNINITIALIZED); is
                    triggered in spa_remove()
           Product: Base System
           Version: CURRENT
          Hardware: arm64
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: kern
          Assignee: freebsd-bugs at FreeBSD.org
          Reporter: wheelcomplex at gmail.com

git 66cab836b0e5b1e7ba73227c4ddf58a8cb7c668a

When test reboot -r (switch root filesystem to new one from userspace) with zfs
root, ASSERT is triggered in spa_remove().

Reproduce:

1. boot into rescue shell(or normal system).
2. import/create other zfs pool(for example pi3tank), a spa registered.
3. create/refresh dataset for new root filesystem: pi3tank/bsdrootfs.
4. zpool export pi3tank
5. kenv vfs.root.mountfrom=zfs:pi3tank/bsdrootfs && reboot -r
6. ASSERT panic ...

Analyse:

In spa_import_rootpool (sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c:
4062), spa_unload and spa_deactivate should be called for a zfs pool with
spa->spa_state != POOL_STATE_UNINITIALIZED although this zfs pool has been
exported.

Fix(works for me):

--- cut here ---
---
/home/david/sandspace/private-freebsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c.orig
+++
/home/david/sandspace/private-freebsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
@@ -4079,6 +4079,10 @@
                 * Remove the existing root pool from the namespace so that we
                 * can replace it with the correct config we just read in.
                 */
+               if (spa->spa_state != POOL_STATE_UNINITIALIZED) {
+                       spa_unload(spa);
+                       spa_deactivate(spa);
+               }
                spa_remove(spa);
        }

@@ -4294,6 +4298,10 @@
                         * that we can replace it with the correct config
                         * we just read in.
                         */
+                       if (spa->spa_state != POOL_STATE_UNINITIALIZED) {
+                               spa_unload(spa);
+                               spa_deactivate(spa);
+                       }
                        spa_remove(spa);
                }
                spa = spa_add(pname, config, NULL);
--- cut here ---

ASSERT panic information:

Trying to mount root from zfs:pi3tank/bsdrootfs []...
panic: solaris assert: spa->spa_state == POOL_STATE_UNINITIALIZED, file:
/home/david/sandspace/private-freebsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c,
line: 805
cpuid = 2
time = 318
KDB: stack backtrace:
db_trace_self() at db_trace_self_wrapper+0x28
         pc = 0xffff000000747b80  lr = 0xffff00000018ce8c
         sp = 0xffff000078bbcd50  fp = 0xffff000078bbcf60

db_trace_self_wrapper() at vpanic+0x184
         pc = 0xffff00000018ce8c  lr = 0xffff0000004373a8
         sp = 0xffff000078bbcf70  fp = 0xffff000078bbcff0

vpanic() at panic+0x48
         pc = 0xffff0000004373a8  lr = 0xffff000000437434
         sp = 0xffff000078bbd000  fp = 0xffff000078bbd080

panic() at assfail+0x28
         pc = 0xffff000000437434  lr = 0xffff000000043378
         sp = 0xffff000078bbd090  fp = 0xffff000078bbd090

assfail() at spa_remove+0x6c
         pc = 0xffff000000043378  lr = 0xffff0000000d0a80
         sp = 0xffff000078bbd0a0  fp = 0xffff000078bbd0d0

spa_remove() at spa_import_rootpool+0x658
         pc = 0xffff0000000d0a80  lr = 0xffff0000000c46d8
         sp = 0xffff000078bbd0e0  fp = 0xffff000078bbd180

spa_import_rootpool() at zfs_mount+0x384
         pc = 0xffff0000000c46d8  lr = 0xffff000000112bec
         sp = 0xffff000078bbd190  fp = 0xffff000078bbd340

zfs_mount() at vfs_donmount+0xcfc
         pc = 0xffff000000112bec  lr = 0xffff0000004ec35c
         sp = 0xffff000078bbd350  fp = 0xffff000078bbd590

vfs_donmount() at kernel_mount+0x58
         pc = 0xffff0000004ec35c  lr = 0xffff0000004eef7c
         sp = 0xffff000078bbd5a0  fp = 0xffff000078bbd5f0

kernel_mount() at parse_mount+0x39c
         pc = 0xffff0000004eef7c  lr = 0xffff0000004f1578
         sp = 0xffff000078bbd600  fp = 0xffff000078bbd750

parse_mount() at vfs_mountroot+0x574
         pc = 0xffff0000004f1578  lr = 0xffff0000004ef93c
         sp = 0xffff000078bbd760  fp = 0xffff000078bbd920

vfs_mountroot() at sys_reboot+0x2bc
         pc = 0xffff0000004ef93c  lr = 0xffff0000004368dc
         sp = 0xffff000078bbd930  fp = 0xffff000078bbd9a0

sys_reboot() at do_el0_sync+0x884
         pc = 0xffff0000004368dc  lr = 0xffff0000007611bc
         sp = 0xffff000078bbd9b0  fp = 0xffff000078bbda70

do_el0_sync() at handle_el0_sync+0x74
         pc = 0xffff0000007611bc  lr = 0xffff0000007499f4
         sp = 0xffff000078bbda80  fp = 0xffff000078bbdb90

handle_el0_sync() at 0x30d9c
         pc = 0xffff0000007499f4  lr = 0x0000000000030d9c
         sp = 0xffff000078bbdba0  fp = 0x0000ffffffffe7f0

KDB: enter: panic
[ thread pid 1 tid 100002 ]
Stopped at      kdb_enter+0x40: undefined       d4200000
db>

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-bugs mailing list