Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 20 Mar 2014 22:13:48 +0100
From:      Andreas Longwitz <longwitz@incore.de>
To:        freebsd-fs@freebsd.org
Subject:   Kernel crash trying to import a ZFS pool with log device
Message-ID:  <532B5A0C.1010008@incore.de>

next in thread | raw e-mail | index | archive | help
On a maschine running FreeBSD 8.4-STABLE #0 r256119 I have
 loader.conf: vfs.zfs.vdev.bio_delete_disable=1

 -> glabel status
          Name  Status  Components
label/C325BL31     N/A  da2
label/C330CJHW     N/A  da3

 -> gmirror status
         Name    Status  Components
mirror/gmsv09  COMPLETE  da0 (ACTIVE)
                         da1 (ACTIVE)
   mirror/gm0  COMPLETE  da4 (ACTIVE)
                         da5 (ACTIVE)

 -> zpool status
  pool: mpool
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Sat Mar 15 06:15:36 2014
config:

        NAME                STATE     READ WRITE CKSUM
        mpool               ONLINE       0     0     0
          mirror-0          ONLINE       0     0     0
            label/C325BL31  ONLINE       0     0     0
            label/C330CJHW  ONLINE       0     0     0

errors: No known data errors

I can run "zpool export mpool" and "zpool import [mpool]" without any
problems.
After adding a log device from a free partition of a gmirrored disk with
 -> zpool add mpool log /dev/mirror/gm0p3
the pool runs fine and I have
 -> zpool status
  pool: mpool
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Sat Mar 15 06:15:36 2014
config:

        NAME                STATE     READ WRITE CKSUM
        mpool               ONLINE       0     0     0
          mirror-0          ONLINE       0     0     0
            label/C325BL31  ONLINE       0     0     0
            label/C330CJHW  ONLINE       0     0     0
        logs
          mirror/gm0p3      ONLINE       0     0     0

errors: No known data errors

But if I now run "zpool export" and "zpool import" the kernel crashes:
...
vdev_geom_open_by_path:554[1]: Found provider by name /dev/label/C325BL31.
vdev_geom_attach:102[1]: Attaching to label/C325BL31.
g_access(0xffffff0096b23a00(label/C325BL31), 1, 0, 1)
open delta:[r1w0e1] old:[r0w0e0] provider:[r0w0e0]
0xffffff0002c0d400(label/C325BL31)
g_access(0xffffff0002ba7300(da2), 1, 0, 2)
open delta:[r1w0e2] old:[r0w0e0] provider:[r0w0e0] 0xffffff0002a23800(da2)
g_disk_access(da2, 1, 0, 2)
vdev_geom_attach:123[1]: Created geom and consumer for label/C325BL31.
vdev_geom_read_config:248[1]: Reading config from label/C325BL31...
vdev_geom_open_by_path:569[1]: guid match for provider /dev/label/C325BL31.
vdev_geom_open_by_path:554[1]: Found provider by name /dev/label/C330CJHW.
vdev_geom_attach:102[1]: Attaching to label/C330CJHW.
g_access(0xffffff00969a5280(label/C330CJHW), 1, 0, 1)
open delta:[r1w0e1] old:[r0w0e0] provider:[r0w0e0]
0xffffff0002c02100(label/C330CJHW)
g_access(0xffffff0002b96280(da3), 1, 0, 2)
open delta:[r1w0e2] old:[r0w0e0] provider:[r0w0e0] 0xffffff0002a23b00(da3)
g_disk_access(da3, 1, 0, 2)
vdev_geom_attach:143[1]: Created consumer for label/C330CJHW.
vdev_geom_read_config:248[1]: Reading config from label/C330CJHW...
vdev_geom_open_by_path:569[1]: guid match for provider /dev/label/C330CJHW.
vdev_geom_open_by_path:554[1]: Found provider by name /dev/mirror/gm0p3.
vdev_geom_attach:102[1]: Attaching to mirror/gm0p3.
g_access(0xffffff0096b24180(mirror/gm0p3), 1, 0, 1)
open delta:[r1w0e1] old:[r0w0e0] provider:[r0w0e0]
0xffffff00969c7e00(mirror/gm0p3)
g_part_access(mirror/gm0p3,1,0,1)
g_access(0xffffff0096c0f800(mirror/gm0), 1, 0, 1)
open delta:[r1w0e1] old:[r8w8e16] provider:[r8w8e16]
0xffffff00969c7d00(mirror/gm0)
GEOM_MIRROR[2]: Access request for mirror/gm0: r1w0e1.
vdev_geom_attach:143[1]: Created consumer for mirror/gm0p3.
vdev_geom_read_config:248[1]: Reading config from mirror/gm0p3...
vdev_geom_open_by_path:569[1]: guid match for provider /dev/mirror/gm0p3.
g_post_event_x(0xffffffff80b16830, 0xffffff0096b24180, 2, 0)
vdev_geom_detach:163[1]: Closing access to mirror/gm0p3.
g_access(0xffffff0096b24180(mirror/gm0p3), -1, 0, -1)
open delta:[r-1w0e-1] old:[r1w0e1] provider:[r1w0e1]
0xffffff00969c7e00(mirror/gm0p3)
g_part_access(mirror/gm0p3,-1,0,-1)
g_access(0xffffff0096c0f800(mirror/gm0), -1, 0, -1)
open delta:[r-1w0e-1] old:[r9w8e17] provider:[r9w8e17]
0xffffff00969c7d00(mirror/gm0)
GEOM_MIRROR[2]: Access request for mirror/gm0: r-1w0e-1.
vdev_geom_open_by_path:554[1]: Found provider by name /dev/mirror/gm0p3.
vdev_geom_attach:102[1]: Attaching to mirror/gm0p3.
vdev_geom_attach:128[1]: Found consumer for mirror/gm0p3.
g_access(0xffffff0096b24180(mirror/gm0p3), 1, 0, 1)
open delta:[r1w0e1] old:[r1w0e1] provider:[r1w0e1]
0xffffff00969c7e00(mirror/gm0p3)
g_part_access(mirror/gm0p3,1,0,1)
g_access(0xffffff0096c0f800(mirror/gm0), 1, 0, 1)
Open delta:[r1w0e1] old:[r9w8e17] provider:[r9w8e17]
0xffffff00969c7d00(mirror/gm0)
GEOM_MIRROR[2]: Access request for mirror/gm0: r1w0e1.
vdev_geom_detach:167[1]: Destroyed consumer to mirror/gm0p3.
g_detach(0xffffff0096b24180)
g_destroy_consumer(0xffffff0096b24180)
vdev_geom_attach:147[1]: Used existing consumer for mirror/gm0p3.
vdev_geom_read_config:248[1]:

Fatal trap 12: page fault while in kernel mode
cpuid = 1; apic id = 01
fault virtual address   = 0x0
fault code              = supervisor read data, page not present
instruction pointer     = 0x20:0xffffffff80b16f01
stack pointer           = 0x28:0xffffff82452325b0
frame pointer           = 0x28:0xffffff8245232650
code segment            = base 0x0, limit 0xfffff, type 0x1b
                        = DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags        = interrupt enabled, resume, IOPL = 0
current process         = 15494 (initial thread)
[thread pid 15494 tid 100151 ]
Stopped at      vdev_geom_read_config+0x71:     movq    (%rdx),%rsi

(kgdb) where
...
#9  0xffffffff805dce1b in trap (frame=0xffffff8245232500) at
/usr/src/sys/amd64/amd64/trap.c:457
#10 0xffffffff805c3024 in calltrap () at
/usr/src/sys/amd64/amd64/exception.S:228
#11 0xffffffff80b16f01 in vdev_geom_read_config (cp=0xffffff0096b24180,
config=0xffffff8245232670)
    at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c:248
#12 0xffffffff80b17194 in vdev_geom_read_guid (cp=<value optimized out>)
    at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c:454
#13 0xffffffff80b172f0 in vdev_geom_open_by_path (vd=0xffffff0002b2f000,
check_guid=1)
    at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c:559
#14 0xffffffff80b17528 in vdev_geom_open (vd=0xffffff0002b2f000,
psize=0xffffff8245232760, max_psize=0xffffff8245232758,
    ashift=0xffffff8245232750) at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c:608
#15 0xffffffff80aca87a in vdev_open (vd=0xffffff0002b2f000)
    at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c:1153
#16 0xffffffff80acac5e in vdev_reopen (vd=0xffffff0002b2f000)
    at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c:1514
#17 0xffffffff80ab84e0 in spa_load (spa=0xffffff0002b85000,
state=SPA_LOAD_TRYIMPORT, type=SPA_IMPORT_EXISTING,
    mosconfig=<value optimized out>) at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c:1654
#18 0xffffffff80abaa40 in spa_tryimport (tryconfig=0xffffff00024b2260)
    at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c:4184
#19 0xffffffff80afb486 in zfs_ioc_pool_tryimport (zc=0xffffff8001f1d000)
    at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c:1630
#20 0xffffffff80afea7f in zfsdev_ioctl (dev=<value optimized out>,
zcmd=<value optimized out>, arg=0xffffff00966154c0 "\003",
    flag=3, td=<value optimized out>) at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c:5945
#21 0xffffffff8037729b in devfs_ioctl_f (fp=0xffffff0002c98960,
com=3222821382, data=<value optimized out>,
    cred=<value optimized out>, td=0xffffff0096017000) at
/usr/src/sys/fs/devfs/devfs_vnops.c:700
#22 0xffffffff80444b22 in kern_ioctl (td=<value optimized out>,
fd=<value optimized out>, com=3222821382,
    data=0xffffff00966154c0 "\003") at file.h:277
#23 0xffffffff80444d5d in ioctl (td=0xffffff0096017000,
uap=0xffffff8245232bb0) at /usr/src/sys/kern/sys_generic.c:679
#24 0xffffffff805dbca4 in amd64_syscall (td=0xffffff0096017000,
traced=0) at subr_syscall.c:114
#25 0xffffffff805c331c in Xfast_syscall () at
/usr/src/sys/amd64/amd64/exception.S:387
#26 0x0000000180fcec2c in ?? ()

(kgdb) f 11
#11 0xffffffff80b16f01 in vdev_geom_read_config (cp=0xffffff0096b24180,
config=0xffffff8245232670)
    at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c:248
248             ZFS_LOG(1, "Reading config from %s...", pp->name);
(kgdb) list
243             int error, l, len;
244
245             g_topology_assert_not();
246
247             pp = cp->provider;
248             ZFS_LOG(1, "Reading config from %s...", pp->name);
249
250             psize = pp->mediasize;
251             psize = P2ALIGN(psize, (uint64_t)sizeof(vdev_label_t));
252
(kgdb) p *cp
$1 = {geom = 0xffffff0002c0dd00, consumer = {le_next =
0xffffff00969a5280, le_prev = 0xffffff0002c0dd20}, provider = 0x0,
  consumers = {le_next = 0xffffff009607bb00, le_prev =
0xffffff00969c7e20}, acr = 1, acw = 0, ace = 1, spoiled = 0,
  stat = 0xffffff0002bed5a0, nstart = 17, nend = 17, private = 0x0,
index = 0}
(kgdb) p *cp->provider
Cannot access memory at address 0x0

(kgdb) f 12
#12 0xffffffff80b17194 in vdev_geom_read_guid (cp=<value optimized out>)
    at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c:454
454             if (vdev_geom_read_config(cp, &config) == 0) {
(kgdb) p *cp
$2 = {geom = 0xffffff0002c0dd00, consumer = {le_next =
0xffffff00969a5280, le_prev = 0xffffff0002c0dd20}, provider = 0x0,
  consumers = {le_next = 0xffffff009607bb00, le_prev =
0xffffff00969c7e20}, acr = 1, acw = 0, ace = 1, spoiled = 0,
  stat = 0xffffff0002bed5a0, nstart = 17, nend = 17, private = 0x0,
index = 0}
(kgdb) info local
config = (nvlist_t *) 0xffffff0002b85000
guid = 0
(kgdb) list
449             uint64_t guid;
450
451             g_topology_assert_not();
452
453             guid = 0;
454             if (vdev_geom_read_config(cp, &config) == 0) {
455                     guid = nvlist_get_guid(config);
456                     nvlist_free(config);
457             }
458             return (guid);

(kgdb) f 13
#13 0xffffffff80b172f0 in vdev_geom_open_by_path (vd=0xffffff0002b2f000,
check_guid=1)
    at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c:559
559                             guid = vdev_geom_read_guid(cp);
(kgdb) list
554                     ZFS_LOG(1, "Found provider by name %s.",
vd->vdev_path);
555                     cp = vdev_geom_attach(pp);
556                     if (cp != NULL && check_guid &&
ISP2(pp->sectorsize) &&
557                         pp->sectorsize <= VDEV_PAD_SIZE) {
558                             g_topology_unlock();
559                             guid = vdev_geom_read_guid(cp);
560                             g_topology_lock();
561                             if (guid != vd->vdev_guid) {
562                                     vdev_geom_detach(cp, 0);
563                                     cp = NULL;
(kgdb) info local
pp = (struct g_provider *) 0xffffff00969c7e00
cp = (struct g_consumer *) 0xffffff0096b24180
guid = <value optimized out>
__func__ = "ÿÿ\000\000H\213uÀ\211Ø\211\235üþÿÿ\203À\001\205ÀH\213"
(kgdb) p *cp
$3 = {geom = 0xffffff0002c0dd00, consumer = {le_next =
0xffffff00969a5280, le_prev = 0xffffff0002c0dd20}, provider = 0x0,
  consumers = {le_next = 0xffffff009607bb00, le_prev =
0xffffff00969c7e20}, acr = 1, acw = 0, ace = 1, spoiled = 0,
  stat = 0xffffff0002bed5a0, nstart = 17, nend = 17, private = 0x0,
index = 0}
(kgdb) p *pp
$4 = {name = 0xffffff00969c7e88 "mirror/gm0p3", provider = {le_next =
0xffffff009698a100, le_prev = 0xffffff0002c03208},
  geom = 0xffffff0002c68000, consumers = {lh_first =
0xffffff009607bb00}, acr = 1, acw = 0, ace = 1, error = 0, orphan = {
    tqe_next = 0x0, tqe_prev = 0x0}, mediasize = 8589934592, sectorsize
= 512, stripesize = 0, stripeoffset = 226575360,
  stat = 0xffffff0002be7120, nstart = 157, nend = 157, flags = 0,
private = 0xffffff00969c7c00, index = 2}
(kgdb) quit

The technical reason for the crash is that in "f 11" we have pp =
cp->provider = 0.
I can give more information from the kernel dump, also I can easy repeat
the crash.

-- 
Andreas Longwitz




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?532B5A0C.1010008>