| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (c) 2019 SUSE Linux Products GmbH. All Rights Reserved. |
| # |
| # FS QA Test 190 |
| # |
| # A general test to validate that balance and qgroups work correctly when |
| # balance needs to be resumed on mount. |
| # |
| . ./common/preamble |
| _begin_fstest auto quick replay balance qgroup recoveryloop |
| |
| . ./common/filter |
| . ./common/dmlogwrites |
| |
| _require_scratch |
| # and we need extra device as log device |
| _require_log_writes |
| |
| nr_files=512 # enough metadata to bump tree height |
| file_size=2048 # small enough to be inlined |
| |
| _log_writes_init $SCRATCH_DEV |
| _log_writes_mkfs >> $seqres.full 2>&1 |
| |
| _log_writes_mount |
| $BTRFS_UTIL_PROG quota enable $SCRATCH_MNT >> $seqres.full |
| _qgroup_rescan $SCRATCH_MNT >> $seqres.full |
| |
| # Create enough metadata for later balance |
| for ((i = 0; i < $nr_files; i++)); do |
| _pwrite_byte 0xcd 0 $file_size $SCRATCH_MNT/file_$i > /dev/null |
| done |
| |
| # Flush delalloc so that balance has work to do. |
| sync |
| |
| # Balance metadata so we will have at least one transaction committed with |
| # valid reloc tree, and hopefully another commit with orphan reloc tree. |
| _run_btrfs_balance_start -f -m $SCRATCH_MNT >> $seqres.full |
| |
| _log_writes_unmount |
| _log_writes_remove |
| |
| cur=$(_log_writes_find_next_fua 0) |
| echo "cur=$cur" >> $seqres.full |
| while [ ! -z "$cur" ]; do |
| _log_writes_replay_log_range $cur $SCRATCH_DEV >> $seqres.full |
| |
| # Test that no crashes happen or any other kind of failure. |
| _scratch_mount |
| _scratch_unmount |
| |
| # Don't trigger fsck here, as relocation get paused, |
| # at that transistent state, qgroup number may differ |
| # and cause false alert. |
| |
| prev=$cur |
| cur=$(_log_writes_find_next_fua $(($cur + 1))) |
| [ -z "$cur" ] && break |
| done |
| |
| # Now the fs has finished its balance and qgroup should be consistent. |
| # Fstest will automatically check the fs and btrfs check will report |
| # any qgroup inconsistent if something went wrong. |
| |
| echo "Silence is golden" |
| |
| # success, all done |
| status=0 |
| exit |