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>
This commit is contained in:
Su Yue 2018-05-08 16:30:02 +08:00 committed by David Sterba
parent 4e320db9dd
commit 0ee012318f
2 changed files with 29 additions and 9 deletions

View file

@ -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;

View file

@ -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;