From: Johannes Thumshirn Date: Tue, 9 Jul 2024 07:40:34 +0000 (+0200) Subject: btrfs: update stripe_extent delete loop assumptions X-Git-Tag: microblaze-v6.13~102^2~111 X-Git-Url: http://git.monstr.eu/?a=commitdiff_plain;h=7fa5230b46f2c333f090716c52e99a0fbbee5fbd;p=linux-2.6-microblaze.git btrfs: update stripe_extent delete loop assumptions btrfs_delete_raid_extent() was written under the assumption, that it's call-chain always passes a start, length tuple that matches a single extent. But btrfs_delete_raid_extent() is called by do_free_extent_accounting() which in turn is called by __btrfs_free_extent(). But this call-chain passes in a start address and a length that can possibly match multiple on-disk extents. To make this possible, we have to adjust the start and length of each btree node lookup, to not delete beyond the requested range. Reviewed-by: Qu Wenruo Signed-off-by: Johannes Thumshirn Signed-off-by: David Sterba --- diff --git a/fs/btrfs/raid-stripe-tree.c b/fs/btrfs/raid-stripe-tree.c index 0c7b928805e5..bd06ff795691 100644 --- a/fs/btrfs/raid-stripe-tree.c +++ b/fs/btrfs/raid-stripe-tree.c @@ -66,6 +66,11 @@ int btrfs_delete_raid_extent(struct btrfs_trans_handle *trans, u64 start, u64 le if (ret) break; + start += key.offset; + length -= key.offset; + if (length == 0) + break; + btrfs_release_path(path); }