summaryrefslogtreecommitdiff
path: root/check
diff options
context:
space:
mode:
authorSu Yue <suy.fnst@cn.fujitsu.com>2018-05-08 16:30:02 +0800
committerDavid Sterba <dsterba@suse.com>2018-06-07 16:37:30 +0200
commit0ee012318f011d2064761dd2246e1c5f699a9ed7 (patch)
tree1ddb1092945ab719a63d7175269272e2139aad3a /check
parent4e320db9dd6885ad3f6264cf2595f0242d6893f8 (diff)
btrfs-progs: check: lowmem: exclude extents if init-extent-tree in lowmem
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 pinning metadata blocks before reinitializing th extent tree in lowmem can save some time. Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'check')
-rw-r--r--check/main.c30
-rw-r--r--check/mode-lowmem.c8
2 files changed, 29 insertions, 9 deletions
diff --git a/check/main.c b/check/main.c
index 4944e72e..669180ab 100644
--- a/check/main.c
+++ b/check/main.c
@@ -8541,7 +8541,7 @@ out:
}
static 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;
@@ -8563,13 +8563,26 @@ static 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 pinnned, unpin will be done in the end of transaction.
+ * If excluded, 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;
+ }
}
/*
@@ -9663,7 +9676,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;
diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c
index 9ca533bd..c4e76113 100644
--- a/check/mode-lowmem.c
+++ b/check/mode-lowmem.c
@@ -4921,8 +4921,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;