summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2013-02-01 15:21:04 -0500
committerDavid Sterba <dsterba@suse.cz>2013-02-07 01:19:50 +0100
commit8a46573c2a6bc68385538e5d10131c984df198e9 (patch)
tree015e56dbb591ce6defb594052162b3aca44203be
parent8795e785ced4b5931bb2c4548d390408fa65e21e (diff)
Btrfs-progs: return an error if we can't find an fs root
Instead of doing a BUG_ON() if we fail to find the last fs root just return an error so the callers can deal with it how they like. Also we need to actually return an error if we can't find the latest root so that the error handling works. With this btrfsck was able to deal with a file system that was missing a root item but still had extents that referred back to the root. Thanks, Signed-off-by: Josef Bacik <jbacik@fusionio.com>
-rw-r--r--disk-io.c3
-rw-r--r--root-tree.c2
2 files changed, 3 insertions, 2 deletions
diff --git a/disk-io.c b/disk-io.c
index 27befca4..5aa9aa3a 100644
--- a/disk-io.c
+++ b/disk-io.c
@@ -613,7 +613,8 @@ static int find_and_setup_root(struct btrfs_root *tree_root,
root, fs_info, objectid);
ret = btrfs_find_last_root(tree_root, objectid,
&root->root_item, &root->root_key);
- BUG_ON(ret);
+ if (ret)
+ return ret;
blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item));
generation = btrfs_root_generation(&root->root_item);
diff --git a/root-tree.c b/root-tree.c
index 782472ca..ecb75997 100644
--- a/root-tree.c
+++ b/root-tree.c
@@ -47,7 +47,7 @@ int btrfs_find_last_root(struct btrfs_root *root, u64 objectid,
slot = path->slots[0] - 1;
btrfs_item_key_to_cpu(l, &found_key, slot);
if (found_key.objectid != objectid) {
- ret = 1;
+ ret = -ENOENT;
goto out;
}
read_extent_buffer(l, item, btrfs_item_ptr_offset(l, slot),