mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
btrfs: calculate the right space for delayed refs when updating global reserve
When updating the global block reserve, we account for the 6 items needed by an unlink operation and the 6 delayed references for each one of those items. However the calculation for the delayed references is not correct in case we have the free space tree enabled, as in that case we need to touch the free space tree as well and therefore need twice the number of bytes. So use the btrfs_calc_delayed_ref_bytes() helper to calculate the number of bytes need for the delayed references at btrfs_update_global_block_rsv(). Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
5630e2bcfe
commit
f8f210dc84
@ -354,14 +354,15 @@ void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info)
|
|||||||
* BTRFS_UNLINK_METADATA_UNITS items.
|
* BTRFS_UNLINK_METADATA_UNITS items.
|
||||||
*
|
*
|
||||||
* But we also need space for the delayed ref updates from the unlink,
|
* But we also need space for the delayed ref updates from the unlink,
|
||||||
* so it's BTRFS_UNLINK_METADATA_UNITS * 2, BTRFS_UNLINK_METADATA_UNITS
|
* so add BTRFS_UNLINK_METADATA_UNITS units for delayed refs, one for
|
||||||
* for the actual operation, and BTRFS_UNLINK_METADATA_UNITS more for
|
* each unlink metadata item.
|
||||||
* the delayed ref updates.
|
|
||||||
*/
|
*/
|
||||||
min_items += BTRFS_UNLINK_METADATA_UNITS * 2;
|
min_items += BTRFS_UNLINK_METADATA_UNITS;
|
||||||
|
|
||||||
num_bytes = max_t(u64, num_bytes,
|
num_bytes = max_t(u64, num_bytes,
|
||||||
btrfs_calc_insert_metadata_size(fs_info, min_items));
|
btrfs_calc_insert_metadata_size(fs_info, min_items) +
|
||||||
|
btrfs_calc_delayed_ref_bytes(fs_info,
|
||||||
|
BTRFS_UNLINK_METADATA_UNITS));
|
||||||
|
|
||||||
spin_lock(&sinfo->lock);
|
spin_lock(&sinfo->lock);
|
||||||
spin_lock(&block_rsv->lock);
|
spin_lock(&block_rsv->lock);
|
||||||
|
Loading…
Reference in New Issue
Block a user