From 6495dafd58b94a44fc9bc966ef47d6bc6916f5b9 Mon Sep 17 00:00:00 2001 From: clefru Date: Wed, 25 Feb 2026 20:26:10 +0100 Subject: [PATCH] range_tree: use zfs_panic_recover() for partial-overlap remove zfs_range_tree_remove_impl() used a bare panic() when a segment to be removed was not completely overlapped by an existing tree entry. Every other consistency check in range_tree.c uses zfs_panic_recover(), which respects the zfs_recover tunable and allows pools with on-disk corruption to be imported and recovered. This one call was inconsistent, making the partial-overlap case unrecoverable regardless of zfs_recover. Replace panic() with zfs_panic_recover() so that operators can set zfs_recover=1 to import a corrupted pool and reclaim data, consistent with all other range tree error paths. Related-to: https://github.com/openzfs/zfs/issues/13483 Reviewed-by: Tony Hutter Reviewed-by: Brian Behlendorf Signed-off-by: Clemens Fruhwirth Co-authored-by: Claude Sonnet 4.6 Closes #18255 --- 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 341b02a03..916889c31 100644 --- a/module/zfs/range_tree.c +++ b/module/zfs/range_tree.c @@ -539,7 +539,7 @@ zfs_range_tree_remove_impl(zfs_range_tree_t *rt, uint64_t start, uint64_t size, } if (!(rstart <= start && rend >= end)) { - panic("zfs: rt=%s: removing segment " + zfs_panic_recover("zfs: rt=%s: removing segment " "(offset=%llx size=%llx) not completely overlapped by " "existing one (offset=%llx size=%llx)", ZFS_RT_NAME(rt),