|  | #! /bin/bash | 
|  | # SPDX-License-Identifier: GPL-2.0 | 
|  | # Copyright (C) 2014 Red Hat Inc. All rights reserved. | 
|  | # | 
|  | # FSQA Test No. btrfs/068 | 
|  | # | 
|  | # Run btrfs subvolume create/mount/umount/delete and remount with | 
|  | # different compress algorithms simultaneously, with fsstress running | 
|  | # in background. | 
|  | # | 
|  | . ./common/preamble | 
|  | _begin_fstest auto subvol remount compress scrub | 
|  |  | 
|  | _cleanup() | 
|  | { | 
|  | cd / | 
|  | rm -rf $tmp.* | 
|  | if [ ! -z "$stop_file" ] && [ ! -z "$subvol_pid" ] && \ | 
|  | [ ! -z "$subvol_mnt" ]; then | 
|  | _btrfs_kill_stress_subvolume_pid $subvol_pid $stop_file $subvol_mnt | 
|  | fi | 
|  | if [ ! -z "$remount_pid" ]; then | 
|  | _btrfs_kill_stress_remount_compress_pid $remount_pid $SCRATCH_MNT | 
|  | fi | 
|  | if [ ! -z "$fsstress_pid" ]; then | 
|  | kill $fsstress_pid &> /dev/null | 
|  | wait $fsstress_pid &> /dev/null | 
|  | fi | 
|  | } | 
|  |  | 
|  | . ./common/filter | 
|  |  | 
|  | # we check scratch dev after each loop | 
|  | _require_scratch_nocheck | 
|  | _require_scratch_dev_pool 4 | 
|  | _btrfs_get_profile_configs | 
|  |  | 
|  | stop_file=$TEST_DIR/$seq.stop.$$ | 
|  | subvol_mnt=$TEST_DIR/$seq.mnt | 
|  |  | 
|  | run_test() | 
|  | { | 
|  | local mkfs_opts=$1 | 
|  |  | 
|  | echo "Test $mkfs_opts with $with_compress" >>$seqres.full | 
|  |  | 
|  | _scratch_pool_mkfs $mkfs_opts >>$seqres.full 2>&1 | 
|  | # make sure we created btrfs with desired options | 
|  | if [ $? -ne 0 ]; then | 
|  | echo "mkfs $mkfs_opts failed" | 
|  | return | 
|  | fi | 
|  | _scratch_mount >>$seqres.full 2>&1 | 
|  |  | 
|  | args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir` | 
|  | echo "Run fsstress $args" >>$seqres.full | 
|  | $FSSTRESS_PROG $args >>$seqres.full & | 
|  | fsstress_pid=$! | 
|  |  | 
|  | echo -n "Start subvolume worker: " >>$seqres.full | 
|  | _btrfs_stress_subvolume $SCRATCH_DEV $SCRATCH_MNT subvol_$$ $subvol_mnt $stop_file >/dev/null 2>&1 & | 
|  | subvol_pid=$! | 
|  | echo "$subvol_pid" >>$seqres.full | 
|  |  | 
|  | echo -n "Start remount worker: " >>$seqres.full | 
|  | _btrfs_stress_remount_compress $SCRATCH_MNT >/dev/null 2>&1 & | 
|  | remount_pid=$! | 
|  | echo "$remount_pid" >>$seqres.full | 
|  |  | 
|  | echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full | 
|  | wait $fsstress_pid | 
|  | unset fsstress_pid | 
|  |  | 
|  | _btrfs_kill_stress_subvolume_pid $subvol_pid $stop_file $subvol_mnt | 
|  | unset subvol_pid | 
|  | _btrfs_kill_stress_remount_compress_pid $remount_pid $SCRATCH_MNT | 
|  | unset remount_pid | 
|  |  | 
|  | echo "Scrub the filesystem" >>$seqres.full | 
|  | $BTRFS_UTIL_PROG scrub start -B $SCRATCH_MNT >>$seqres.full 2>&1 | 
|  | if [ $? -ne 0 ]; then | 
|  | echo "Scrub find errors in \"$mkfs_opts\" test" | tee -a $seqres.full | 
|  | fi | 
|  |  | 
|  | # in case the subvolume is still mounted | 
|  | $UMOUNT_PROG $subvol_mnt >/dev/null 2>&1 | 
|  | _scratch_unmount | 
|  | # we called _require_scratch_nocheck instead of _require_scratch | 
|  | # do check after test for each profile config | 
|  | _check_scratch_fs | 
|  | } | 
|  |  | 
|  | echo "Silence is golden" | 
|  | for t in "${_btrfs_profile_configs[@]}"; do | 
|  | run_test "$t" | 
|  | done | 
|  |  | 
|  | status=0 | 
|  | exit |