bin/182248: [zfs][patch] 'zpool upgrade' abort()s when checking features for a faulted pool

Fabian Keil fk at fabiankeil.de
Fri Sep 20 15:00:01 UTC 2013


>Number:         182248
>Category:       bin
>Synopsis:       [zfs][patch] 'zpool upgrade' abort()s when checking features for a faulted pool
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Sep 20 15:00:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Fabian Keil
>Release:        HEAD
>Organization:
>Environment:
FreeBSD r500.local 10.0-ALPHA2 FreeBSD 10.0-ALPHA2 #599 r255627+28ad33b: Tue Sep 17 22:44:20 CEST 2013     fk at r500.local:/usr/obj/usr/src/sys/ZOEY  amd64

>Description:
'zpool upgrade' abort()s when checking features for a faulted pool whose metadata isn't available.
>How-To-Repeat:
Import pool, unplug vdev to get an UNAVAILable pool, reboot system to lose cached metadata resulting in a FAULTED pool, run "zpool upgrade":

fk at r500 ~ $zpool list qualipso
NAME       SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
qualipso      -      -      -      -      -  FAULTED  -
fk at r500 ~ $gdb76 --args zpool upgrade
[...]
(gdb) r
Starting program: /sbin/zpool upgrade
[New LWP 100908]
This system supports ZFS pool feature flags.

All pools are formatted using feature flags.

Assertion failed: (nvlist_lookup_nvlist(config, "feature_stats", &features) == 0), file /usr/src/cddl/lib/libzfs/../../../cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c, line 250.
[New Thread 802c06400 (LWP 100908)]

Program received signal SIGABRT, Aborted.
[Switching to Thread 802c06400 (LWP 100908)]
kill () at kill.S:3
3	RSYSCALL(kill)
(gdb) where
#0  kill () at kill.S:3
#1  0x00000008019e33e6 in __raise (s=6) at /usr/src/lib/libc/gen/raise.c:45
#2  0x00000008019e2169 in abort () at /usr/src/lib/libc/stdlib/abort.c:65
#3  0x0000000801690140 in __assert (expr=<optimized out>, file=<optimized out>, line=<optimized out>) at /usr/src/cddl/lib/libzfs/../../../cddl/compat/opensolaris/include/assert.h:56
#4  0x000000080168fe95 in zpool_get_features (zhp=<optimized out>) at /usr/src/cddl/lib/libzfs/../../../cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c:249
#5  0x000000000040bc4a in upgrade_list_disabled_cb (zhp=0x802c6eb40, arg=0x7fffffffc4f8) at /usr/src/cddl/sbin/zpool/../../../cddl/contrib/opensolaris/cmd/zpool/zpool_main.c:4681
#6  0x00000008016901dd in zpool_iter (hdl=0x802c1a200, func=0x40bc00 <upgrade_list_disabled_cb>, data=0x7fffffffc4f8)
    at /usr/src/cddl/lib/libzfs/../../../cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c:415
#7  0x000000000040aeaa in zpool_do_upgrade (argc=<optimized out>, argv=0x7fffffffd8a0) at /usr/src/cddl/sbin/zpool/../../../cddl/contrib/opensolaris/cmd/zpool/zpool_main.c:4956
#8  0x00000000004074d1 in main (argc=<optimized out>, argv=<optimized out>) at /usr/src/cddl/sbin/zpool/../../../cddl/contrib/opensolaris/cmd/zpool/zpool_main.c:5360
´(gdb) f 5
#5  0x000000000040bc4a in upgrade_list_disabled_cb (zhp=0x802c6eb40, arg=0x7fffffffc4f8) at /usr/src/cddl/sbin/zpool/../../../cddl/contrib/opensolaris/cmd/zpool/zpool_main.c:4681
4681			nvlist_t *enabled = zpool_get_features(zhp);
(gdb) p *zhp
$1 = {zpool_hdl = 0x802c1a200, zpool_next = 0x0, zpool_name = "qualipso", '\000' <repeats 247 times>, zpool_state = 6, zpool_config_size = 1740, zpool_config = 0x802c5b140, zpool_old_config = 0x802c5b120, 
  zpool_props = 0x0, zpool_start_block = 0}

I doubt that it matters, but I'm using zogftw, which means geli and glabel are involved, too, and there is only a single vdev.
>Fix:
The attached patch prevents the core dumps for me, it could be argued that not complaining about the FAULTED pool isn't ideal, though:

fk at r500 ~ $zpool list qualipso
NAME       SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
qualipso      -      -      -      -      -  FAULTED  -
fk at r500 ~ $zpool upgrade
This system supports ZFS pool feature flags.

All pools are formatted using feature flags.

Every feature flags pool has all supported features enabled.


Patch attached with submission follows:

>From 055667eac6d16bbdef719ec26ffeaff97b85ab09 Mon Sep 17 00:00:00 2001
From: Fabian Keil <fk at fabiankeil.de>
Date: Mon, 8 Apr 2013 18:40:36 +0200
Subject: [PATCH] Skip unavailable pools in upgrade_list_*_cb()

zpool_get_features() isn't supposed to be used on
unavailable pools:

fk at r500 ~ $zpool upgrade
This system supports ZFS pool feature flags.

All pools are formatted using feature flags.

Assertion failed: (nvlist_lookup_nvlist(config, "feature_stats", &features) == 0), file /usr/src/cddl/lib/libzfs/../../../cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c, line 250.
Abort trap (core dumped)
---
 cddl/contrib/opensolaris/cmd/zpool/zpool_main.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c b/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
index 0dcf11b..98a179e 100644
--- a/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
+++ b/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
@@ -4638,6 +4638,10 @@ upgrade_list_older_cb(zpool_handle_t *zhp, void *arg)
 	nvlist_t *config;
 	uint64_t version;
 
+	if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
+		return (0);
+	}
+
 	config = zpool_get_config(zhp, NULL);
 	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
 	    &version) == 0);
@@ -4671,6 +4675,10 @@ upgrade_list_disabled_cb(zpool_handle_t *zhp, void *arg)
 	nvlist_t *config;
 	uint64_t version;
 
+	if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
+		return (0);
+	}
+
 	config = zpool_get_config(zhp, NULL);
 	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
 	    &version) == 0);
-- 
1.8.4



>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list