From d8091c929488ba9ba4113ac1b5e00e018c92f39f Mon Sep 17 00:00:00 2001 From: Paul Dagnelie Date: Wed, 14 Oct 2020 08:59:54 -0700 Subject: [PATCH] Fix incorrect deletion order in range_tree_add_impl gap case After a side-effectful call like add or remove, references to range segs stored in btrees can no longer be used safely. We move the remove call to just before the reinsertion call so that the seg remains valid for as long as we need it. Reviewed-by: Matthew Ahrens Reviewed-by: Brian Behlendorf Signed-off-by: Paul Dagnelie Closes #11044 Closes #11056 --- module/zfs/range_tree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/zfs/range_tree.c b/module/zfs/range_tree.c index 2ce0139c91..5219fd079b 100644 --- a/module/zfs/range_tree.c +++ b/module/zfs/range_tree.c @@ -314,7 +314,6 @@ range_tree_add_impl(void *arg, uint64_t start, uint64_t size, uint64_t fill) return; } - zfs_btree_remove(&rt->rt_root, rs); if (rt->rt_ops != NULL && rt->rt_ops->rtop_remove != NULL) rt->rt_ops->rtop_remove(rt, rs, rt->rt_arg); @@ -326,6 +325,7 @@ range_tree_add_impl(void *arg, uint64_t start, uint64_t size, uint64_t fill) end = MAX(end, rend); size = end - start; + zfs_btree_remove(&rt->rt_root, rs); range_tree_add_impl(rt, start, size, fill); return; }