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: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
ed2ff2cba7
commit
f0930a37f1
|
@ -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,
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wret = commit_transaction(root);
|
|
||||||
if (wret)
|
|
||||||
ret = wret;
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
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)
|
||||||
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 @@ error:
|
||||||
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)
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue