Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-next-2.6
[pandora-kernel.git] / fs / btrfs / root-tree.c
index 6928bff..ebe4544 100644 (file)
 #include "disk-io.h"
 #include "print-tree.h"
 
-/*
- *  search forward for a root, starting with objectid 'search_start'
- *  if a root key is found, the objectid we find is filled into 'found_objectid'
- *  and 0 is returned.  < 0 is returned on error, 1 if there is nothing
- *  left in the tree.
- */
-int btrfs_search_root(struct btrfs_root *root, u64 search_start,
-                     u64 *found_objectid)
-{
-       struct btrfs_path *path;
-       struct btrfs_key search_key;
-       int ret;
-
-       root = root->fs_info->tree_root;
-       search_key.objectid = search_start;
-       search_key.type = (u8)-1;
-       search_key.offset = (u64)-1;
-
-       path = btrfs_alloc_path();
-       BUG_ON(!path);
-again:
-       ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0);
-       if (ret < 0)
-               goto out;
-       if (ret == 0) {
-               ret = 1;
-               goto out;
-       }
-       if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) {
-               ret = btrfs_next_leaf(root, path);
-               if (ret)
-                       goto out;
-       }
-       btrfs_item_key_to_cpu(path->nodes[0], &search_key, path->slots[0]);
-       if (search_key.type != BTRFS_ROOT_ITEM_KEY) {
-               search_key.offset++;
-               btrfs_release_path(root, path);
-               goto again;
-       }
-       ret = 0;
-       *found_objectid = search_key.objectid;
-
-out:
-       btrfs_free_path(path);
-       return ret;
-}
-
 /*
  * lookup the root with the highest offset for a given objectid.  The key we do
  * find is copied into 'key'.  If we find something return 0, otherwise 1, < 0
@@ -230,7 +183,7 @@ again:
 
                memcpy(&found_key, &key, sizeof(key));
                key.offset++;
-               btrfs_release_path(root, path);
+               btrfs_release_path(path);
                dead_root =
                        btrfs_read_fs_root_no_radix(root->fs_info->tree_root,
                                                    &found_key);
@@ -292,7 +245,7 @@ int btrfs_find_orphan_roots(struct btrfs_root *tree_root)
                }
 
                btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
-               btrfs_release_path(tree_root, path);
+               btrfs_release_path(path);
 
                if (key.objectid != BTRFS_ORPHAN_OBJECTID ||
                    key.type != BTRFS_ORPHAN_ITEM_KEY)
@@ -385,18 +338,22 @@ again:
                *sequence = btrfs_root_ref_sequence(leaf, ref);
 
                ret = btrfs_del_item(trans, tree_root, path);
-               BUG_ON(ret);
+               if (ret) {
+                       err = ret;
+                       goto out;
+               }
        } else
                err = -ENOENT;
 
        if (key.type == BTRFS_ROOT_BACKREF_KEY) {
-               btrfs_release_path(tree_root, path);
+               btrfs_release_path(path);
                key.objectid = ref_id;
                key.type = BTRFS_ROOT_REF_KEY;
                key.offset = root_id;
                goto again;
        }
 
+out:
        btrfs_free_path(path);
        return err;
 }
@@ -463,7 +420,7 @@ again:
        btrfs_mark_buffer_dirty(leaf);
 
        if (key.type == BTRFS_ROOT_BACKREF_KEY) {
-               btrfs_release_path(tree_root, path);
+               btrfs_release_path(path);
                key.objectid = ref_id;
                key.type = BTRFS_ROOT_REF_KEY;
                key.offset = root_id;