diff options
author | Paul Dagnelie <[email protected]> | 2020-10-14 08:59:54 -0700 |
---|---|---|
committer | GitHub <[email protected]> | 2020-10-14 08:59:54 -0700 |
commit | 6a60ef80e2f00fca81f02a6eb93a520a29d6ae03 (patch) | |
tree | f3e9b64567f4b180d73e251271ce1dcac5c9cedb | |
parent | 47a7e999398c98e65d0f5aefb6de947a106144fb (diff) |
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 <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Paul Dagnelie <[email protected]>
Closes #11044
Closes #11056
-rw-r--r-- | module/zfs/range_tree.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/module/zfs/range_tree.c b/module/zfs/range_tree.c index 2ce0139c9..5219fd079 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; } |