From patchwork Mon Aug 12 06:19:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 11089357 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C789F13AC for ; Mon, 12 Aug 2019 06:19:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B9072228C9 for ; Mon, 12 Aug 2019 06:19:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AD54D26E47; Mon, 12 Aug 2019 06:19:25 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 335AA228C9 for ; Mon, 12 Aug 2019 06:19:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726483AbfHLGTY (ORCPT ); Mon, 12 Aug 2019 02:19:24 -0400 Received: from mx2.suse.de ([195.135.220.15]:50310 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726405AbfHLGTY (ORCPT ); Mon, 12 Aug 2019 02:19:24 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 8E4CEAC63 for ; Mon, 12 Aug 2019 06:19:22 +0000 (UTC) From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH v2 1/3] btrfs-progs: check/lowmem: Check and repair root generation Date: Mon, 12 Aug 2019 14:19:06 +0800 Message-Id: <20190812061908.21002-2-wqu@suse.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190812061908.21002-1-wqu@suse.com> References: <20190812061908.21002-1-wqu@suse.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Since kernel is going to reject any root item which is newer than super block generation, we need to provide a way to fix such problem in btrfs-check. This patch addes the ability to report and repair root generation in lowmem mode. This is done by cowing the root node, so we will update the root generation along with the root node generation at commit transaction time. Signed-off-by: Qu Wenruo --- check/main.c | 36 ------------------------------------ check/mode-common.c | 36 ++++++++++++++++++++++++++++++++++++ check/mode-common.h | 1 + check/mode-lowmem.c | 17 +++++++++++++++++ check/mode-lowmem.h | 1 + 5 files changed, 55 insertions(+), 36 deletions(-) diff --git a/check/main.c b/check/main.c index 0cc6fdba0289..98b07fcb58c8 100644 --- a/check/main.c +++ b/check/main.c @@ -9024,42 +9024,6 @@ again: return ret; } -static int recow_extent_buffer(struct btrfs_root *root, struct extent_buffer *eb) -{ - struct btrfs_path path; - struct btrfs_trans_handle *trans; - struct btrfs_key key; - int ret; - - printf("Recowing metadata block %llu\n", eb->start); - key.objectid = btrfs_header_owner(eb); - key.type = BTRFS_ROOT_ITEM_KEY; - key.offset = (u64)-1; - - root = btrfs_read_fs_root(root->fs_info, &key); - if (IS_ERR(root)) { - fprintf(stderr, "Couldn't find owner root %llu\n", - key.objectid); - return PTR_ERR(root); - } - - trans = btrfs_start_transaction(root, 1); - if (IS_ERR(trans)) - return PTR_ERR(trans); - - btrfs_init_path(&path); - path.lowest_level = btrfs_header_level(eb); - if (path.lowest_level) - btrfs_node_key_to_cpu(eb, &key, 0); - else - btrfs_item_key_to_cpu(eb, &key, 0); - - ret = btrfs_search_slot(trans, root, &key, &path, 0, 1); - btrfs_commit_transaction(trans, root); - btrfs_release_path(&path); - return ret; -} - static int delete_bad_item(struct btrfs_root *root, struct bad_item *bad) { struct btrfs_path path; diff --git a/check/mode-common.c b/check/mode-common.c index d5f6c8ef97b1..195b6efaa7aa 100644 --- a/check/mode-common.c +++ b/check/mode-common.c @@ -924,3 +924,39 @@ int check_repair_free_space_inode(struct btrfs_fs_info *fs_info, } return ret; } + +int recow_extent_buffer(struct btrfs_root *root, struct extent_buffer *eb) +{ + struct btrfs_path path; + struct btrfs_trans_handle *trans; + struct btrfs_key key; + int ret; + + printf("Recowing metadata block %llu\n", eb->start); + key.objectid = btrfs_header_owner(eb); + key.type = BTRFS_ROOT_ITEM_KEY; + key.offset = (u64)-1; + + root = btrfs_read_fs_root(root->fs_info, &key); + if (IS_ERR(root)) { + fprintf(stderr, "Couldn't find owner root %llu\n", + key.objectid); + return PTR_ERR(root); + } + + trans = btrfs_start_transaction(root, 1); + if (IS_ERR(trans)) + return PTR_ERR(trans); + + btrfs_init_path(&path); + path.lowest_level = btrfs_header_level(eb); + if (path.lowest_level) + btrfs_node_key_to_cpu(eb, &key, 0); + else + btrfs_item_key_to_cpu(eb, &key, 0); + + ret = btrfs_search_slot(trans, root, &key, &path, 0, 1); + btrfs_commit_transaction(trans, root); + btrfs_release_path(&path); + return ret; +} diff --git a/check/mode-common.h b/check/mode-common.h index 4c169c6e3b29..161b84a8deb0 100644 --- a/check/mode-common.h +++ b/check/mode-common.h @@ -155,4 +155,5 @@ static inline bool is_valid_imode(u32 imode) return true; } +int recow_extent_buffer(struct btrfs_root *root, struct extent_buffer *eb); #endif diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c index a2be0e6d7034..da6b6fd86ae3 100644 --- a/check/mode-lowmem.c +++ b/check/mode-lowmem.c @@ -4957,6 +4957,7 @@ static int check_btrfs_root(struct btrfs_root *root, int check_all) struct btrfs_path path; struct node_refs nrefs; struct btrfs_root_item *root_item = &root->root_item; + u64 super_generation = btrfs_super_generation(root->fs_info->super_copy); int ret; int level; int err = 0; @@ -4978,6 +4979,22 @@ static int check_btrfs_root(struct btrfs_root *root, int check_all) level = btrfs_header_level(root->node); btrfs_init_path(&path); + if (btrfs_root_generation(root_item) > super_generation + 1) { + error( + "invalid root generation for root %llu, have %llu expect (0, %llu)", + root->root_key.objectid, btrfs_root_generation(root_item), + super_generation + 1); + err |= INVALID_GENERATION; + if (repair) { + root->node->flags |= EXTENT_BAD_TRANSID; + ret = recow_extent_buffer(root, root->node); + if (!ret) { + printf("Reset generation for root %llu\n", + root->root_key.objectid); + err &= ~INVALID_GENERATION; + } + } + } if (btrfs_root_refs(root_item) > 0 || btrfs_disk_key_objectid(&root_item->drop_progress) == 0) { path.nodes[level] = root->node; diff --git a/check/mode-lowmem.h b/check/mode-lowmem.h index d2983fd12eb4..0361fb3382b1 100644 --- a/check/mode-lowmem.h +++ b/check/mode-lowmem.h @@ -47,6 +47,7 @@ #define INODE_FLAGS_ERROR (1<<23) /* Invalid inode flags */ #define DIR_ITEM_HASH_MISMATCH (1<<24) /* Dir item hash mismatch */ #define INODE_MODE_ERROR (1<<25) /* Bad inode mode */ +#define INVALID_GENERATION (1<<26) /* Generation is too new */ /* * Error bit for low memory mode check. From patchwork Mon Aug 12 06:19:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 11089359 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6CD3D912 for ; Mon, 12 Aug 2019 06:19:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5EB6B228C9 for ; Mon, 12 Aug 2019 06:19:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5352426E47; Mon, 12 Aug 2019 06:19:27 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F235C228C9 for ; Mon, 12 Aug 2019 06:19:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726486AbfHLGT0 (ORCPT ); Mon, 12 Aug 2019 02:19:26 -0400 Received: from mx2.suse.de ([195.135.220.15]:50316 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726185AbfHLGT0 (ORCPT ); Mon, 12 Aug 2019 02:19:26 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 1B5C6AC63 for ; Mon, 12 Aug 2019 06:19:25 +0000 (UTC) From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH v2 2/3] btrfs-progs: check/original: Check and repair root item geneartion Date: Mon, 12 Aug 2019 14:19:07 +0800 Message-Id: <20190812061908.21002-3-wqu@suse.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190812061908.21002-1-wqu@suse.com> References: <20190812061908.21002-1-wqu@suse.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add such ability to original mode to fix root generation mismatch, which can be rejected by kernel. Signed-off-by: Qu Wenruo --- check/main.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/check/main.c b/check/main.c index 98b07fcb58c8..ae3ce13e9466 100644 --- a/check/main.c +++ b/check/main.c @@ -3437,8 +3437,10 @@ static int check_fs_root(struct btrfs_root *root, { int ret = 0; int err = 0; + bool generation_err = false; int wret; int level; + u64 super_generation; struct btrfs_path path; struct shared_node root_node; struct root_record *rec; @@ -3449,6 +3451,23 @@ static int check_fs_root(struct btrfs_root *root, struct unaligned_extent_rec_t *urec; struct unaligned_extent_rec_t *tmp; + super_generation = btrfs_super_generation(root->fs_info->super_copy); + if (btrfs_root_generation(root_item) > super_generation + 1) { + error( + "invalid generation for root %llu, have %llu expect (0, %llu]", + root->root_key.objectid, btrfs_root_generation(root_item), + super_generation + 1); + generation_err = true; + if (repair) { + root->node->flags |= EXTENT_BAD_TRANSID; + ret = recow_extent_buffer(root, root->node); + if (!ret) { + printf("Reset generation for root %llu\n", + root->root_key.objectid); + generation_err = false; + } + } + } /* * Reuse the corrupt_block cache tree to record corrupted tree block * @@ -3597,6 +3616,8 @@ skip_walking: free_corrupt_blocks_tree(&corrupt_blocks); root->fs_info->corrupt_blocks = NULL; + if (!ret && generation_err) + ret = -1; return ret; } From patchwork Mon Aug 12 06:19:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 11089361 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 287FA13AC for ; Mon, 12 Aug 2019 06:19:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 16F81228C9 for ; Mon, 12 Aug 2019 06:19:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 07ABA26E47; Mon, 12 Aug 2019 06:19:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8DBF2228C9 for ; Mon, 12 Aug 2019 06:19:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726987AbfHLGTf (ORCPT ); Mon, 12 Aug 2019 02:19:35 -0400 Received: from mx2.suse.de ([195.135.220.15]:50348 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726185AbfHLGTe (ORCPT ); Mon, 12 Aug 2019 02:19:34 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id D5700AC63 for ; Mon, 12 Aug 2019 06:19:33 +0000 (UTC) From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH v2 3/3] btrfs-progs: fsck-tests: Add test case for invalid root generation Date: Mon, 12 Aug 2019 14:19:08 +0800 Message-Id: <20190812061908.21002-4-wqu@suse.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190812061908.21002-1-wqu@suse.com> References: <20190812061908.21002-1-wqu@suse.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The image contains a fs tree whose generation is over 100 larger than super block generation. Signed-off-by: Qu Wenruo --- .../041-invalid-root-generation/default_case.img | Bin 0 -> 3072 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/fsck-tests/041-invalid-root-generation/default_case.img GIT binary patch literal 3072 zcmeB9n_BcpHD)gZ6tDnkMlb?0gn%pthX4@Czy>BSfXQ_r0fviUb|5pDGfIqxz-R~z zy%4ClwfpC>Btd4mfEQECdaGAmZV8>XXi|>uFI66%o`gcT6*YS%y9Y!S?9tcuX+Esl zF~yldnNQhLK}2{)N;B6XQSOE>PKFciax94`lz7sS!>ruK%Dbk3IZ;A?N9EVRNcQIV zGhgNx#`NdqtUUDP*9o@&3lom8F_?7PCMGm2eap6FN>9MTmP6?*>b7cARJbno&wC*7 zNqobp%ZHl+4Y=G6YDlmyP7qnZlyO6pv1r+b1Y$D#jUru?XwR#NF4w8{7?HWRd4q2!fQ8O zUAOb8K8VsPd7-vqiqlocgN_;=(=RQpUNHNC^ox53mnMZ57M7F*7i)QXD8IYUAM>v0 z{N2BC2QRPvdqvgZ^RvRTuW@z1PsJ}!YQ8ghiqF>j;k(wX34CsPb=8-(AIraO-nGu1 z|NEhK%SRSEpC2p5i&PebOj8Q3-l)|v<6YCa>YJic^Q6BS73$zfV0uDUwK==yT0j1E zpVxVQ;PTqb`#yc&T_Jbs?cL+g>~_xZztvZDWWC-c;r)BQ{In6BV;(yFiROHpr?;-Z zegFTtXN${vBMc5zg?3!kp^?{Y;^j)=xBlfw8 zlW%4jzu9zFB}3>)lJO0_8#OHV4{XU-?7peA=#c4}2b(_rKK19EWpP^A)+JJMKPq0= z@7KBYxpZ&Hx&HY5PB&bi*Of@RpUkn)tuJ#snI^5jyZzvkUDJ2Zn>k@$ZS~h19Enq3 ziR3+8UZ{uW*9Y>cPBQ8B(q`{ZYfSyVcK`oK&3)hJom4*%A?XWr?H&INnNS(_58G$^ zUYjAqW0K&&)wQf+$5(+VztVSKj9waWA-lCnS0ubE$Un|3g5Ocg+ti$Yuc)Yt|D%(k z0{mKPf-Dp7?73z?UF4-=UfHwUvh>aMCdbTv{FE`$|6E(2_Kf$i_fK>{fzI~H+M^$hnq=pf7SlF zw7jpqpj{kPvm=3q|9d}vsd#eTes%LNpk{Nn>;I2eetub~Ww~bCKQpHlTcz@4_#eIt zdmXY)yF!y~s!D}@-0{w|f_$UU@(&4W8Apz$-^yN7+W%wkoW2z)P4ANfPP51#T`-YT z@3_L6a`vm=q-H+2`Hcg~Mj*4HS$C~9|4pmU{l$l^MA}MEq+5w>l2vOj-LY}%i`xq& z@)u8hJ?quKMB{$`-9I*36ffQVytY;@Va|(%Q)_ZBe15m`zrXg~_N)KJt@KUwzUBTA zI8Zk8zw%wjp!fe>@+VCB>i^bgQR!#<>DA5G9?35Qw@;89z#h1}&+gjfQ(1w9V~JG@aNa``SJJi_T1)? z%aH57X=*0teQm}Ww$J@)j(fQ{&c6GpIf=M%5dJv_Mpr)_kDhE zIsducZ{9!ax3~Y=)@**x6!!g-+_9JE!uj>{&*|l@$uSXo75>V*dheOK{__2z&cDvx nefQhqUU6Ej{%?zS=?|{uL?@r!*7`x*L{ifYDbz-p!#M;1<_P#~ literal 0 HcmV?d00001 diff --git a/tests/fsck-tests/041-invalid-root-generation/default_case.img b/tests/fsck-tests/041-invalid-root-generation/default_case.img new file mode 100644 index 0000000000000000000000000000000000000000..4a2c8d88a1a885fb9bcae56adc98dcbe75681441