summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds-check.c9
-rw-r--r--disk-io.c12
2 files changed, 17 insertions, 4 deletions
diff --git a/cmds-check.c b/cmds-check.c
index dbf48c8c..cdcc4ba4 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -6008,7 +6008,7 @@ static int reinit_extent_tree(struct btrfs_fs_info *fs_info)
}
/* Ok we can allocate now, reinit the extent root */
- ret = btrfs_fsck_reinit_root(trans, fs_info->extent_root, 1);
+ ret = btrfs_fsck_reinit_root(trans, fs_info->extent_root, 0);
if (ret) {
fprintf(stderr, "extent root initialization failed\n");
/*
@@ -6194,20 +6194,23 @@ int cmd_check(int argc, char **argv)
if (!extent_buffer_uptodate(info->tree_root->node) ||
!extent_buffer_uptodate(info->dev_root->node) ||
- !extent_buffer_uptodate(info->extent_root->node) ||
!extent_buffer_uptodate(info->chunk_root->node)) {
fprintf(stderr, "Critical roots corrupted, unable to fsck the FS\n");
return -EIO;
}
root = info->fs_root;
-
if (init_extent_tree) {
printf("Creating a new extent tree\n");
ret = reinit_extent_tree(info);
if (ret)
return ret;
}
+ if (!extent_buffer_uptodate(info->extent_root->node)) {
+ fprintf(stderr, "Critical roots corrupted, unable to fsck the FS\n");
+ return -EIO;
+ }
+
fprintf(stderr, "checking extents\n");
if (init_csum_tree) {
struct btrfs_trans_handle *trans;
diff --git a/disk-io.c b/disk-io.c
index 0af38985..7ad2cc27 100644
--- a/disk-io.c
+++ b/disk-io.c
@@ -877,7 +877,17 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr,
fs_info->extent_root);
if (ret) {
printk("Couldn't setup extent tree\n");
- return -EIO;
+ if (!(flags & OPEN_CTREE_PARTIAL))
+ return -EIO;
+ /* Need a blank node here just so we don't screw up in the
+ * million of places that assume a root has a valid ->node
+ */
+ fs_info->extent_root->node =
+ btrfs_find_create_tree_block(fs_info->extent_root, 0,
+ leafsize);
+ if (!fs_info->extent_root->node)
+ return -ENOMEM;
+ clear_extent_buffer_uptodate(NULL, fs_info->extent_root->node);
}
fs_info->extent_root->track_dirty = 1;