From 8d24686ab95645a29e4a4cbb7c906003ab9fda56 Mon Sep 17 00:00:00 2001 From: Paul Dagnelie Date: Wed, 25 May 2022 09:25:13 -0700 Subject: [PATCH] Cancel in-progress rebuilds when we finish removal 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 Signed-off-by: Paul Dagnelie Closes #13498 --- module/zfs/vdev_removal.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/zfs/vdev_removal.c b/module/zfs/vdev_removal.c index 5508d273758d..7dfc4345f236 100644 --- a/module/zfs/vdev_removal.c +++ b/module/zfs/vdev_removal.c @@ -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;