From ed1b086a3042c25655233ece41ff97b8ecc73a35 Mon Sep 17 00:00:00 2001 From: Wang Shilong Date: Thu, 29 May 2014 17:59:57 +0800 Subject: [PATCH] Btrfs-progs: fsck: deal with corrupted csum root If checksum root is corrupted, fsck will get segmentation. This is because if we fail to load checksum root, root's node is NULL which cause NULL pointer deferences later. To fix this problem, we just did something like extent tree rebuilding. Allocate a new one and clear uptodate flag. We will do sanity check before fsck going on. Signed-off-by: Wang Shilong Signed-off-by: David Sterba --- cmds-check.c | 5 +++++ disk-io.c | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/cmds-check.c b/cmds-check.c index 7c5cfbb..c0a9870 100644 --- a/cmds-check.c +++ b/cmds-check.c @@ -6990,6 +6990,11 @@ int cmd_check(int argc, char **argv) ret = -EIO; goto close_out; } + if (!extent_buffer_uptodate(info->csum_root->node)) { + fprintf(stderr, "Checksum root corrupted, rerun with --init-csum-tree option\n"); + ret = -EIO; + goto close_out; + } fprintf(stderr, "checking extents\n"); ret = check_chunks_and_extents(root); diff --git a/disk-io.c b/disk-io.c index ed0b462..5a2c49d 100644 --- a/disk-io.c +++ b/disk-io.c @@ -909,6 +909,13 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, printk("Couldn't setup csum tree\n"); if (!(flags & OPEN_CTREE_PARTIAL)) return -EIO; + /* do the same thing as extent tree rebuilding */ + fs_info->csum_root->node = + btrfs_find_create_tree_block(fs_info->extent_root, 0, + leafsize); + if (!fs_info->csum_root->node) + return -ENOMEM; + clear_extent_buffer_uptodate(NULL, fs_info->csum_root->node); } fs_info->csum_root->track_dirty = 1; -- 2.7.4