Commit f0930a37 authored by Chris Mason's avatar Chris Mason Committed by David Woodhouse

Btrfs: Fix extent code to use merge during delete

Remove implicit commit in del_item and insert_item
Add implicit commit to close()
Add commit op in random-test
Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent ed2ff2cb
...@@ -1065,11 +1065,7 @@ int insert_item(struct ctree_root *root, struct key *key, ...@@ -1065,11 +1065,7 @@ int insert_item(struct ctree_root *root, struct key *key,
ret = search_slot(root, key, &path, data_size); ret = search_slot(root, key, &path, data_size);
if (ret == 0) { if (ret == 0) {
release_path(root, &path); release_path(root, &path);
ret = -EEXIST; return -EEXIST;
wret = commit_transaction(root);
if (wret)
ret = wret;
return ret;
} }
if (ret < 0) if (ret < 0)
goto out; goto out;
...@@ -1127,9 +1123,6 @@ int insert_item(struct ctree_root *root, struct key *key, ...@@ -1127,9 +1123,6 @@ int insert_item(struct ctree_root *root, struct key *key,
check_leaf(&path, 0); check_leaf(&path, 0);
out: out:
release_path(root, &path); release_path(root, &path);
wret = commit_transaction(root);
if (wret)
ret = wret;
return ret; return ret;
} }
...@@ -1245,7 +1238,8 @@ int del_item(struct ctree_root *root, struct ctree_path *path) ...@@ -1245,7 +1238,8 @@ int del_item(struct ctree_root *root, struct ctree_path *path)
wret = push_leaf_left(root, path, 1); wret = push_leaf_left(root, path, 1);
if (wret < 0) if (wret < 0)
ret = wret; ret = wret;
if (leaf->header.nritems) { if (path->nodes[0] == leaf_buf &&
leaf->header.nritems) {
wret = push_leaf_right(root, path, 1); wret = push_leaf_right(root, path, 1);
if (wret < 0) if (wret < 0)
ret = wret; ret = wret;
...@@ -1265,9 +1259,6 @@ int del_item(struct ctree_root *root, struct ctree_path *path) ...@@ -1265,9 +1259,6 @@ int del_item(struct ctree_root *root, struct ctree_path *path)
} }
} }
} }
wret = commit_transaction(root);
if (wret)
ret = wret;
return ret; return ret;
} }
......
...@@ -239,6 +239,7 @@ static int drop_cache(struct ctree_root *root) ...@@ -239,6 +239,7 @@ static int drop_cache(struct ctree_root *root)
} }
int close_ctree(struct ctree_root *root) int close_ctree(struct ctree_root *root)
{ {
commit_transaction(root);
drop_cache(root->extent_root); drop_cache(root->extent_root);
drop_cache(root); drop_cache(root);
BUG_ON(!list_empty(&root->trans)); BUG_ON(!list_empty(&root->trans));
......
...@@ -39,7 +39,7 @@ static int del_pending_extents(struct ctree_root *extent_root) ...@@ -39,7 +39,7 @@ static int del_pending_extents(struct ctree_root *extent_root)
key.flags = 0; key.flags = 0;
key.offset = 1; key.offset = 1;
init_path(&path); init_path(&path);
ret = search_slot(extent_root, &key, &path, 0); ret = search_slot(extent_root, &key, &path, -1);
if (ret) { if (ret) {
print_tree(extent_root, extent_root->node); print_tree(extent_root, extent_root->node);
printf("unable to find %Lu\n", key.objectid); printf("unable to find %Lu\n", key.objectid);
...@@ -83,7 +83,7 @@ int free_extent(struct ctree_root *root, u64 blocknr, u64 num_blocks) ...@@ -83,7 +83,7 @@ int free_extent(struct ctree_root *root, u64 blocknr, u64 num_blocks)
return 0; return 0;
} }
init_path(&path); init_path(&path);
ret = search_slot(extent_root, &key, &path, 0); ret = search_slot(extent_root, &key, &path, -1);
if (ret) { if (ret) {
print_tree(extent_root, extent_root->node); print_tree(extent_root, extent_root->node);
printf("failed to find %Lu\n", key.objectid); printf("failed to find %Lu\n", key.objectid);
......
...@@ -59,6 +59,11 @@ static int ins_one(struct ctree_root *root, struct radix_tree_root *radix) ...@@ -59,6 +59,11 @@ static int ins_one(struct ctree_root *root, struct radix_tree_root *radix)
return -1; return -1;
} }
static int run_commit(struct ctree_root *root, struct radix_tree_root *radix)
{
return commit_transaction(root);
}
static int insert_dup(struct ctree_root *root, struct radix_tree_root *radix) static int insert_dup(struct ctree_root *root, struct radix_tree_root *radix)
{ {
struct ctree_path path; struct ctree_path path;
...@@ -233,7 +238,8 @@ static int bulk_op(struct ctree_root *root, struct radix_tree_root *radix) ...@@ -233,7 +238,8 @@ static int bulk_op(struct ctree_root *root, struct radix_tree_root *radix)
int (*ops[])(struct ctree_root *root, struct radix_tree_root *radix) = int (*ops[])(struct ctree_root *root, struct radix_tree_root *radix) =
{ ins_one, insert_dup, del_one, lookup_item, lookup_enoent, bulk_op }; { ins_one, insert_dup, del_one, lookup_item,
lookup_enoent, bulk_op, run_commit };
static int fill_radix(struct ctree_root *root, struct radix_tree_root *radix) static int fill_radix(struct ctree_root *root, struct radix_tree_root *radix)
{ {
...@@ -366,7 +372,7 @@ int main(int ac, char **av) ...@@ -366,7 +372,7 @@ int main(int ac, char **av)
err = ret; err = ret;
goto out; goto out;
} }
if (ops[op] == bulk_op) if (ops[op] == bulk_op || ops[op] == run_commit)
break; break;
if (keep_running == 0) { if (keep_running == 0) {
err = 0; err = 0;
......
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