Commit 011b41bf authored by Naohiro Aota's avatar Naohiro Aota Committed by David Sterba

btrfs: zoned: advance allocation pointer after tree log node

Since the allocation info of a tree log node is not recorded in the extent
tree, calculate_alloc_pointer() cannot detect this node, so the pointer
can be over a tree node.

Replaying the log calls btrfs_remove_free_space() for each node in the
log tree.

So, advance the pointer after the node to not allocate over it.
Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent d3575156
...@@ -2628,8 +2628,22 @@ int btrfs_remove_free_space(struct btrfs_block_group *block_group, ...@@ -2628,8 +2628,22 @@ int btrfs_remove_free_space(struct btrfs_block_group *block_group,
int ret; int ret;
bool re_search = false; bool re_search = false;
if (btrfs_is_zoned(block_group->fs_info)) if (btrfs_is_zoned(block_group->fs_info)) {
/*
* This can happen with conventional zones when replaying log.
* Since the allocation info of tree-log nodes are not recorded
* to the extent-tree, calculate_alloc_pointer() failed to
* advance the allocation pointer after last allocated tree log
* node blocks.
*
* This function is called from
* btrfs_pin_extent_for_log_replay() when replaying the log.
* Advance the pointer not to overwrite the tree-log nodes.
*/
if (block_group->alloc_offset < offset + bytes)
block_group->alloc_offset = offset + bytes;
return 0; return 0;
}
spin_lock(&ctl->tree_lock); spin_lock(&ctl->tree_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment