]> granicus.if.org Git - zfs/commitdiff
OpenZFS 9084 - spa_*_ashift must ignore spare devices
authorPrakash Surya <prakash.surya@delphix.com>
Fri, 16 Feb 2018 16:17:06 +0000 (08:17 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Sat, 14 Apr 2018 19:40:52 +0000 (12:40 -0700)
It's possible for the following assertion to be tripped when
running ztest:

    assertion failed for thread 0xf09fca40, thread-id 549:
    spa->spa_max_ashift == spa->spa_min_ashift (0xc == 0x9),
    file ../../../uts/common/fs/zfs/vdev_removal.c, line 965

    > $c
    libc.so.1`_lwp_kill+7(ebdde6c0ebdde6c0, a9, fee7865e)
    libc.so.1`_assfail+0x214(ebddea28fed7ac3c, 3c5, fef62000)
    libc.so.1`assfail3+0xde(fed7b130, c, 0, fed812cb, 9, 0)
    libzpool.so.1`spa_vdev_copy_impl+0x26b(89a4b40ebddef74,
        ebddef688992dc0ebe10a00fef073c0)
    libzpool.so.1`spa_vdev_remove_thread+0x6cd(87450c0, 0, 0, fee8f43a)
    libc.so.1`_thrp_setup+0x8c(f09fca40)
    libc.so.1`_lwp_start(f09fca40, 0, 0, 0, 0, 0)

    > ::spa -v
    ADDR         STATE NAME
    08723000    ACTIVE ztest

        ADDR     STATE     AUX          DESCRIPTION
        087466c0 HEALTHY   -            root
        087450c0 HEALTHY   -              /rpool/tmp/ztest.0a
        08745640 HEALTHY   -              indirect
        08745bc0 HEALTHY   -              /rpool/tmp/ztest.2a
        08746140 HEALTHY   -              /rpool/tmp/ztest.3a
        -        -         -            spares
        08744b40 HEALTHY   -              /rpool/tmp/ztest.spares.0

Authored by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Prashanth Sreenivasa <pks@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Approved by: Dan McDonald <danmcd@joyent.com>
Ported-by: Tim Chase <tim@chase2k.com>
OpenZFS-issue: https://www.illumos.org/issues/9084
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/18acba7
Closes #6900

module/zfs/vdev.c

index 0dea0b4e456bf5742543a77d6384542df7df1475..9fc25dd6a0771d52ba271ea78dc76b12692d5fa5 100644 (file)
@@ -1544,14 +1544,6 @@ vdev_open(vdev_t *vd)
                return (error);
        }
 
-       if (vd->vdev_top == vd && vd->vdev_ashift != 0 &&
-           !vd->vdev_isl2cache && !vd->vdev_islog) {
-               if (vd->vdev_ashift > spa->spa_max_ashift)
-                       spa->spa_max_ashift = vd->vdev_ashift;
-               if (vd->vdev_ashift < spa->spa_min_ashift)
-                       spa->spa_min_ashift = vd->vdev_ashift;
-       }
-
        /*
         * Track the min and max ashift values for normal data devices.
         */