]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Cancel in-progress rebuilds when we finish removal
authorPaul Dagnelie <paul.dagnelie@delphix.com>
Wed, 25 May 2022 16:25:13 +0000 (09:25 -0700)
committerGitHub <noreply@github.com>
Wed, 25 May 2022 16:25:13 +0000 (09:25 -0700)
This issue was discovered by zloop runs. When a mirror or other
redundant top-level vdev has a disk failure, and the disk is replaced,
the rebuild process occurs. A removal can happen while this is in
progress. If the removal completes before the rebuild does, the
removal process will try to free the vdev that is still in use.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Paul Dagnelie <pcd@delphix.com>
Closes #13498

module/zfs/vdev_removal.c

index 5508d273758d6b766ebd8042c4bc650385400591..7dfc4345f23620ddcae1edb486375fd1cd28b1c6 100644 (file)
@@ -1364,6 +1364,8 @@ vdev_remove_complete(spa_t *spa)
        ASSERT3P(vd->vdev_initialize_thread, ==, NULL);
        ASSERT3P(vd->vdev_trim_thread, ==, NULL);
        ASSERT3P(vd->vdev_autotrim_thread, ==, NULL);
+       vdev_rebuild_stop_wait(vd);
+       ASSERT3P(vd->vdev_rebuild_thread, ==, NULL);
        uint64_t vdev_space = spa_deflate(spa) ?
            vd->vdev_stat.vs_dspace : vd->vdev_stat.vs_space;