Commit ac2fabac authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba

Btrfs: fill relocation block rsv after allocation

Since we set the reloc control before we've reserved our space for relocation we
could race with a root being dirtied and not actually have space to do our init
reloc root.  So once we've allocated it and set it up go ahead and make our
reservation before setting the relocate control, that way anybody who tries to
do the reloc root init has space to use.  Thanks,
Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 40acc3ee
...@@ -3871,6 +3871,7 @@ static noinline_for_stack ...@@ -3871,6 +3871,7 @@ static noinline_for_stack
int prepare_to_relocate(struct reloc_control *rc) int prepare_to_relocate(struct reloc_control *rc)
{ {
struct btrfs_trans_handle *trans; struct btrfs_trans_handle *trans;
int ret;
rc->block_rsv = btrfs_alloc_block_rsv(rc->extent_root, rc->block_rsv = btrfs_alloc_block_rsv(rc->extent_root,
BTRFS_BLOCK_RSV_TEMP); BTRFS_BLOCK_RSV_TEMP);
...@@ -3885,6 +3886,11 @@ int prepare_to_relocate(struct reloc_control *rc) ...@@ -3885,6 +3886,11 @@ int prepare_to_relocate(struct reloc_control *rc)
rc->reserved_bytes = 0; rc->reserved_bytes = 0;
rc->block_rsv->size = rc->extent_root->nodesize * rc->block_rsv->size = rc->extent_root->nodesize *
RELOCATION_RESERVED_NODES; RELOCATION_RESERVED_NODES;
ret = btrfs_block_rsv_refill(rc->extent_root,
rc->block_rsv, rc->block_rsv->size,
BTRFS_RESERVE_FLUSH_ALL);
if (ret)
return ret;
rc->create_reloc_tree = 1; rc->create_reloc_tree = 1;
set_reloc_control(rc); set_reloc_control(rc);
......
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