From 0ee012318f011d2064761dd2246e1c5f699a9ed7 Mon Sep 17 00:00:00 2001 From: Su Yue Date: Tue, 8 May 2018 16:30:02 +0800 Subject: 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 Signed-off-by: David Sterba --- check/main.c | 30 ++++++++++++++++++++++-------- check/mode-lowmem.c | 8 +++++++- 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; -- cgit v1.2.3