]> git.proxmox.com Git - mirror_zfs.git/blobdiff - cmd/ztest/ztest.c
Illumos #3949, #3950, #3952, #3953
[mirror_zfs.git] / cmd / ztest / ztest.c
index 0a7ca1c164aa82b8368a7a20ea0cda68befb89cb..572af3e0bb41aab7c0151ad5e7e59769e06670d8 100644 (file)
@@ -366,7 +366,7 @@ ztest_info_t ztest_info[] = {
        { ztest_fault_inject,                   1,      &zopt_sometimes },
        { ztest_ddt_repair,                     1,      &zopt_sometimes },
        { ztest_dmu_snapshot_hold,              1,      &zopt_sometimes },
-       { ztest_reguid,                         1,      &zopt_sometimes },
+       { ztest_reguid,                         1,      &zopt_rarely    },
        { ztest_spa_rename,                     1,      &zopt_rarely    },
        { ztest_scrub,                          1,      &zopt_rarely    },
        { ztest_spa_upgrade,                    1,      &zopt_rarely    },
@@ -4913,6 +4913,14 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
 
        ASSERT(leaves >= 1);
 
+       /*
+        * Grab the name lock as reader. There are some operations
+        * which don't like to have their vdevs changed while
+        * they are in progress (i.e. spa_change_guid). Those
+        * operations will have grabbed the name lock as writer.
+        */
+       (void) rw_enter(&ztest_name_lock, RW_READER);
+
        /*
         * We need SCL_STATE here because we're going to look at vd0->vdev_tsd.
         */
@@ -4942,7 +4950,14 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
                if (vd0 != NULL && vd0->vdev_top->vdev_islog)
                        islog = B_TRUE;
 
-               if (vd0 != NULL && maxfaults != 1) {
+               /*
+                * If the top-level vdev needs to be resilvered
+                * then we only allow faults on the device that is
+                * resilvering.
+                */
+               if (vd0 != NULL && maxfaults != 1 &&
+                   (!vdev_resilver_needed(vd0->vdev_top, NULL, NULL) ||
+                   vd0->vdev_resilvering)) {
                        /*
                         * Make vd0 explicitly claim to be unreadable,
                         * or unwriteable, or reach behind its back
@@ -4973,6 +4988,7 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
 
                if (sav->sav_count == 0) {
                        spa_config_exit(spa, SCL_STATE, FTAG);
+                       (void) rw_exit(&ztest_name_lock);
                        goto out;
                }
                vd0 = sav->sav_vdevs[ztest_random(sav->sav_count)];
@@ -4986,6 +5002,7 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
        }
 
        spa_config_exit(spa, SCL_STATE, FTAG);
+       (void) rw_exit(&ztest_name_lock);
 
        /*
         * If we can tolerate two or more faults, or we're dealing