btrfs: add additional parameters to btrfs_init_tree_ref/btrfs_init_data_ref
In order to make 'real_root' used only in ref-verify it's required to have the necessary context to perform the same checks that this member is used for. So add 'mod_root' which will contain the root on behalf of which a delayed ref was created and a 'skip_group' parameter which will contain callsite-specific override of skip_qgroup. Signed-off-by: Nikolay Borisov <nborisov@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
committed by
David Sterba
parent
d55b9e687e
commit
f42c5da6c1
@ -1148,7 +1148,8 @@ int replace_file_extents(struct btrfs_trans_handle *trans,
|
||||
num_bytes, parent);
|
||||
ref.real_root = root->root_key.objectid;
|
||||
btrfs_init_data_ref(&ref, btrfs_header_owner(leaf),
|
||||
key.objectid, key.offset);
|
||||
key.objectid, key.offset,
|
||||
root->root_key.objectid, false);
|
||||
ret = btrfs_inc_extent_ref(trans, &ref);
|
||||
if (ret) {
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
@ -1159,7 +1160,8 @@ int replace_file_extents(struct btrfs_trans_handle *trans,
|
||||
num_bytes, parent);
|
||||
ref.real_root = root->root_key.objectid;
|
||||
btrfs_init_data_ref(&ref, btrfs_header_owner(leaf),
|
||||
key.objectid, key.offset);
|
||||
key.objectid, key.offset,
|
||||
root->root_key.objectid, false);
|
||||
ret = btrfs_free_extent(trans, &ref);
|
||||
if (ret) {
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
@ -1369,7 +1371,8 @@ again:
|
||||
btrfs_init_generic_ref(&ref, BTRFS_ADD_DELAYED_REF, old_bytenr,
|
||||
blocksize, path->nodes[level]->start);
|
||||
ref.skip_qgroup = true;
|
||||
btrfs_init_tree_ref(&ref, level - 1, src->root_key.objectid);
|
||||
btrfs_init_tree_ref(&ref, level - 1, src->root_key.objectid,
|
||||
0, true);
|
||||
ret = btrfs_inc_extent_ref(trans, &ref);
|
||||
if (ret) {
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
@ -1378,7 +1381,8 @@ again:
|
||||
btrfs_init_generic_ref(&ref, BTRFS_ADD_DELAYED_REF, new_bytenr,
|
||||
blocksize, 0);
|
||||
ref.skip_qgroup = true;
|
||||
btrfs_init_tree_ref(&ref, level - 1, dest->root_key.objectid);
|
||||
btrfs_init_tree_ref(&ref, level - 1, dest->root_key.objectid, 0,
|
||||
true);
|
||||
ret = btrfs_inc_extent_ref(trans, &ref);
|
||||
if (ret) {
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
@ -1387,7 +1391,8 @@ again:
|
||||
|
||||
btrfs_init_generic_ref(&ref, BTRFS_DROP_DELAYED_REF, new_bytenr,
|
||||
blocksize, path->nodes[level]->start);
|
||||
btrfs_init_tree_ref(&ref, level - 1, src->root_key.objectid);
|
||||
btrfs_init_tree_ref(&ref, level - 1, src->root_key.objectid,
|
||||
0, true);
|
||||
ref.skip_qgroup = true;
|
||||
ret = btrfs_free_extent(trans, &ref);
|
||||
if (ret) {
|
||||
@ -1397,7 +1402,8 @@ again:
|
||||
|
||||
btrfs_init_generic_ref(&ref, BTRFS_DROP_DELAYED_REF, old_bytenr,
|
||||
blocksize, 0);
|
||||
btrfs_init_tree_ref(&ref, level - 1, dest->root_key.objectid);
|
||||
btrfs_init_tree_ref(&ref, level - 1, dest->root_key.objectid,
|
||||
0, true);
|
||||
ref.skip_qgroup = true;
|
||||
ret = btrfs_free_extent(trans, &ref);
|
||||
if (ret) {
|
||||
@ -2476,7 +2482,8 @@ static int do_relocation(struct btrfs_trans_handle *trans,
|
||||
upper->eb->start);
|
||||
ref.real_root = root->root_key.objectid;
|
||||
btrfs_init_tree_ref(&ref, node->level,
|
||||
btrfs_header_owner(upper->eb));
|
||||
btrfs_header_owner(upper->eb),
|
||||
root->root_key.objectid, false);
|
||||
ret = btrfs_inc_extent_ref(trans, &ref);
|
||||
if (!ret)
|
||||
ret = btrfs_drop_subtree(trans, root, eb,
|
||||
|
Reference in New Issue
Block a user