All of lore.kernel.org
 help / color / mirror / Atom feed
From: Su Yue <suy.fnst@cn.fujitsu.com>
To: <linux-btrfs@vger.kernel.org>
Cc: <suy.fnst@cn.fujitsu.com>
Subject: [PATCH v4 08/18] btrfs-progs: lowmem check: exclude extents if init-extent-tree in lowmem
Date: Thu, 8 Feb 2018 11:27:27 +0800	[thread overview]
Message-ID: <20180208032737.31561-9-suy.fnst@cn.fujitsu.com> (raw)
In-Reply-To: <20180208032737.31561-1-suy.fnst@cn.fujitsu.com>

If options '--init-extent-tree' and '--mode=lowmem' are both
input, all metadata blocks will be traversed twice.
First one is done by pin_metadata_blocks() in reinit_extent_tree().
Second one is in check_chunks_and_extents_v2().

Excluding instead of pining metadata blocks before reinit extent tree
in lowmem can save some time.

Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com>
---
 check/mode-common.c | 27 ++++++++++++++++++++-------
 check/mode-common.h |  2 +-
 check/mode-lowmem.c |  8 +++++++-
 cmds-check.c        |  3 ++-
 4 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/check/mode-common.c b/check/mode-common.c
index acceb24b9597..afe5f04d1deb 100644
--- a/check/mode-common.c
+++ b/check/mode-common.c
@@ -706,7 +706,7 @@ out:
  * Using fs and other trees to rebuild extent tree.
  */
 int reinit_extent_tree(struct btrfs_trans_handle *trans,
-		       struct btrfs_fs_info *fs_info)
+		       struct btrfs_fs_info *fs_info, bool pin)
 {
 	u64 start = 0;
 	int ret;
@@ -728,13 +728,26 @@ int reinit_extent_tree(struct btrfs_trans_handle *trans,
 
 	/*
 	 * first we need to walk all of the trees except the extent tree and pin
-	 * down the bytes that are in use so we don't overwrite any existing
-	 * metadata.
+	 * down/exclude the bytes that are in use so we don't overwrite any
+	 * existing metadata.
+	 * If pin, unpin will be done in end of transaction.
+	 * If exclude, cleanup will be done in check_chunks_and_extents_lowmem.
 	 */
-	ret = pin_metadata_blocks(fs_info);
-	if (ret) {
-		fprintf(stderr, "error pinning down used bytes\n");
-		return ret;
+again:
+	if (pin) {
+		ret = pin_metadata_blocks(fs_info);
+		if (ret) {
+			fprintf(stderr, "error pinning down used bytes\n");
+			return ret;
+		}
+	} else {
+		ret = exclude_metadata_blocks(fs_info);
+		if (ret) {
+			fprintf(stderr, "error excluding used bytes\n");
+			printf("try to pin down used bytes\n");
+			pin = true;
+			goto again;
+		}
 	}
 
 	/*
diff --git a/check/mode-common.h b/check/mode-common.h
index e2a824a318c1..8af7dd3066ff 100644
--- a/check/mode-common.h
+++ b/check/mode-common.h
@@ -122,7 +122,7 @@ int check_child_node(struct extent_buffer *parent, int slot,
 void reset_cached_block_groups(struct btrfs_fs_info *fs_info);
 int zero_log_tree(struct btrfs_root *root);
 int reinit_extent_tree(struct btrfs_trans_handle *trans,
-		       struct btrfs_fs_info *fs_info);
+		       struct btrfs_fs_info *fs_info, bool pin);
 int btrfs_fsck_reinit_root(struct btrfs_trans_handle *trans,
 			   struct btrfs_root *root, int overwrite);
 int fill_csum_tree(struct btrfs_trans_handle *trans,
diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c
index ea4019c32a3f..1e0545e6249d 100644
--- a/check/mode-lowmem.c
+++ b/check/mode-lowmem.c
@@ -4860,8 +4860,14 @@ next:
 	}
 out:
 
-	/* if repair, update block accounting */
 	if (repair) {
+		ret = end_avoid_extents_overwrite(fs_info);
+		if (ret < 0)
+			ret = FATAL_ERROR;
+		err |= ret;
+
+		reset_cached_block_groups(fs_info);
+		/* update block accounting */
 		ret = btrfs_fix_block_accounting(trans, root);
 		if (ret)
 			err |= ret;
diff --git a/cmds-check.c b/cmds-check.c
index 28746712fac1..ed81fd3c22b4 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -453,7 +453,8 @@ int cmd_check(int argc, char **argv)
 
 		if (init_extent_tree) {
 			printf("Creating a new extent tree\n");
-			ret = reinit_extent_tree(trans, info);
+			ret = reinit_extent_tree(trans, info,
+					 check_mode == CHECK_MODE_ORIGINAL);
 			err |= !!ret;
 			if (ret)
 				goto close_out;
-- 
2.16.1




  parent reply	other threads:[~2018-02-08  3:23 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-08  3:27 [PATCH v4 00/18] btrfs-progs: lowmem check: avoid extents overwrite Su Yue
2018-02-08  3:27 ` [PATCH v4 01/18] btrfs-progs: lowmem check: release path in repair_extent_data_item() Su Yue
2018-02-08  3:27 ` [PATCH v4 02/18] btrfs-progs: lowmem check: record returned errors after walk_down_tree_v2() Su Yue
2018-02-08  3:27 ` [PATCH v4 03/18] btrfs-progs: lowmem check: assign @parent early in repair_extent_data_item() Su Yue
2018-02-08  3:27 ` [PATCH v4 04/18] btrfs-progs: lowmem check: exclude extents of metadata blocks Su Yue
2018-02-08  3:27 ` [PATCH v4 05/18] btrfs-progs: lowmem check: introduce mark/clear_block_groups_full() Su Yue
2018-02-08  3:27 ` [PATCH v4 06/18] btrfs-progs: lowmem check: introduce try_force_cow_in_new_chunk() Su Yue
2018-02-08  3:27 ` [PATCH v4 07/18] btrfs-progs: lowmem check: introduce avoid_extents_overwrite() Su Yue
2018-02-08  3:27 ` Su Yue [this message]
2018-02-08  3:27 ` [PATCH v4 09/18] btrfs-progs: lowmem check: start to remove parameters @trans in lowmem Su Yue
2018-02-08  3:27 ` [PATCH v4 10/18] btrfs-progs: lowmem check: remove parameter @trans of delete_extent_item() Su Yue
2018-02-08  3:27 ` [PATCH v4 11/18] btrfs-progs: lowmem check: remove parameter @trans of repair_chunk_item() Su Yue
2018-02-08  3:27 ` [PATCH v4 12/18] btrfs-progs: lowmem check: remove parameter @trans of repair_extent_item() Su Yue
2018-02-08  3:27 ` [PATCH v4 13/18] btrfs-progs: lowmem check: remove parameter @trans of check_leaf_items() Su Yue
2018-02-08  3:27 ` [PATCH v4 14/18] btrfs-progs: lowmem check: remove parameter @trans of repair_tree_back_ref() Su Yue
2018-02-08  3:27 ` [PATCH v4 15/18] btrfs-progs: lowmem check: remove parameter @trans of check_btrfs_root() Su Yue
2018-02-08  3:27 ` [PATCH v4 16/18] btrfs-progs: lowmem check: introduce repair_block_accounting() Su Yue
2018-02-08  3:27 ` [PATCH v4 17/18] btrfs-progs: lowmem check: end of removing parameters @trans in lowmem Su Yue
2018-02-08  3:27 ` [PATCH v4 18/18] btrfs-progs: fsck-tests: add image no extent with normal device size Su Yue
2018-05-07 18:17 ` [PATCH v4 00/18] btrfs-progs: lowmem check: avoid extents overwrite David Sterba
2018-05-08  2:09   ` Su Yue
2018-05-08  2:06     ` Qu Wenruo
2018-05-08  2:19       ` Su Yue
2018-05-08 16:30       ` David Sterba

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180208032737.31561-9-suy.fnst@cn.fujitsu.com \
    --to=suy.fnst@cn.fujitsu.com \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.