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:
parent
4e320db9dd
commit
0ee012318f
30
check/main.c
30
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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue