summaryrefslogtreecommitdiff
path: root/fs/btrfs
diff options
context:
space:
mode:
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>2024-07-09 09:40:34 +0200
committerDavid Sterba <dsterba@suse.com>2024-09-10 16:51:12 +0200
commit7fa5230b46f2c333f090716c52e99a0fbbee5fbd (patch)
tree0c5339307752d1b3acb317222b81295247a0e10d /fs/btrfs
parent8c4cba2adbb0ec63f3833cad7452a431580e9ffa (diff)
downloadlinux-7fa5230b46f2c333f090716c52e99a0fbbee5fbd.tar.gz
linux-7fa5230b46f2c333f090716c52e99a0fbbee5fbd.tar.bz2
linux-7fa5230b46f2c333f090716c52e99a0fbbee5fbd.zip
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 <wqu@suse.com> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/raid-stripe-tree.c5
1 files changed, 5 insertions, 0 deletions
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);
}