From patchwork Mon Oct 8 12:30:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 10630597 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 AEA2614BD for ; Mon, 8 Oct 2018 12:30:55 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9FA6428EE2 for ; Mon, 8 Oct 2018 12:30:55 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9B0C628E98; Mon, 8 Oct 2018 12:30:55 +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 278F928F2D for ; Mon, 8 Oct 2018 12:30:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726563AbeJHTmX (ORCPT ); Mon, 8 Oct 2018 15:42:23 -0400 Received: from mx2.suse.de ([195.135.220.15]:60230 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726056AbeJHTmX (ORCPT ); Mon, 8 Oct 2018 15:42:23 -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 3D306AFDC for ; Mon, 8 Oct 2018 12:30:52 +0000 (UTC) From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH v3 1/6] btrfs-progs: image: Use correct device size when restoring Date: Mon, 8 Oct 2018 20:30:39 +0800 Message-Id: <20181008123044.13413-2-wqu@suse.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181008123044.13413-1-wqu@suse.com> References: <20181008123044.13413-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 When restoring btrfs image, the total_bytes of device item is not updated correctly. In fact total_bytes can be left 0 for restored image. It doesn't trigger any error because btrfs check never checks total_bytes of dev item. However this is going to change. Fix it by populating total_bytes of device item with the end position of last dev extent to make later btrfs check happy. Signed-off-by: Qu Wenruo Reviewed-by: Nikolay Borisov --- image/main.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/image/main.c b/image/main.c index 351c5a256938..d5b89bc3149f 100644 --- a/image/main.c +++ b/image/main.c @@ -2082,15 +2082,17 @@ static void remap_overlapping_chunks(struct mdrestore_struct *mdres) } static int fixup_devices(struct btrfs_fs_info *fs_info, - struct mdrestore_struct *mdres, off_t dev_size) + struct mdrestore_struct *mdres, int out_fd) { struct btrfs_trans_handle *trans; struct btrfs_dev_item *dev_item; + struct btrfs_dev_extent *dev_ext; struct btrfs_path path; struct extent_buffer *leaf; struct btrfs_root *root = fs_info->chunk_root; struct btrfs_key key; u64 devid, cur_devid; + u64 dev_size; /* Get from last dev extents */ int ret; trans = btrfs_start_transaction(fs_info->tree_root, 1); @@ -2101,16 +2103,56 @@ static int fixup_devices(struct btrfs_fs_info *fs_info, dev_item = &fs_info->super_copy->dev_item; + btrfs_init_path(&path); devid = btrfs_stack_device_id(dev_item); + key.objectid = devid; + key.type = BTRFS_DEV_EXTENT_KEY; + key.offset = (u64)-1; + + ret = btrfs_search_slot(NULL, fs_info->dev_root, &key, &path, 0, 0); + if (ret < 0) { + error("failed to locate last dev extent of devid %llu: %s", + devid, strerror(-ret)); + btrfs_release_path(&path); + return ret; + } + if (ret == 0) { + error("found invalid dev extent devid %llu offset -1", + devid); + btrfs_release_path(&path); + return -EUCLEAN; + } + ret = btrfs_previous_item(fs_info->dev_root, &path, devid, + BTRFS_DEV_EXTENT_KEY); + if (ret > 0) + ret = -ENOENT; + if (ret < 0) { + error("failed to locate last dev extent of devid %llu: %s", + devid, strerror(-ret)); + btrfs_release_path(&path); + return ret; + } + + btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]); + dev_ext = btrfs_item_ptr(path.nodes[0], path.slots[0], + struct btrfs_dev_extent); + dev_size = key.offset + btrfs_dev_extent_length(path.nodes[0], dev_ext); + btrfs_release_path(&path); + btrfs_set_stack_device_total_bytes(dev_item, dev_size); btrfs_set_stack_device_bytes_used(dev_item, mdres->alloced_chunks); + /* Don't forget to enlarge the real file */ + ret = ftruncate64(out_fd, dev_size); + if (ret < 0) { + error("failed to enlarge result image: %s", strerror(errno)); + return -errno; + } key.objectid = BTRFS_DEV_ITEMS_OBJECTID; key.type = BTRFS_DEV_ITEM_KEY; key.offset = 0; - btrfs_init_path(&path); again: ret = btrfs_search_slot(trans, root, &key, &path, -1, 1); @@ -2275,7 +2317,7 @@ static int restore_metadump(const char *input, FILE *out, int old_restore, return 1; } - ret = fixup_devices(info, &mdrestore, st.st_size); + ret = fixup_devices(info, &mdrestore, fileno(out)); close_ctree(info->chunk_root); if (ret) goto out; From patchwork Mon Oct 8 12:30:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 10630599 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 0282314BD for ; Mon, 8 Oct 2018 12:30:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EA84C28F30 for ; Mon, 8 Oct 2018 12:30:57 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E811728F35; Mon, 8 Oct 2018 12:30:57 +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 8621828ECB for ; Mon, 8 Oct 2018 12:30:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726567AbeJHTmZ (ORCPT ); Mon, 8 Oct 2018 15:42:25 -0400 Received: from mx2.suse.de ([195.135.220.15]:60246 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726056AbeJHTmZ (ORCPT ); Mon, 8 Oct 2018 15:42:25 -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 C3450AFDB for ; Mon, 8 Oct 2018 12:30:54 +0000 (UTC) From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH v3 2/6] btrfs-progs: lowmem check: Add check for overlapping dev extents Date: Mon, 8 Oct 2018 20:30:40 +0800 Message-Id: <20181008123044.13413-3-wqu@suse.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181008123044.13413-1-wqu@suse.com> References: <20181008123044.13413-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 check at check_dev_item(), since at that timing we're also iterating dev extents for dev item accounting. Signed-off-by: Qu Wenruo Reviewed-by: Su Yue --- check/mode-lowmem.c | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c index 1bce44f5658a..07c03cad77af 100644 --- a/check/mode-lowmem.c +++ b/check/mode-lowmem.c @@ -4065,6 +4065,8 @@ static int check_dev_item(struct btrfs_fs_info *fs_info, u64 dev_id; u64 used; u64 total = 0; + u64 prev_devid = 0; + u64 prev_dev_ext_end = 0; int ret; dev_item = btrfs_item_ptr(eb, slot, struct btrfs_dev_item); @@ -4086,8 +4088,16 @@ static int check_dev_item(struct btrfs_fs_info *fs_info, return REFERENCER_MISSING; } - /* Iterate dev_extents to calculate the used space of a device */ + /* + * Iterate dev_extents to calculate the used space of a device + * + * Also make sure no dev extents overlap and end beyond device boundary + */ while (1) { + u64 devid; + u64 physical_offset; + u64 physical_len; + if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) goto next; @@ -4099,7 +4109,27 @@ static int check_dev_item(struct btrfs_fs_info *fs_info, ptr = btrfs_item_ptr(path.nodes[0], path.slots[0], struct btrfs_dev_extent); - total += btrfs_dev_extent_length(path.nodes[0], ptr); + devid = key.objectid; + physical_offset = key.offset; + physical_len = btrfs_dev_extent_length(path.nodes[0], ptr); + + if (prev_devid == devid && physical_offset < prev_dev_ext_end) { + error( +"dev extent devid %llu offset %llu len %llu overlap with previous dev extent end %llu", + devid, physical_offset, physical_len, + prev_dev_ext_end); + return ACCOUNTING_MISMATCH; + } + if (physical_offset + physical_len > total_bytes) { + error( +"dev extent devid %llu offset %llu len %llu is beyond device boundary %llu", + devid, physical_offset, physical_len, + total_bytes); + return ACCOUNTING_MISMATCH; + } + prev_devid = devid; + prev_dev_ext_end = physical_offset + physical_len; + total += physical_len; next: ret = btrfs_next_item(dev_root, &path); if (ret) From patchwork Mon Oct 8 12:30:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 10630601 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 E64DD933 for ; Mon, 8 Oct 2018 12:30:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D926D28E93 for ; Mon, 8 Oct 2018 12:30:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CD9DF28F29; Mon, 8 Oct 2018 12:30:59 +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 2F3AC28F30 for ; Mon, 8 Oct 2018 12:30:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726579AbeJHTm1 (ORCPT ); Mon, 8 Oct 2018 15:42:27 -0400 Received: from mx2.suse.de ([195.135.220.15]:60254 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726056AbeJHTm1 (ORCPT ); Mon, 8 Oct 2018 15:42:27 -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 4E466AFDC for ; Mon, 8 Oct 2018 12:30:56 +0000 (UTC) From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH v3 3/6] btrfs-progs: original check: Add ability to detect bad dev extents Date: Mon, 8 Oct 2018 20:30:41 +0800 Message-Id: <20181008123044.13413-4-wqu@suse.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181008123044.13413-1-wqu@suse.com> References: <20181008123044.13413-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 Unlike lowmem mode check, we don't have good place for original mode to check overlap dev extents. So this patch introduces a new function, btrfs_check_dev_extents(), to handle possible bad dev extents. Reported-by: Hans van Kranenburg Signed-off-by: Qu Wenruo Reviewed-by: Su Yue --- check/main.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/check/main.c b/check/main.c index bc2ee22f7943..ff9a785ce555 100644 --- a/check/main.c +++ b/check/main.c @@ -8224,6 +8224,99 @@ out: return ret; } +/* + * Check if all dev extents are valid (not overlap nor beyond device + * boundary). + * + * Dev extents <-> chunk cross checking is already done in check_chunks(). + */ +static int check_dev_extents(struct btrfs_fs_info *fs_info) +{ + struct btrfs_path path; + struct btrfs_key key; + struct btrfs_root *dev_root = fs_info->dev_root; + int ret; + u64 prev_devid = 0; + u64 prev_dev_ext_end = 0; + + btrfs_init_path(&path); + + key.objectid = 1; + key.type = BTRFS_DEV_EXTENT_KEY; + key.offset = 0; + + ret = btrfs_search_slot(NULL, dev_root, &key, &path, 0, 0); + if (ret < 0) { + error("failed to search device tree: %s", strerror(-ret)); + goto out; + } + if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) { + ret = btrfs_next_leaf(dev_root, &path); + if (ret < 0) { + error("failed to find next leaf: %s", strerror(-ret)); + goto out; + } + if (ret > 0) { + ret = 0; + goto out; + } + } + + while (1) { + struct btrfs_dev_extent *dev_ext; + struct btrfs_device *dev; + u64 devid; + u64 physical_offset; + u64 physical_len; + + btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]); + if (key.type != BTRFS_DEV_EXTENT_KEY) + break; + dev_ext = btrfs_item_ptr(path.nodes[0], path.slots[0], + struct btrfs_dev_extent); + devid = key.objectid; + physical_offset = key.offset; + physical_len = btrfs_dev_extent_length(path.nodes[0], dev_ext); + + dev = btrfs_find_device(fs_info, devid, NULL, NULL); + if (!dev) { + error("failed to find device with devid %llu", devid); + ret = -EUCLEAN; + goto out; + } + if (prev_devid == devid && prev_dev_ext_end > physical_offset) { + error( +"dev extent devid %llu physical offset %llu overlap with previous dev extent end %llu", + devid, physical_offset, prev_dev_ext_end); + ret = -EUCLEAN; + goto out; + } + if (physical_offset + physical_len > dev->total_bytes) { + error( +"dev extent devid %llu physical offset %llu len %llu is beyond device boudnary %llu", + devid, physical_offset, physical_len, + dev->total_bytes); + ret = -EUCLEAN; + goto out; + } + prev_devid = devid; + prev_dev_ext_end = physical_offset + physical_len; + + ret = btrfs_next_item(dev_root, &path); + if (ret < 0) { + error("failed to find next leaf: %s", strerror(-ret)); + goto out; + } + if (ret > 0) { + ret = 0; + break; + } + } +out: + btrfs_release_path(&path); + return ret; +} + static int check_chunks_and_extents(struct btrfs_fs_info *fs_info) { struct rb_root dev_cache; @@ -8318,6 +8411,12 @@ again: goto out; } + ret = check_dev_extents(fs_info); + if (ret < 0) { + err = ret; + goto out; + } + ret = check_chunks(&chunk_cache, &block_group_cache, &dev_extent_cache, NULL, NULL, NULL, 0); if (ret) { From patchwork Mon Oct 8 12:30:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 10630603 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 8DF52933 for ; Mon, 8 Oct 2018 12:31:01 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 761B228F69 for ; Mon, 8 Oct 2018 12:31:01 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 73D4428F54; Mon, 8 Oct 2018 12:31:01 +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 1C52128F3F for ; Mon, 8 Oct 2018 12:31:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726582AbeJHTm3 (ORCPT ); Mon, 8 Oct 2018 15:42:29 -0400 Received: from mx2.suse.de ([195.135.220.15]:60272 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726056AbeJHTm3 (ORCPT ); Mon, 8 Oct 2018 15:42:29 -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 A462FAFDB for ; Mon, 8 Oct 2018 12:30:58 +0000 (UTC) From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH v3 4/6] btrfs-progs: lowmem check: Add dev_item check for used bytes and total bytes Date: Mon, 8 Oct 2018 20:30:42 +0800 Message-Id: <20181008123044.13413-5-wqu@suse.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181008123044.13413-1-wqu@suse.com> References: <20181008123044.13413-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 Obviously, used bytes can't be larger than total bytes. Signed-off-by: Qu Wenruo --- check/mode-lowmem.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c index 07c03cad77af..1173b963b8f3 100644 --- a/check/mode-lowmem.c +++ b/check/mode-lowmem.c @@ -4074,6 +4074,11 @@ static int check_dev_item(struct btrfs_fs_info *fs_info, used = btrfs_device_bytes_used(eb, dev_item); total_bytes = btrfs_device_total_bytes(eb, dev_item); + if (used > total_bytes) { + error("device %llu has incorrect used bytes %llu > total bytes %llu", + dev_id, used, total_bytes); + return ACCOUNTING_MISMATCH; + } key.objectid = dev_id; key.type = BTRFS_DEV_EXTENT_KEY; key.offset = 0; From patchwork Mon Oct 8 12:30:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 10630605 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 1853815E2 for ; Mon, 8 Oct 2018 12:31:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0C6A728DE6 for ; Mon, 8 Oct 2018 12:31:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0B10A28E98; Mon, 8 Oct 2018 12:31:04 +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 A81E528E60 for ; Mon, 8 Oct 2018 12:31:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726596AbeJHTmb (ORCPT ); Mon, 8 Oct 2018 15:42:31 -0400 Received: from mx2.suse.de ([195.135.220.15]:60284 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726056AbeJHTmb (ORCPT ); Mon, 8 Oct 2018 15:42:31 -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 0D52AAFDB for ; Mon, 8 Oct 2018 12:31:01 +0000 (UTC) From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH v3 5/6] btrfs-progs: original check: Add dev_item check for used bytes and total bytes Date: Mon, 8 Oct 2018 20:30:43 +0800 Message-Id: <20181008123044.13413-6-wqu@suse.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181008123044.13413-1-wqu@suse.com> References: <20181008123044.13413-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 Signed-off-by: Qu Wenruo --- check/main.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/check/main.c b/check/main.c index ff9a785ce555..12f12e18a83f 100644 --- a/check/main.c +++ b/check/main.c @@ -7938,6 +7938,12 @@ static int check_device_used(struct device_record *dev_rec, struct device_extent_record *dev_extent_rec; u64 total_byte = 0; + if (dev_rec->byte_used > dev_rec->total_byte) { + error("device %llu has incorrect used bytes %llu > total bytes %llu", + dev_rec->devid, dev_rec->byte_used, dev_rec->total_byte); + return -EUCLEAN; + } + cache = search_cache_extent2(&dext_cache->tree, dev_rec->devid, 0); while (cache) { dev_extent_rec = container_of(cache, From patchwork Mon Oct 8 12:30:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 10630607 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 CF6DF14BD for ; Mon, 8 Oct 2018 12:31:07 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C0DD028EF6 for ; Mon, 8 Oct 2018 12:31:07 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BF1B628F71; Mon, 8 Oct 2018 12:31:07 +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 2EAD528EC4 for ; Mon, 8 Oct 2018 12:31:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726608AbeJHTmf (ORCPT ); Mon, 8 Oct 2018 15:42:35 -0400 Received: from mx2.suse.de ([195.135.220.15]:60298 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726056AbeJHTmf (ORCPT ); Mon, 8 Oct 2018 15:42:35 -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 B447FAFDC for ; Mon, 8 Oct 2018 12:31:03 +0000 (UTC) From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH v3 6/6] btrfs-progs: fsck-tests: Add test image for dev extents beyond device boundary Date: Mon, 8 Oct 2018 20:30:44 +0800 Message-Id: <20181008123044.13413-7-wqu@suse.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181008123044.13413-1-wqu@suse.com> References: <20181008123044.13413-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 Now two locations can detect such problem, either by device item used/total bytes check, or by early dev extents check against device boundary. The image is hand-crafted image which uses DATA SINGLE chunk to feed btrfs check. As expected, as long as block group item, chunk item, device used bytes matches, older btrfs check can't detect such problem. Signed-off-by: Qu Wenruo --- .../over_dev_boundary.img.xz | Bin 0 -> 1640 bytes tests/fsck-tests/036-bad-dev-extents/test.sh | 20 ++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 tests/fsck-tests/036-bad-dev-extents/over_dev_boundary.img.xz create mode 100755 tests/fsck-tests/036-bad-dev-extents/test.sh diff --git a/tests/fsck-tests/036-bad-dev-extents/over_dev_boundary.img.xz b/tests/fsck-tests/036-bad-dev-extents/over_dev_boundary.img.xz new file mode 100644 index 0000000000000000000000000000000000000000..47cb2a707b0097e369dc088ed0549f847995f136 GIT binary patch literal 1640 zcmV-u2ABE$H+ooF000E$*0e?f03iVu0001VFXf})3;zZsT>wRyj;C3^v%$$4d1oRm zhA1@4%tH=9jYF%IQSpIUKDpjXLRl?q4p$q;1zsY^#9_Lx=#tbGm>@S#e2aqt!?0}y z2BPO%4~c9Q5)jKFD7}DURarKL)`^j{f&YXRZFN7?s>sEHdzmSvX^98%kGi<&Wr9_8 zMnXynsC*B7}KE(6w>*wfdb|tw$kt^y>W+TB*?pon1P+)#u#?6bSIG)TooJx~u$# zf^+}xKw`BfI}6=717S~Q%LW1kwY`pz9H{`uNNNFOk2w!VauNEaMfoLj)Z<)!1?F60 zJ+OEA|4$a=9W#XX*l{EG!j^s}p| z0i#_%$Q}d)-EE8#8O5^x$&V$8Y0l2 zc19e0Et3O3m`pMOqEkasL8VGE+u~2lZn>sRCRj169Z6mQ3*+`D+C#F1V7POV%lx(9cB{WN*9OP%Zbd1VDn(S4HX^ad4-b~#H z@9eUP4AAU`)yRf!k+rrrLSYfBSEi6RE#HtbqyPl11S>RCH zqvJbt22t`FmU^tmTb+7LtpybCB-x1lGSlrpVQ9|6WNBs~q*M-to1gD1l41oiy~}+O?!{68Jvim2*%BznW)@B=3IH)Xi1795q{#>sF*y^0T2@b$`Wqwch&z?BgN}IR9Ui&GZjmedlGizBd0T z;!cs&L)hJFGsJmFaiUsYrN$c0^BLU^n-B%fagn+jR{?Dq+K%VyMG@pmAOShFY)k8zBxm@7YD zb^ZXU;<`+_B+IV{+A~1Ku zWggqWQd{E%hF}W2ArPwJ33zWP>MIe;YDN8WV+|+a4_c>yFN#ZGN00G#%3HYi z4pePTnc{8k5CjwuN6hudRFcBkvB^&y3;pSFufzaaD`-;mPgJ~wr(