From patchwork Fri Oct 17 17:20:08 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Filipe Manana X-Patchwork-Id: 5098331 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id D1B77C11AC for ; Fri, 17 Oct 2014 16:20:49 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 4213820154 for ; Fri, 17 Oct 2014 16:20:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 26DFE200ED for ; Fri, 17 Oct 2014 16:20:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752917AbaJQQUc (ORCPT ); Fri, 17 Oct 2014 12:20:32 -0400 Received: from victor.provo.novell.com ([137.65.250.26]:34186 "EHLO victor.provo.novell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752490AbaJQQU2 (ORCPT ); Fri, 17 Oct 2014 12:20:28 -0400 Received: from debian-vm3.lan (prv-ext-foundry1int.gns.novell.com [137.65.251.240]) by victor.provo.novell.com with ESMTP (NOT encrypted); Fri, 17 Oct 2014 10:20:21 -0600 From: Filipe Manana To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.cz, clm@fb.com, jbacik@fb.com, Filipe Manana Subject: [PATCH] Btrfs-progs: check, ability to detect and fix outdated snapshot root items Date: Fri, 17 Oct 2014 18:20:08 +0100 Message-Id: <1413566408-11979-1-git-send-email-fdmanana@suse.com> X-Mailer: git-send-email 1.9.1 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00,LOTS_OF_MONEY, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This change adds code to detect and fix the issue introduced in the kernel release 3.17, where creation of read-only snapshots lead to a corrupted filesystem if they were created at a moment when the source subvolume/snapshot had orphan items. The issue was that the on-disk root items became incorrect, referring to the pre orphan cleanup root node instead of the post orphan cleanup root node. A test filesystem can be generated with the test case recently submitted for xfstests/fstests, which is essencially the following (bash script): workout() { ops=$1 procs=$2 num_snapshots=$3 _scratch_mkfs >> $seqres.full 2>&1 _scratch_mount snapshot_cmd="$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT" snapshot_cmd="$snapshot_cmd $SCRATCH_MNT/snap_\`date +'%H_%M_%S_%N'\`" run_check $FSSTRESS_PROG -p $procs \ -x "$snapshot_cmd" -X $num_snapshots -d $SCRATCH_MNT -n $ops } ops=10000 procs=4 snapshots=500 workout $ops $procs $snapshots Example of btrfsck's (btrfs check) behaviour against such filesystem: $ btrfsck /dev/loop0 root item for root 311, current bytenr 44630016, current gen 60, current level 1, new bytenr 44957696, new gen 61, new level 1 root item for root 1480, current bytenr 1003569152, current gen 1271, current level 1, new bytenr 1004175360, new gen 1272, new level 1 root item for root 1509, current bytenr 1037434880, current gen 1300, current level 1, new bytenr 1038467072, new gen 1301, new level 1 root item for root 1562, current bytenr 33636352, current gen 1354, current level 1, new bytenr 34455552, new gen 1355, new level 1 root item for root 3094, current bytenr 1011712000, current gen 2935, current level 1, new bytenr 1008484352, new gen 2936, new level 1 root item for root 3716, current bytenr 80805888, current gen 3578, current level 1, new bytenr 73515008, new gen 3579, new level 1 root item for root 4085, current bytenr 714031104, current gen 3958, current level 1, new bytenr 716816384, new gen 3959, new level 1 Found 7 roots with an outdated root item. Please run a filesystem check with the option --repair to fix them. $ echo $? 1 $ btrfsck --repair /dev/loop0 enabling repair mode fixing root item for root 311, current bytenr 44630016, current gen 60, current level 1, new bytenr 44957696, new gen 61, new level 1 fixing root item for root 1480, current bytenr 1003569152, current gen 1271, current level 1, new bytenr 1004175360, new gen 1272, new level 1 fixing root item for root 1509, current bytenr 1037434880, current gen 1300, current level 1, new bytenr 1038467072, new gen 1301, new level 1 fixing root item for root 1562, current bytenr 33636352, current gen 1354, current level 1, new bytenr 34455552, new gen 1355, new level 1 fixing root item for root 3094, current bytenr 1011712000, current gen 2935, current level 1, new bytenr 1008484352, new gen 2936, new level 1 fixing root item for root 3716, current bytenr 80805888, current gen 3578, current level 1, new bytenr 73515008, new gen 3579, new level 1 fixing root item for root 4085, current bytenr 714031104, current gen 3958, current level 1, new bytenr 716816384, new gen 3959, new level 1 Fixed 7 roots. Checking filesystem on /dev/loop0 UUID: 2186e9b9-c977-4a35-9c7b-69c6609d4620 checking extents checking free space cache cache and super generation don't match, space cache will be invalidated checking fs roots checking csums checking root refs found 618537000 bytes used err is 0 total csum bytes: 130824 total tree bytes: 601620480 total fs tree bytes: 580288512 total extent tree bytes: 18464768 btree space waste bytes: 136939144 file data blocks allocated: 34150318080 referenced 27815415808 Btrfs v3.17-rc3-2-gbbe1dd8 $ echo $? 0 Signed-off-by: Filipe Manana --- cmds-check.c | 356 +++++++++++++++++++++ disk-io.c | 2 + extent-tree.c | 22 +- tests/fsck-tests.sh | 15 +- tests/fsck-tests/006-bad_root_items_fs.tar.xz | Bin 0 -> 24980 bytes .../fsck-tests/007-bad_root_items_fs_skinny.tar.xz | Bin 0 -> 26520 bytes utils.c | 21 ++ utils.h | 2 + 8 files changed, 395 insertions(+), 23 deletions(-) create mode 100644 tests/fsck-tests/006-bad_root_items_fs.tar.xz create mode 100644 tests/fsck-tests/007-bad_root_items_fs_skinny.tar.xz diff --git a/cmds-check.c b/cmds-check.c index 310eb2a..2a5f823 100644 --- a/cmds-check.c +++ b/cmds-check.c @@ -7198,6 +7198,345 @@ static int fill_csum_tree(struct btrfs_trans_handle *trans, return ret; } +struct root_item_info { + /* level of the root */ + u8 level; + /* number of nodes at this level, must be 1 for a root */ + int node_count; + u64 bytenr; + u64 gen; + struct cache_extent cache_extent; +}; + +static struct cache_tree *roots_info_cache = NULL; + +static void free_roots_info_cache(void) +{ + if (!roots_info_cache) + return; + + while (!cache_tree_empty(roots_info_cache)) { + struct cache_extent *entry; + struct root_item_info *rii; + + entry = first_cache_extent(roots_info_cache); + remove_cache_extent(roots_info_cache, entry); + rii = container_of(entry, struct root_item_info, cache_extent); + free(rii); + } + + free(roots_info_cache); + roots_info_cache = NULL; +} + +static int build_roots_info_cache(struct btrfs_fs_info *info) +{ + int ret = 0; + struct btrfs_key key; + struct extent_buffer *leaf; + struct btrfs_path *path; + + if (!roots_info_cache) { + roots_info_cache = malloc(sizeof(*roots_info_cache)); + if (!roots_info_cache) + return -ENOMEM; + cache_tree_init(roots_info_cache); + } + + path = btrfs_alloc_path(); + if (!path) + return -ENOMEM; + + key.objectid = 0; + key.type = BTRFS_EXTENT_ITEM_KEY; + key.offset = 0; + + ret = btrfs_search_slot(NULL, info->extent_root, &key, path, 0, 0); + if (ret < 0) + goto out; + leaf = path->nodes[0]; + + while (1) { + struct btrfs_key found_key; + struct btrfs_extent_item *ei; + struct btrfs_extent_inline_ref *iref; + int slot = path->slots[0]; + int type; + u64 flags; + u64 root_id; + u8 level; + struct cache_extent *entry; + struct root_item_info *rii; + + if (slot >= btrfs_header_nritems(leaf)) { + ret = btrfs_next_leaf(info->extent_root, path); + if (ret < 0) { + break; + } else if (ret) { + ret = 0; + break; + } + leaf = path->nodes[0]; + slot = path->slots[0]; + } + + btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); + + if (found_key.type != BTRFS_EXTENT_ITEM_KEY && + found_key.type != BTRFS_METADATA_ITEM_KEY) + goto next; + + ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item); + flags = btrfs_extent_flags(leaf, ei); + + if (found_key.type == BTRFS_EXTENT_ITEM_KEY && + !(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)) + goto next; + + if (found_key.type == BTRFS_METADATA_ITEM_KEY) { + iref = (struct btrfs_extent_inline_ref *)(ei + 1); + level = found_key.offset; + } else { + struct btrfs_tree_block_info *info; + + info = (struct btrfs_tree_block_info *)(ei + 1); + iref = (struct btrfs_extent_inline_ref *)(info + 1); + level = btrfs_tree_block_level(leaf, info); + } + + /* + * For a root extent, it must be of the following type and the + * first (and only one) iref in the item. + */ + type = btrfs_extent_inline_ref_type(leaf, iref); + if (type != BTRFS_TREE_BLOCK_REF_KEY) + goto next; + + root_id = btrfs_extent_inline_ref_offset(leaf, iref); + entry = lookup_cache_extent(roots_info_cache, root_id, 1); + if (!entry) { + rii = malloc(sizeof(struct root_item_info)); + if (!rii) { + ret = -ENOMEM; + goto out; + } + rii->cache_extent.start = root_id; + rii->cache_extent.size = 1; + rii->level = (u8)-1; + entry = &rii->cache_extent; + ret = insert_cache_extent(roots_info_cache, entry); + ASSERT(ret == 0); + } else { + rii = container_of(entry, struct root_item_info, + cache_extent); + } + + ASSERT(rii->cache_extent.start == root_id); + ASSERT(rii->cache_extent.size == 1); + + if (level > rii->level || rii->level == (u8)-1) { + rii->level = level; + rii->bytenr = found_key.objectid; + rii->gen = btrfs_extent_generation(leaf, ei); + rii->node_count = 1; + } else if (level == rii->level) { + rii->node_count++; + } +next: + path->slots[0]++; + } + +out: + btrfs_free_path(path); + + return ret; +} + +static int maybe_repair_root_item(struct btrfs_fs_info *info, + struct btrfs_path *path, + const struct btrfs_key *root_key, + const int read_only_mode) +{ + const u64 root_id = root_key->objectid; + struct cache_extent *entry; + struct root_item_info *rii; + struct btrfs_root_item ri; + unsigned long offset; + + entry = lookup_cache_extent(roots_info_cache, root_id, 1); + if (!entry) { + fprintf(stderr, + "Error: could not find extent items for root %llu\n", + root_key->objectid); + return -ENOENT; + } + + rii = container_of(entry, struct root_item_info, cache_extent); + ASSERT(rii->cache_extent.start == root_id); + ASSERT(rii->cache_extent.size == 1); + + if (rii->node_count != 1) { + fprintf(stderr, + "Error: could not find btree root extent for root %llu\n", + root_id); + return -ENOENT; + } + + offset = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]); + read_extent_buffer(path->nodes[0], &ri, offset, sizeof(ri)); + + if (btrfs_root_bytenr(&ri) != rii->bytenr || + btrfs_root_level(&ri) != rii->level || + btrfs_root_generation(&ri) != rii->gen) { + + /* + * If we're in repair mode but our caller told us to not update + * the root item, i.e. just check if it needs to be updated, don't + * print this message, since the caller will call us again shortly + * for the same root item without read only mode (the caller will + * open a transaction first). + */ + if (!(read_only_mode && repair)) + fprintf(stderr, + "%sroot item for root %llu," + " current bytenr %llu, current gen %llu, current level %u," + " new bytenr %llu, new gen %llu, new level %u\n", + (read_only_mode ? "" : "fixing "), + root_id, + btrfs_root_bytenr(&ri), btrfs_root_generation(&ri), + btrfs_root_level(&ri), + rii->bytenr, rii->gen, rii->level); + + if (btrfs_root_generation(&ri) > rii->gen) { + fprintf(stderr, + "root %llu has a root item with a more recent gen (%llu) compared to the found root node (%llu)\n", + root_id, btrfs_root_generation(&ri), rii->gen); + return -EINVAL; + } + + if (!read_only_mode) { + btrfs_set_root_bytenr(&ri, rii->bytenr); + btrfs_set_root_level(&ri, rii->level); + btrfs_set_root_generation(&ri, rii->gen); + write_extent_buffer(path->nodes[0], &ri, + offset, sizeof(ri)); + } + + return 1; + } + + return 0; +} + +/* + * A regression introduced in the 3.17 kernel (more specifically in 3.17-rc2), + * caused read-only snapshots to be corrupted if they were created at a moment + * when the source subvolume/snapshot had orphan items. The issue was that the + * on-disk root items became incorrect, referring to the pre orphan cleanup root + * node instead of the post orphan cleanup root node. + * So this function, and its callees, just detects and fixes those cases. Even + * though the regression was for read-only snapshots, this function applies to + * any snapshot/subvolume root. + * This must be run before any other repair code - not doing it so, makes other + * repair code delete or modify backrefs in the extent tree for example, which + * will result in an inconsistent fs after repairing the root items. + */ +static int repair_root_items(struct btrfs_fs_info *info) +{ + struct btrfs_path *path = NULL; + struct btrfs_key key; + struct extent_buffer *leaf; + struct btrfs_trans_handle *trans = NULL; + int ret = 0; + int bad_roots = 0; + int need_trans = 0; + + ret = build_roots_info_cache(info); + if (ret) + goto out; + + path = btrfs_alloc_path(); + if (!path) { + ret = -ENOMEM; + goto out; + } + + key.objectid = BTRFS_FIRST_FREE_OBJECTID; + key.type = BTRFS_ROOT_ITEM_KEY; + key.offset = 0; + +again: + /* + * Avoid opening and committing transactions if a leaf doesn't have + * any root items that need to be fixed, so that we avoid rotating + * backup roots unnecessarily. + */ + if (need_trans) { + trans = btrfs_start_transaction(info->tree_root, 1); + if (IS_ERR(trans)) { + ret = PTR_ERR(trans); + goto out; + } + } + + ret = btrfs_search_slot(trans, info->tree_root, &key, path, + 0, trans ? 1 : 0); + if (ret < 0) + goto out; + leaf = path->nodes[0]; + + while (1) { + struct btrfs_key found_key; + + if (path->slots[0] >= btrfs_header_nritems(leaf)) { + int no_more_keys = find_next_key(path, &key); + + btrfs_release_path(path); + if (trans) { + ret = btrfs_commit_transaction(trans, + info->tree_root); + trans = NULL; + if (ret < 0) + goto out; + } + need_trans = 0; + if (no_more_keys) + break; + goto again; + } + + btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); + + if (found_key.type != BTRFS_ROOT_ITEM_KEY) + goto next; + + ret = maybe_repair_root_item(info, path, &found_key, + trans ? 0 : 1); + if (ret < 0) + goto out; + if (ret) { + if (!trans && repair) { + need_trans = 1; + key = found_key; + btrfs_release_path(path); + goto again; + } + bad_roots++; + } +next: + path->slots[0]++; + } + ret = 0; +out: + free_roots_info_cache(); + if (path) + btrfs_free_path(path); + if (ret < 0) + return ret; + + return bad_roots; +} + static struct option long_options[] = { { "super", 1, NULL, 's' }, { "repair", 0, NULL, 0 }, @@ -7320,6 +7659,23 @@ int cmd_check(int argc, char **argv) } root = info->fs_root; + + ret = repair_root_items(info); + if (ret < 0) + goto close_out; + if (repair) { + fprintf(stderr, "Fixed %d roots.\n", ret); + ret = 0; + } else if (ret > 0) { + fprintf(stderr, + "Found %d roots with an outdated root item.\n", + ret); + fprintf(stderr, + "Please run a filesystem check with the option --repair to fix them.\n"); + ret = 1; + goto close_out; + } + /* * repair mode will force us to commit transaction which * will make us fail to load log tree when mounting. diff --git a/disk-io.c b/disk-io.c index 0c4cb4a..0364b96 100644 --- a/disk-io.c +++ b/disk-io.c @@ -475,6 +475,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, if (root->commit_root == root->node) goto commit_tree; + if (root == root->fs_info->tree_root) + goto commit_tree; free_extent_buffer(root->commit_root); root->commit_root = NULL; diff --git a/extent-tree.c b/extent-tree.c index 5443ec8..080f30d 100644 --- a/extent-tree.c +++ b/extent-tree.c @@ -29,6 +29,7 @@ #include "volumes.h" #include "free-space-cache.h" #include "math.h" +#include "utils.h" #define PENDING_EXTENT_INSERT 0 #define PENDING_EXTENT_DELETE 1 @@ -972,27 +973,6 @@ static inline int extent_ref_type(u64 parent, u64 owner) return type; } -static int find_next_key(struct btrfs_path *path, struct btrfs_key *key) - -{ - int level; - for (level = 0; level < BTRFS_MAX_LEVEL; level++) { - if (!path->nodes[level]) - break; - if (path->slots[level] + 1 >= - btrfs_header_nritems(path->nodes[level])) - continue; - if (level == 0) - btrfs_item_key_to_cpu(path->nodes[level], key, - path->slots[level] + 1); - else - btrfs_node_key_to_cpu(path->nodes[level], key, - path->slots[level] + 1); - return 0; - } - return 1; -} - static int lookup_inline_extent_backref(struct btrfs_trans_handle *trans, struct btrfs_root *root, struct btrfs_path *path, diff --git a/tests/fsck-tests.sh b/tests/fsck-tests.sh index 867366b..3f04626 100644 --- a/tests/fsck-tests.sh +++ b/tests/fsck-tests.sh @@ -27,12 +27,23 @@ rm -f $RESULT # test rely on corrupting blocks tool run_check make btrfs-corrupt-block -for i in $(find $here/tests/fsck-tests -name '*.img') +# Some broken filesystem images are kept as .img files, created by the tool +# btrfs-image, and others are kept as .tar.xz files that contain raw filesystem +# image (the backing file of a loop device, as a sparse file). The reason for +# keeping some as tarballs of raw images is that for these cases btrfs-image +# isn't able to preserve all the (bad) filesystem structure for some reason. +for i in $(find $here/tests/fsck-tests -name '*.img' -o -name '*.tar.xz') do echo " [TEST] $(basename $i)" echo "testing image $i" >> $RESULT - run_check $here/btrfs-image -r $i test.img + extension=${i#*.} + + if [ $extension == "img" ]; then + run_check $here/btrfs-image -r $i test.img + else + run_check tar xJf $i + fi $here/btrfsck test.img >> $RESULT 2>&1 [ $? -eq 0 ] && _fail "btrfsck should have detected corruption" diff --git a/tests/fsck-tests/006-bad_root_items_fs.tar.xz b/tests/fsck-tests/006-bad_root_items_fs.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..125d8e7d236fdd80c69bb67a0489afde345e1d5d GIT binary patch literal 24980 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 P6c;-%0{{R300dcDMYoOX literal 0 HcmV?d00001 diff --git a/utils.c b/utils.c index e86292a..a26858e 100644 --- a/utils.c +++ b/utils.c @@ -2405,3 +2405,24 @@ void units_set_base(unsigned *units, unsigned base) *units = base | mode; } + +int find_next_key(struct btrfs_path *path, struct btrfs_key *key) +{ + int level; + + for (level = 0; level < BTRFS_MAX_LEVEL; level++) { + if (!path->nodes[level]) + break; + if (path->slots[level] + 1 >= + btrfs_header_nritems(path->nodes[level])) + continue; + if (level == 0) + btrfs_item_key_to_cpu(path->nodes[level], key, + path->slots[level] + 1); + else + btrfs_node_key_to_cpu(path->nodes[level], key, + path->slots[level] + 1); + return 0; + } + return 1; +} diff --git a/utils.h b/utils.h index aed03f2..7accbd2 100644 --- a/utils.h +++ b/utils.h @@ -158,4 +158,6 @@ static inline u64 btrfs_min_dev_size(u32 leafsize) btrfs_min_global_blk_rsv_size(leafsize)); } +int find_next_key(struct btrfs_path *path, struct btrfs_key *key); + #endif