Btrfs: Fix extent code to use merge during delete
authorChris Mason <chris.mason@oracle.com>
Fri, 2 Mar 2007 14:47:58 +0000 (09:47 -0500)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Fri, 2 Mar 2007 14:47:58 +0000 (09:47 -0500)
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>
fs/btrfs/ctree.c
fs/btrfs/disk-io.c
fs/btrfs/extent-tree.c
fs/btrfs/random-test.c

index 57fa505fb9f6ae96bea24cb9bb1fca82b2bd77d6..3c5f4c2dd525d36667d9360b96bffce6004b6d8f 100644 (file)
@@ -1065,11 +1065,7 @@ int insert_item(struct ctree_root *root, struct key *key,
        ret = search_slot(root, key, &path, data_size);
        if (ret == 0) {
                release_path(root, &path);
-               ret = -EEXIST;
-               wret = commit_transaction(root);
-               if (wret)
-                       ret = wret;
-               return ret;
+               return -EEXIST;
        }
        if (ret < 0)
                goto out;
@@ -1127,9 +1123,6 @@ int insert_item(struct ctree_root *root, struct key *key,
        check_leaf(&path, 0);
 out:
        release_path(root, &path);
-       wret = commit_transaction(root);
-       if (wret)
-               ret = wret;
        return ret;
 }
 
@@ -1245,7 +1238,8 @@ int del_item(struct ctree_root *root, struct ctree_path *path)
                        wret = push_leaf_left(root, path, 1);
                        if (wret < 0)
                                ret = wret;
-                       if (leaf->header.nritems) {
+                       if (path->nodes[0] == leaf_buf &&
+                           leaf->header.nritems) {
                                wret = push_leaf_right(root, path, 1);
                                if (wret < 0)
                                        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;
 }
 
index 656ace6147a877c22487913daba5c89712ed1a2c..f7ca5362291ee4c50319f24bcfccd6dc4c3d8cc5 100644 (file)
@@ -239,6 +239,7 @@ static int drop_cache(struct ctree_root *root)
 }
 int close_ctree(struct ctree_root *root)
 {
+       commit_transaction(root);
        drop_cache(root->extent_root);
        drop_cache(root);
        BUG_ON(!list_empty(&root->trans));
index 074f4b182f169df358a81727797b820fbeb28014..fb21444962155ec86467b8556b0df08abd02ae6e 100644 (file)
@@ -39,7 +39,7 @@ static int del_pending_extents(struct ctree_root *extent_root)
                        key.flags = 0;
                        key.offset = 1;
                        init_path(&path);
-                       ret = search_slot(extent_root, &key, &path, 0);
+                       ret = search_slot(extent_root, &key, &path, -1);
                        if (ret) {
                                print_tree(extent_root, extent_root->node);
                                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;
        }
        init_path(&path);
-       ret = search_slot(extent_root, &key, &path, 0);
+       ret = search_slot(extent_root, &key, &path, -1);
        if (ret) {
                print_tree(extent_root, extent_root->node);
                printf("failed to find %Lu\n", key.objectid);
index bbd554e88db2b6459fb48d450b177047f13a8d4c..22955753c3a76ae52589e445f1be91a3a9482dba 100644 (file)
@@ -59,6 +59,11 @@ error:
        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)
 {
        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) =
-{ 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)
 {
@@ -366,7 +372,7 @@ int main(int ac, char **av)
                                err = ret;
                                goto out;
                        }
-                       if (ops[op] == bulk_op)
+                       if (ops[op] == bulk_op || ops[op] == run_commit)
                                break;
                        if (keep_running == 0) {
                                err = 0;