summaryrefslogtreecommitdiff
path: root/check
diff options
context:
space:
mode:
authorSu Yue <suy.fnst@cn.fujitsu.com>2018-05-08 16:30:08 +0800
committerDavid Sterba <dsterba@suse.com>2018-06-07 16:37:31 +0200
commit32705f2307060fb6b8cd0c60a258d70d032cb66e (patch)
tree97187ef3b2c34ae1eb5f1d7954f2210feb9af555 /check
parent4c2b21acaa028a0452d36df01740588d08708753 (diff)
btrfs-progs: check: lowmem: remove parameter @trans of repair_tree_back_ref
This patch removes parameter @trans of repair_tree_back_ref(). It calls try_avoid_extents_overwrite() and starts a transaction by itself. Note: This patch and next patches cause error in lowmem repair like: "Error: Commit_root already set when starting transaction". Such error will disappear after removing @trans finished. Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'check')
-rw-r--r--check/mode-lowmem.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c
index b3a5bed2..9774ac09 100644
--- a/check/mode-lowmem.c
+++ b/check/mode-lowmem.c
@@ -544,11 +544,11 @@ static int end_avoid_extents_overwrite(struct btrfs_fs_info *fs_info)
*
* Returns error bits after repair.
*/
-static int repair_tree_block_ref(struct btrfs_trans_handle *trans,
- struct btrfs_root *root,
+static int repair_tree_block_ref(struct btrfs_root *root,
struct extent_buffer *node,
struct node_refs *nrefs, int level, int err)
{
+ struct btrfs_trans_handle *trans = NULL;
struct btrfs_fs_info *fs_info = root->fs_info;
struct btrfs_root *extent_root = fs_info->extent_root;
struct btrfs_path path;
@@ -598,6 +598,16 @@ static int repair_tree_block_ref(struct btrfs_trans_handle *trans,
if (nrefs->full_backref[level] != 0)
flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
+ ret = avoid_extents_overwrite(root->fs_info);
+ if (ret)
+ goto out;
+ trans = btrfs_start_transaction(extent_root, 1);
+ if (IS_ERR(trans)) {
+ ret = PTR_ERR(trans);
+ trans = NULL;
+ error("fail to start transaction %s", strerror(-ret));
+ goto out;
+ }
/* insert an extent item */
if (insert_extent) {
struct btrfs_disk_key copy_key;
@@ -663,6 +673,8 @@ static int repair_tree_block_ref(struct btrfs_trans_handle *trans,
nrefs->refs[level]++;
out:
+ if (trans)
+ btrfs_commit_transaction(trans, extent_root);
btrfs_release_path(&path);
if (ret) {
error(
@@ -4365,7 +4377,7 @@ static int walk_down_tree(struct btrfs_trans_handle *trans,
btrfs_header_owner(cur), nrefs);
if (repair && ret)
- ret = repair_tree_block_ref(trans, root,
+ ret = repair_tree_block_ref(root,
path->nodes[*level], nrefs, *level, ret);
err |= ret;