Re: [PATCH 02/40] fstests: cleanup fsstress process management

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]



On Wed, Nov 27, 2024 at 03:51:32PM +1100, Dave Chinner wrote:
> From: Dave Chinner <dchinner@xxxxxxxxxx>
> 
> Lots of tests run fsstress in the background and then have to kill
> it and/or provide special cleanup functions to kill the background
> fsstress processes. They typically use $KILLALL_PROG for this.
> 
> Use of killall is problematic for running multiple tests in parallel
> in that one test can kill other tests' processes.  However, because
> fsstress itself forks and runs children, there are very few avenues
> for shell scripts to ensure all the fsstress processes actually die.
> 
> With bash, it is especially nasty, because sending SIGTERM will
> result in bash outputting error messages ("Killed: ..." that will
> cause golden output mismatches and hence test failures. Hence we
> also need to be able to tell the main fstress process to die without
> triggering these messages.
> 
> To avoid the process tracking problems, we change to use pkill
> rather than killall (more options for process selection) and we
> stop using the $here/ltp/fsstress binary. Instead, we copy the
> $here/ltp/fsstress to $TEST_DIR/$seq.fsstress so that the test has
> a unique fsstress binary name. This allows the pkill filter to
> select just the fsstress processes the test has run. The fsstress
> binary name is held in _FSSTRESS_NAME, and the program to run is
> _FSSTRESS_PROG.
> 
> We also track the primary fsstress process ID, and store that in
> _FSSTRESS_PID. We do this so that we have a PID to wait against so
> that we don't return before the fsstress processes are dead. To this
> end, we add a SIGPIPE handler to the primary process so that it
> dying doesn't trigger bash 'killed' message output. We can
> send 'pkill -PIPE $_FSSTRESS_NAME' to all the fsstress processes and
> the primary process will then enter the "wait for children to die"
> processing loop before it exits. In this way, we can wait for the
> primary fsstress process and when it exits we know that all it's
> children have also finished and gone away. This makes killing
> fsstress invocations reliable and noise free.
> 
> This is accomplished by the helpers added to common/rc:
> 
> 	_run_fsstress
> 	_run_fsstress_bg
> 	_wait_for_fsstress
> 	_kill_fstress
> 
> This also means that all fsstress invocations now obey
> FSSTRESS_AVOID environment restrictions, many of which didn't.
> 
> We add a call to _kill_fstress into the generic _cleanup() function.
> This means that tests using fsstress don't need to add a special
> local _cleanup function just to call _kill_fsstress() so that
> background fsstress processes are killed when the user interrupts
> the tests with ctrl-c.
> 
> Further, killall in the _cleanup() function is often used to attempt
> to expedite killing of foreground execution fsstress processes. This
> doesn't actually work because of the way bash processes interupt
> signals. That is, it waits for the currently executing process to
> finish execution, then runs the trap function. Hence a foreground
> fsstress won't ever be interrupted by ctrl-c. By implementing
> _run_fsstress() as a background process and a wait call, the wait()
> call is interrupted by the signal and the cleanup trap is run
> immediately. Hence the fsstress processes are killed immediately and
> the test exits cleanly almost immediately.
> 
> The result of all this is common, clean handling of fsstress
> execution and termination. There are a few exceptions for special
> cases, but the vast majority of tests that run fsstress use the
> above four wrapper functions exclusively.
> 
> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
> ---

[snip]

> +# Common execution handling for fsstress invocation.
> +#
> +# We need per-test fsstress binaries because of the way fsstress forks and
> +# tests run it in the background and/or nest it. Trying to kill fsstress
> +# tasks is unreliable because killing parent fsstress task does not guarantee
> +# that the children get killed. Hence the historic use of killall for stopping
> +# execution.
> +#
> +# However, we can't just kill all fsstress binaries as multiple tests might be
> +# running fsstress at the same time. Hence copy the fsstress binary to a test
> +# specific binary on the test device and use pkill to select that only that
> +# task name to kill.
> +#
> +# If tasks want to start fsstress themselves (e.g. under a different uid) then
> +# they can set up _FSSTRESS_BIN and record _FSSTRESS_PID themselves. Then if the
> +# test is killed then it will get cleaned up automatically.
> +
> +_FSSTRESS_BIN="$seq.fsstress"
> +_FSSTRESS_PROG="$TEST_DIR/$seq.fsstress"

Hi Dave,

I'm wondering if the "$seq.fsstress" can be unique name? For example, if generic/561,
xfs/561, btrfs/561, ext4/561 run fsstress in parallel, won't they have same
"561.fsstress", then "pkill -PIPE $_FSSTRESS_BIN" kills all these cases' fsstress
processes?

Thanks,
Zorro

> +_FSSTRESS_PID=""
> +_wait_for_fsstress()
> +{
> +	local ret=0
> +
> +	if [ -n "$_FSSTRESS_PID" ]; then
> +		wait $_FSSTRESS_PID >> $seqres.full 2>&1
> +		ret=$?
> +		unset _FSSTRESS_PID
> +	fi
> +	rm -f $_FSSTRESS_PROG
> +	return $ret
> +}
> +
> +# Standard fsstress cleanup function. Individual tests can override this.
> +_kill_fsstress()
> +{
> +	if [ -n "$_FSSTRESS_PID" ]; then
> +		# use SIGPIPE to avoid "Killed" messages from bash
> +		echo "killing $_FSSTRESS_BIN" >> $seqres.full
> +		pkill -PIPE $_FSSTRESS_BIN >> $seqres.full 2>&1
> +		_wait_for_fsstress
> +		return $?
> +	fi
> +}
> +
> +_run_fsstress_bg()
> +{
> +	cp -f $FSSTRESS_PROG $_FSSTRESS_PROG
> +	$_FSSTRESS_PROG $FSSTRESS_AVOID $* >> $seqres.full 2>&1 &
> +	_FSSTRESS_PID=$!
> +}
> +
> +_run_fsstress()
> +{
> +	_run_fsstress_bg $*
> +	_wait_for_fsstress
> +	return $?
> +}
> +
>  _wallclock()
>  {
>      date "+%s"
> diff --git a/ltp/fsstress.c b/ltp/fsstress.c
> index 3d248ee25..a6840f28c 100644
> --- a/ltp/fsstress.c
> +++ b/ltp/fsstress.c
> @@ -444,6 +444,7 @@ void sg_handler(int signum)
>  {
>  	switch (signum) {
>  	case SIGTERM:
> +	case SIGPIPE:
>  		should_stop = 1;
>  		break;
>  	case SIGBUS:
> @@ -469,6 +470,9 @@ keep_looping(int i, int loops)
>  {
>  	int ret;
>  
> +	if (should_stop)
> +		return false;
> +
>  	if (deadline.tv_nsec) {
>  		struct timespec now;
>  
> @@ -732,14 +736,17 @@ int main(int argc, char **argv)
>  		perror("sigaction failed");
>  		exit(1);
>  	}
> +	if (sigaction(SIGPIPE, &action, 0)) {
> +		perror("sigaction failed");
> +		exit(1);
> +	}
>  
>  	for (i = 0; i < nproc; i++) {
>  		if (fork() == 0) {
>  			sigemptyset(&action.sa_mask);
> -			action.sa_handler = SIG_DFL;
> -			if (sigaction(SIGTERM, &action, 0))
> -				return 1;
>  			action.sa_handler = sg_handler;
> +			if (sigaction(SIGTERM, &action, 0))
> +				return 1;
>  			if (sigaction(SIGBUS, &action, 0))
>  				return 1;
>  #ifdef HAVE_SYS_PRCTL_H
> @@ -1196,6 +1203,9 @@ keep_running(opnum_t opno, opnum_t operations)
>  {
>  	int ret;
>  
> +	if (should_stop)
> +		return false;
> +
>  	if (deadline.tv_nsec) {
>  		struct timespec now;
>  
> diff --git a/tests/btrfs/004 b/tests/btrfs/004
> index 5a2ce9931..06eedde22 100755
> --- a/tests/btrfs/004
> +++ b/tests/btrfs/004
> @@ -17,6 +17,7 @@ noise_pid=0
>  # Override the default cleanup function.
>  _cleanup()
>  {
> +	_kill_fsstress
>  	rm $tmp.running
>  	wait
>  	rm -f $tmp.*
> @@ -159,8 +160,7 @@ workout()
>  	_scratch_mkfs_sized $fsz >>$seqres.full 2>&1
>  	_scratch_mount
>  	# -w ensures that the only ops are ones which cause write I/O
> -	run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p $procs -n 2000 \
> -		$FSSTRESS_AVOID
> +	_run_fsstress -d $SCRATCH_MNT -w -p $procs -n 2000
>  
>  	_btrfs subvolume snapshot $SCRATCH_MNT \
>  		$SCRATCH_MNT/$snap_name
> @@ -170,15 +170,14 @@ workout()
>  
>  	# make some noise but ensure we're not touching existing data
>  	# extents.
> -	run_check $FSSTRESS_PROG -d $SCRATCH_MNT -p $procs -n 4000 \
> +	_run_fsstress -d $SCRATCH_MNT -p $procs -n 4000 \
>  		-z -f chown=3 -f link=1 -f mkdir=2 -f mknod=2 \
>  		-f rename=2 -f setxattr=1 -f symlink=2
>  
>  	clean_dir="$SCRATCH_MNT/next"
>  	mkdir $clean_dir
>  	# now make more files to get a higher tree
> -	run_check $FSSTRESS_PROG -d $clean_dir -w -p $procs -n 2000 \
> -		$FSSTRESS_AVOID
> +	_run_fsstress -d $clean_dir -w -p $procs -n 2000
>  	run_check _scratch_unmount
>  	_scratch_mount "-o atime"
>  
> @@ -186,7 +185,7 @@ workout()
>  		# make background noise while backrefs are being walked
>  		while [ -f "$tmp.running" ]; do
>  			echo background fsstress >>$seqres.full
> -			run_check $FSSTRESS_PROG -d $SCRATCH_MNT/bgnoise -n 999
> +			_run_fsstress -d $SCRATCH_MNT/bgnoise -n 999
>  			echo background rm >>$seqres.full
>  			rm -rf $SCRATCH_MNT/bgnoise/
>  		done &
> diff --git a/tests/btrfs/007 b/tests/btrfs/007
> index a7eb62162..d9cc32750 100755
> --- a/tests/btrfs/007
> +++ b/tests/btrfs/007
> @@ -18,6 +18,7 @@ _begin_fstest auto quick rw metadata send seek
>  # Override the default cleanup function.
>  _cleanup()
>  {
> +	_kill_fsstress
>  	cd /
>  	rm -f $tmp.*
>  	rm -fr $send_files_dir
> @@ -45,7 +46,7 @@ workout()
>  	_scratch_mkfs_sized $fsz >>$seqres.full 2>&1
>  	_scratch_mount "-o noatime"
>  
> -	run_check $FSSTRESS_PROG -d $SCRATCH_MNT -n $ops $FSSTRESS_AVOID -x \
> +	_run_fsstress -d $SCRATCH_MNT -n $ops -x \
>  		"$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/base"
>  
>  	_btrfs subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/incr
> diff --git a/tests/btrfs/012 b/tests/btrfs/012
> index 5811b3b33..f41d7e4eb 100755
> --- a/tests/btrfs/012
> +++ b/tests/btrfs/012
> @@ -45,7 +45,7 @@ mount -t ext4 $SCRATCH_DEV $SCRATCH_MNT
>  
>  echo "populating the initial ext fs:" >> $seqres.full
>  mkdir "$SCRATCH_MNT/$BASENAME"
> -$FSSTRESS_PROG -w -d "$SCRATCH_MNT/$BASENAME" -n 20 -p 500 >> $seqres.full
> +_run_fsstress -w -d "$SCRATCH_MNT/$BASENAME" -n 20 -p 500
>  
>  # Create the checksum to verify later.
>  $FSSUM_PROG -A -f -w $tmp.original "$SCRATCH_MNT/$BASENAME"
> @@ -74,7 +74,7 @@ umount $SCRATCH_MNT/mnt
>  
>  echo "Generating new data on the converted btrfs" >> $seqres.full
>  mkdir -p $SCRATCH_MNT/new 
> -$FSSTRESS_PROG -w -d "$SCRATCH_MNT/new" -n 20 -p 500 >> $seqres.full
> +_run_fsstress -w -d "$SCRATCH_MNT/new" -n 20 -p 500
>  
>  _scratch_unmount
>  
> diff --git a/tests/btrfs/028 b/tests/btrfs/028
> index f64fc831d..85e42f31e 100755
> --- a/tests/btrfs/028
> +++ b/tests/btrfs/028
> @@ -32,8 +32,7 @@ args=`_scale_fsstress_args -z \
>  	-f fsync=10 -n 100000 -p 2 \
>  	-d $SCRATCH_MNT/stress_dir`
>  echo "Run fsstress $args" >>$seqres.full
> -$FSSTRESS_PROG $args >>$seqres.full &
> -fsstress_pid=$!
> +_run_fsstress_bg $args
>  
>  echo "Start balance" >>$seqres.full
>  _btrfs_stress_balance -d $SCRATCH_MNT >/dev/null 2>&1 &
> @@ -41,8 +40,7 @@ balance_pid=$!
>  
>  # 30s is enough to trigger bug
>  sleep $((30*$TIME_FACTOR))
> -kill $fsstress_pid &> /dev/null
> -wait $fsstress_pid &> /dev/null
> +_kill_fsstress
>  _btrfs_kill_stress_balance_pid $balance_pid
>  
>  # The qgroups accounting will be checked by 'btrfs check' (fsck) after the
> diff --git a/tests/btrfs/049 b/tests/btrfs/049
> index 19eec7851..5c09942ee 100755
> --- a/tests/btrfs/049
> +++ b/tests/btrfs/049
> @@ -39,7 +39,7 @@ args=`_scale_fsstress_args -z \
>  	-f write=10 -f creat=10 \
>  	-n 1000 -p 2 -d $SCRATCH_MNT/stress_dir`
>  echo "Run fsstress $args" >>$seqres.full
> -$FSSTRESS_PROG $args >>$seqres.full
> +_run_fsstress $args >>$seqres.full
>  
>  # Start and pause balance to ensure it will be restored on remount
>  echo "Start balance" >>$seqres.full
> @@ -68,7 +68,7 @@ $BTRFS_UTIL_PROG balance resume "$SCRATCH_MNT" &>/dev/null
>  [ $? -eq 0 ] || _fail "Couldn't resume balance after device add"
>  
>  # Add more files so that new balance won't fish immediately
> -$FSSTRESS_PROG $args >/dev/null 2>&1
> +_run_fsstress $args
>  
>  # Now pause->resume balance. This ensures balance paused is properly set in
>  # the kernel and won't trigger an assertion failure.
> diff --git a/tests/btrfs/057 b/tests/btrfs/057
> index 6c3999463..1e871dd1b 100755
> --- a/tests/btrfs/057
> +++ b/tests/btrfs/057
> @@ -19,12 +19,12 @@ _scratch_mkfs_sized $((1024 * 1024 * 1024)) >> $seqres.full 2>&1
>  _scratch_mount
>  
>  # -w ensures that the only ops are ones which cause write I/O
> -run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p 5 -n 1000 $FSSTRESS_AVOID
> +_run_fsstress -d $SCRATCH_MNT -w -p 5 -n 1000
>  
>  _btrfs subvolume snapshot $SCRATCH_MNT \
>  	$SCRATCH_MNT/snap1
>  
> -run_check $FSSTRESS_PROG -d $SCRATCH_MNT/snap1 -w -p 5 -n 1000 $FSSTRESS_AVOID
> +_run_fsstress -d $SCRATCH_MNT/snap1 -w -p 5 -n 1000
>  
>  _btrfs quota enable $SCRATCH_MNT
>  _btrfs quota rescan -w $SCRATCH_MNT
> diff --git a/tests/btrfs/060 b/tests/btrfs/060
> index 75c10bd23..21f15ec89 100755
> --- a/tests/btrfs/060
> +++ b/tests/btrfs/060
> @@ -21,10 +21,7 @@ _cleanup()
>  	if [ ! -z "$balance_pid" ]; then
>  		_btrfs_kill_stress_balance_pid $balance_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -51,10 +48,9 @@ run_test()
>  	fi
>  	_scratch_mount >>$seqres.full 2>&1
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start balance worker: " >>$seqres.full
>  	_btrfs_stress_balance $SCRATCH_MNT >/dev/null 2>&1 &
> @@ -67,9 +63,7 @@ run_test()
>  	echo "$subvol_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> -
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_subvolume_pid $subvol_pid $stop_file $subvol_mnt
>  	unset subvol_pid
>  	_btrfs_kill_stress_balance_pid $balance_pid
> diff --git a/tests/btrfs/061 b/tests/btrfs/061
> index 2b3b76a7f..5a2bd7090 100755
> --- a/tests/btrfs/061
> +++ b/tests/btrfs/061
> @@ -20,10 +20,7 @@ _cleanup()
>  	if [ ! -z "$scrub_pid" ]; then
>  		_btrfs_kill_stress_scrub_pid $scrub_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -47,10 +44,9 @@ run_test()
>  	fi
>  	_scratch_mount >>$seqres.full 2>&1
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start balance worker: " >>$seqres.full
>  	_btrfs_stress_balance $SCRATCH_MNT >/dev/null 2>&1 &
> @@ -63,8 +59,7 @@ run_test()
>  	echo "$scrub_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_balance_pid $balance_pid
>  	unset balance_pid
>  	_btrfs_kill_stress_scrub_pid $scrub_pid
> diff --git a/tests/btrfs/062 b/tests/btrfs/062
> index 4ab7ca534..a25d6d117 100755
> --- a/tests/btrfs/062
> +++ b/tests/btrfs/062
> @@ -20,10 +20,7 @@ _cleanup()
>  	if [ ! -z "$defrag_pid" ]; then
>  		_btrfs_kill_stress_defrag_pid $defrag_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -48,10 +45,9 @@ run_test()
>  	fi
>  	_scratch_mount >>$seqres.full 2>&1
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start balance worker: " >>$seqres.full
>  	_btrfs_stress_balance $SCRATCH_MNT >/dev/null 2>&1 &
> @@ -64,8 +60,7 @@ run_test()
>  	echo "$defrag_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_balance_pid $balance_pid
>  	unset balance_pid
>  	_btrfs_kill_stress_defrag_pid $defrag_pid
> diff --git a/tests/btrfs/063 b/tests/btrfs/063
> index ea4275d29..7d51ff554 100755
> --- a/tests/btrfs/063
> +++ b/tests/btrfs/063
> @@ -20,10 +20,7 @@ _cleanup()
>  	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
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -47,10 +44,9 @@ run_test()
>  	fi
>  	_scratch_mount >>$seqres.full 2>&1
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start balance worker: " >>$seqres.full
>  	_btrfs_stress_balance $SCRATCH_MNT >/dev/null 2>&1 &
> @@ -63,8 +59,7 @@ run_test()
>  	echo "$remount_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_balance_pid $balance_pid
>  	unset balance_pid
>  	_btrfs_kill_stress_remount_compress_pid $remount_pid $SCRATCH_MNT
> diff --git a/tests/btrfs/064 b/tests/btrfs/064
> index a8aa62513..3b98f327e 100755
> --- a/tests/btrfs/064
> +++ b/tests/btrfs/064
> @@ -22,10 +22,7 @@ _cleanup()
>  	if [ ! -z "$replace_pid" ]; then
>  		_btrfs_kill_stress_replace_pid $replace_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -57,10 +54,9 @@ run_test()
>  	_scratch_mount >>$seqres.full 2>&1
>  	SCRATCH_DEV_POOL=$saved_scratch_dev_pool
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	# Start both balance and replace in the background.
>  	# Either balance or replace shall run, the other fails.
> @@ -75,8 +71,7 @@ run_test()
>  	echo "$replace_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_balance_pid $balance_pid
>  	unset balance_pid
>  	_btrfs_kill_stress_replace_pid $replace_pid
> diff --git a/tests/btrfs/065 b/tests/btrfs/065
> index b87c66d6e..f0c9ffb04 100755
> --- a/tests/btrfs/065
> +++ b/tests/btrfs/065
> @@ -21,10 +21,7 @@ _cleanup()
>  	if [ ! -z "$replace_pid" ]; then
>  		_btrfs_kill_stress_replace_pid $replace_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -59,10 +56,9 @@ run_test()
>  	_scratch_mount >>$seqres.full 2>&1
>  	SCRATCH_DEV_POOL=$saved_scratch_dev_pool
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start subvolume worker: " >>$seqres.full
>  	_btrfs_stress_subvolume $SCRATCH_DEV $SCRATCH_MNT subvol_$$ $subvol_mnt $stop_file >/dev/null 2>&1 &
> @@ -75,9 +71,7 @@ run_test()
>  	echo "$replace_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> -
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_subvolume_pid $subvol_pid $stop_file $subvol_mnt
>  	unset subvol_pid
>  	_btrfs_kill_stress_replace_pid $replace_pid
> diff --git a/tests/btrfs/066 b/tests/btrfs/066
> index cc7cd9b72..e3a083b94 100755
> --- a/tests/btrfs/066
> +++ b/tests/btrfs/066
> @@ -21,10 +21,7 @@ _cleanup()
>  	if [ ! -z "$scrub_pid" ]; then
>  		_btrfs_kill_stress_scrub_pid $scrub_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -51,10 +48,9 @@ run_test()
>  	fi
>  	_scratch_mount >>$seqres.full 2>&1
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start subvolume worker: " >>$seqres.full
>  	_btrfs_stress_subvolume $SCRATCH_DEV $SCRATCH_MNT subvol_$$ $subvol_mnt $stop_file >/dev/null 2>&1 &
> @@ -67,9 +63,7 @@ run_test()
>  	echo "$scrub_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> -
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_subvolume_pid $subvol_pid $stop_file $subvol_mnt
>  	unset subvol_pid
>  	_btrfs_kill_stress_scrub_pid $scrub_pid
> diff --git a/tests/btrfs/067 b/tests/btrfs/067
> index 0b4730500..768993116 100755
> --- a/tests/btrfs/067
> +++ b/tests/btrfs/067
> @@ -21,10 +21,7 @@ _cleanup()
>  	if [ ! -z "$defrag_pid" ]; then
>  		_btrfs_kill_stress_defrag_pid $defrag_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -52,10 +49,9 @@ run_test()
>  	fi
>  	_scratch_mount >>$seqres.full 2>&1
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start subvolume worker: " >>$seqres.full
>  	_btrfs_stress_subvolume $SCRATCH_DEV $SCRATCH_MNT subvol_$$ $subvol_mnt $stop_file >/dev/null 2>&1 &
> @@ -68,9 +64,7 @@ run_test()
>  	echo "$defrag_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> -
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_subvolume_pid $subvol_pid $stop_file $subvol_mnt
>  	unset subvol_pid
>  	_btrfs_kill_stress_defrag_pid $defrag_pid
> diff --git a/tests/btrfs/068 b/tests/btrfs/068
> index 83e932e84..3d221259f 100755
> --- a/tests/btrfs/068
> +++ b/tests/btrfs/068
> @@ -22,10 +22,7 @@ _cleanup()
>  	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
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -52,10 +49,9 @@ run_test()
>  	fi
>  	_scratch_mount >>$seqres.full 2>&1
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start subvolume worker: " >>$seqres.full
>  	_btrfs_stress_subvolume $SCRATCH_DEV $SCRATCH_MNT subvol_$$ $subvol_mnt $stop_file >/dev/null 2>&1 &
> @@ -68,9 +64,7 @@ run_test()
>  	echo "$remount_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> -
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_subvolume_pid $subvol_pid $stop_file $subvol_mnt
>  	unset subvol_pid
>  	_btrfs_kill_stress_remount_compress_pid $remount_pid $SCRATCH_MNT
> diff --git a/tests/btrfs/069 b/tests/btrfs/069
> index 510551760..7954e80a8 100755
> --- a/tests/btrfs/069
> +++ b/tests/btrfs/069
> @@ -20,10 +20,7 @@ _cleanup()
>  	if [ ! -z "$scrub_pid" ]; then
>  		_btrfs_kill_stress_scrub_pid $scrub_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -55,10 +52,9 @@ run_test()
>  	_scratch_mount >>$seqres.full 2>&1
>  	SCRATCH_DEV_POOL=$saved_scratch_dev_pool
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start replace worker: " >>$seqres.full
>  	_btrfs_stress_replace $SCRATCH_MNT >>$seqres.full 2>&1 &
> @@ -71,8 +67,7 @@ run_test()
>  	echo "$scrub_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_scrub_pid $scrub_pid
>  	unset scrub_pid
>  	_btrfs_kill_stress_replace_pid $replace_pid
> diff --git a/tests/btrfs/070 b/tests/btrfs/070
> index f2e9dfcb1..c18380034 100755
> --- a/tests/btrfs/070
> +++ b/tests/btrfs/070
> @@ -20,10 +20,7 @@ _cleanup()
>  	if [ ! -z "$defrag_pid" ]; then
>  		_btrfs_kill_stress_defrag_pid $defrag_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -56,10 +53,9 @@ run_test()
>  	_scratch_mount >>$seqres.full 2>&1
>  	SCRATCH_DEV_POOL=$saved_scratch_dev_pool
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start replace worker: " >>$seqres.full
>  	_btrfs_stress_replace $SCRATCH_MNT >>$seqres.full 2>&1 &
> @@ -72,8 +68,7 @@ run_test()
>  	echo "$defrag_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_replace_pid $replace_pid
>  	unset replace_pid
>  	_btrfs_kill_stress_defrag_pid $defrag_pid
> diff --git a/tests/btrfs/071 b/tests/btrfs/071
> index 5c65bcfe0..5c2b725b0 100755
> --- a/tests/btrfs/071
> +++ b/tests/btrfs/071
> @@ -20,10 +20,7 @@ _cleanup()
>  	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
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -55,10 +52,9 @@ run_test()
>  	_scratch_mount >>$seqres.full 2>&1
>  	SCRATCH_DEV_POOL=$saved_scratch_dev_pool
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start replace worker: " >>$seqres.full
>  	_btrfs_stress_replace $SCRATCH_MNT >>$seqres.full 2>&1 &
> @@ -71,8 +67,7 @@ run_test()
>  	echo "$remount_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_replace_pid $replace_pid
>  	unset replace_pid
>  	_btrfs_kill_stress_remount_compress_pid $remount_pid $SCRATCH_MNT
> diff --git a/tests/btrfs/072 b/tests/btrfs/072
> index 0a3da5ffd..327508874 100755
> --- a/tests/btrfs/072
> +++ b/tests/btrfs/072
> @@ -20,10 +20,7 @@ _cleanup()
>  	if [ ! -z "$scrub_pid" ]; then
>  		_btrfs_kill_stress_scrub_pid $scrub_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -48,10 +45,9 @@ run_test()
>  	fi
>  	_scratch_mount >>$seqres.full 2>&1
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start scrub worker: " >>$seqres.full
>  	_btrfs_stress_scrub $SCRATCH_MNT >/dev/null 2>&1 &
> @@ -64,9 +60,7 @@ run_test()
>  	echo "$defrag_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> -
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_defrag_pid $defrag_pid
>  	unset defrag_pid
>  	_btrfs_kill_stress_scrub_pid $scrub_pid
> diff --git a/tests/btrfs/073 b/tests/btrfs/073
> index bf7e9ca7a..b77e14c91 100755
> --- a/tests/btrfs/073
> +++ b/tests/btrfs/073
> @@ -20,10 +20,7 @@ _cleanup()
>  	if [ ! -z "$scrub_pid" ]; then
>  		_btrfs_kill_stress_scrub_pid $scrub_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -47,10 +44,9 @@ run_test()
>  	fi
>  	_scratch_mount >>$seqres.full 2>&1
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start scrub worker: " >>$seqres.full
>  	_btrfs_stress_scrub $SCRATCH_MNT >/dev/null 2>&1 &
> @@ -63,8 +59,7 @@ run_test()
>  	echo "$remount_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_remount_compress_pid $remount_pid $SCRATCH_MNT
>  	unset remount_pid
>  	_btrfs_kill_stress_scrub_pid $scrub_pid
> diff --git a/tests/btrfs/074 b/tests/btrfs/074
> index f78267159..a752707db 100755
> --- a/tests/btrfs/074
> +++ b/tests/btrfs/074
> @@ -20,10 +20,7 @@ _cleanup()
>  	if [ ! -z "$defrag_pid" ]; then
>  		_btrfs_kill_stress_defrag_pid $defrag_pid
>  	fi
> -	if [ ! -z "$fsstress_pid" ]; then
> -		kill $fsstress_pid &> /dev/null
> -		wait $fsstress_pid &> /dev/null
> -	fi
> +	_kill_fsstress
>  }
>  
>  . ./common/filter
> @@ -48,10 +45,9 @@ run_test()
>  	fi
>  	_scratch_mount >>$seqres.full 2>&1
>  
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $SCRATCH_MNT/stressdir`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> +	_run_fsstress_bg $args
>  
>  	echo -n "Start defrag worker: " >>$seqres.full
>  	_btrfs_stress_defrag $SCRATCH_MNT $with_compress >/dev/null 2>&1 &
> @@ -64,8 +60,7 @@ run_test()
>  	echo "$remount_pid" >>$seqres.full
>  
>  	echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
> -	wait $fsstress_pid
> -	unset fsstress_pid
> +	_wait_for_fsstress
>  	_btrfs_kill_stress_remount_compress_pid $remount_pid $SCRATCH_MNT
>  	unset remount_pid
>  	_btrfs_kill_stress_defrag_pid $defrag_pid
> diff --git a/tests/btrfs/078 b/tests/btrfs/078
> index bbebeff39..b802f9d86 100755
> --- a/tests/btrfs/078
> +++ b/tests/btrfs/078
> @@ -16,14 +16,6 @@
>  . ./common/preamble
>  _begin_fstest auto snapshot
>  
> -tmp=`mktemp -d`
> -
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	rm -fr $tmp
> -}
> -
>  . ./common/filter
>  
>  _require_scratch
> @@ -39,8 +31,8 @@ workout()
>  
>  	snapshot_cmd="$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT"
>  	snapshot_cmd="$snapshot_cmd $SCRATCH_MNT/snap_\`date +'%H_%M_%S_%N'\`"
> -	run_check $FSSTRESS_PROG -p $procs \
> -	    -x "$snapshot_cmd" -X $num_snapshots -d $SCRATCH_MNT -n $ops
> +	_run_fsstress -p $procs -x "$snapshot_cmd" -X $num_snapshots \
> +			-d $SCRATCH_MNT -n $ops
>  }
>  
>  ops=8000
> diff --git a/tests/btrfs/100 b/tests/btrfs/100
> index 46bfc4f74..a319c7bbb 100755
> --- a/tests/btrfs/100
> +++ b/tests/btrfs/100
> @@ -13,6 +13,7 @@ _begin_fstest auto replace volume eio
>  # Override the default cleanup function.
>  _cleanup()
>  {
> +	_kill_fsstress
>  	_dmerror_cleanup
>  	rm -f $tmp.*
>  }
> @@ -39,8 +40,7 @@ error_devid=`$BTRFS_UTIL_PROG filesystem show -m $SCRATCH_MNT |\
>  
>  snapshot_cmd="$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT"
>  snapshot_cmd="$snapshot_cmd $SCRATCH_MNT/snap_\`date +'%H_%M_%S_%N'\`"
> -run_check $FSSTRESS_PROG -d $SCRATCH_MNT -n 200 -p 8 $FSSTRESS_AVOID -x \
> -							"$snapshot_cmd" -X 50
> +_run_fsstress -d $SCRATCH_MNT -n 200 -p 8 -x "$snapshot_cmd" -X 50
>  
>  # now load the error into the DMERROR_DEV
>  _dmerror_load_error_table
> diff --git a/tests/btrfs/101 b/tests/btrfs/101
> index c65e14ea0..cb14d6a07 100755
> --- a/tests/btrfs/101
> +++ b/tests/btrfs/101
> @@ -13,6 +13,7 @@ _begin_fstest auto replace volume eio
>  # Override the default cleanup function.
>  _cleanup()
>  {
> +	_kill_fsstress
>  	_dmerror_cleanup
>  	rm -f $tmp.*
>  }
> @@ -40,8 +41,7 @@ error_devid=`$BTRFS_UTIL_PROG filesystem show -m $SCRATCH_MNT |\
>  
>  snapshot_cmd="$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT"
>  snapshot_cmd="$snapshot_cmd $SCRATCH_MNT/snap_\`date +'%H_%M_%S_%N'\`"
> -run_check $FSSTRESS_PROG -d $SCRATCH_MNT -n 200 -p 8 $FSSTRESS_AVOID -x \
> -							"$snapshot_cmd" -X 50
> +_run_fsstress -d $SCRATCH_MNT -n 200 -p 8 -x "$snapshot_cmd" -X 50
>  
>  # now load the error into the DMERROR_DEV
>  _dmerror_load_error_table
> diff --git a/tests/btrfs/136 b/tests/btrfs/136
> index 2a5280fb9..65bbcf516 100755
> --- a/tests/btrfs/136
> +++ b/tests/btrfs/136
> @@ -34,11 +34,9 @@ BTRFS_MD5SUM="$tmp.btrfs"
>  populate_data(){
>  	data_path=$1
>  	mkdir -p $data_path
> -	args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $data_path`
> +	args=`_scale_fsstress_args -p 20 -n 100 -d $data_path`
>  	echo "Run fsstress $args" >>$seqres.full
> -	$FSSTRESS_PROG $args >>$seqres.full &
> -	fsstress_pid=$!
> -	wait $fsstress_pid
> +	_run_fsstress $args
>  }
>  
>  # Create & populate an ext3 filesystem
> diff --git a/tests/btrfs/192 b/tests/btrfs/192
> index f7fb65b8d..cc8e1e003 100755
> --- a/tests/btrfs/192
> +++ b/tests/btrfs/192
> @@ -13,12 +13,12 @@ _begin_fstest auto replay snapshot stress recoveryloop
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	cd /
> +	_kill_fsstress
>  	kill -q $pid1 &> /dev/null
>  	kill -q $pid2 &> /dev/null
> -	"$KILLALL_PROG" -q $FSSTRESS_PROG &> /dev/null
>  	wait
>  	_log_writes_cleanup &> /dev/null
> +	cd /
>  	rm -f $tmp.*
>  }
>  
> @@ -46,8 +46,7 @@ nr_cpus=$("$here/src/feature" -o)
>  if [ $nr_cpus -gt 8 ]; then
>  	nr_cpus=8
>  fi
> -fsstress_args=$(_scale_fsstress_args -w -d $SCRATCH_MNT -n 99999 -p $nr_cpus \
> -		$FSSTRESS_AVOID)
> +fsstress_args=$(_scale_fsstress_args -w -d $SCRATCH_MNT -n 99999 -p $nr_cpus )
>  _log_writes_init $SCRATCH_DEV
>  
>  # Discard the whole devices so when some tree pointer is wrong, it won't point
> @@ -135,10 +134,10 @@ pid1=$!
>  delete_workload &
>  pid2=$!
>  
> -"$FSSTRESS_PROG" $fsstress_args >> $seqres.full &
> +_run_fsstress_bg $fsstress_args
>  sleep $runtime
>  
> -"$KILLALL_PROG" -q "$FSSTRESS_PROG" &> /dev/null
> +_kill_fsstress
>  kill $pid1 &> /dev/null
>  kill $pid2 &> /dev/null
>  wait
> diff --git a/tests/btrfs/195 b/tests/btrfs/195
> index 72fc3a775..4dffddc1a 100755
> --- a/tests/btrfs/195
> +++ b/tests/btrfs/195
> @@ -49,7 +49,7 @@ run_testcase() {
>  	_scratch_mount
>  
>  	# Create random filesystem with 20k write ops
> -	$FSSTRESS_PROG -d $SCRATCH_MNT -w -n 10000 $FSSTRESS_AVOID >>$seqres.full 2>&1
> +	_run_fsstress -d $SCRATCH_MNT -w -n 10000
>  
>  	_run_btrfs_balance_start -f -dconvert=$dst_type $SCRATCH_MNT >> $seqres.full
>  	[ $? -eq 0 ] || echo "$1: Failed convert"
> diff --git a/tests/btrfs/212 b/tests/btrfs/212
> index f356d7d0f..745b9598a 100755
> --- a/tests/btrfs/212
> +++ b/tests/btrfs/212
> @@ -13,13 +13,13 @@ _begin_fstest auto balance dangerous
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	cd /
> -	rm -f $tmp.*
> +	_kill_fsstress
>  	kill $balance_pid &> /dev/null
>  	kill $cancel_pid &> /dev/null
> -	"$KILLALL_PROG" -q $FSSTRESS_PROG &> /dev/null
> -	$BTRFS_UTIL_PROG balance cancel $SCRATCH_MNT &> /dev/null
>  	wait
> +	$BTRFS_UTIL_PROG balance cancel $SCRATCH_MNT &> /dev/null
> +	cd /
> +	rm -f $tmp.*
>  }
>  
>  . ./common/filter
> @@ -49,7 +49,7 @@ cancel_workload()
>  	done
>  }
>  
> -$FSSTRESS_PROG -d $SCRATCH_MNT -w -n 100000  >> $seqres.full 2>/dev/null &
> +_run_fsstress_bg -d $SCRATCH_MNT -w -n 100000
>  balance_workload &
>  balance_pid=$!
>  
> @@ -58,11 +58,11 @@ cancel_pid=$!
>  
>  sleep $runtime
>  
> +_kill_fsstress
>  kill $balance_pid
>  kill $cancel_pid
> -"$KILLALL_PROG" -q $FSSTRESS_PROG &> /dev/null
> -$BTRFS_UTIL_PROG balance cancel $SCRATCH_MNT &> /dev/null
>  wait
> +$BTRFS_UTIL_PROG balance cancel $SCRATCH_MNT &> /dev/null
>  
>  echo "Silence is golden"
>  # success, all done
> diff --git a/tests/btrfs/232 b/tests/btrfs/232
> index 4dcc39cc4..f843edbf7 100755
> --- a/tests/btrfs/232
> +++ b/tests/btrfs/232
> @@ -23,8 +23,8 @@ writer()
>  	trap "wait; exit" SIGTERM
>  
>  	while true; do
> -		args=`_scale_fsstress_args -p 20 -n 1000 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
> -		$FSSTRESS_PROG $args >> $seqres.full
> +		args=`_scale_fsstress_args -p 20 -n 1000 -d $SCRATCH_MNT/stressdir`
> +		_run_fsstress $args
>  	done
>  }
>  
> diff --git a/tests/btrfs/252 b/tests/btrfs/252
> index 2da02ffa1..bb111b909 100755
> --- a/tests/btrfs/252
> +++ b/tests/btrfs/252
> @@ -24,6 +24,7 @@ _begin_fstest auto send balance stress
>  
>  _cleanup()
>  {
> +	_kill_fsstress
>  	if [ ! -z $balance_pid ]; then
>  		kill $balance_pid &> /dev/null
>  		wait $balance_pid
> @@ -79,10 +80,10 @@ snapshot_cmd="$snapshot_cmd \"$snapshots_dir/snap_\`date +'%s%N'\`\""
>  # it's pointless to have them.
>  #
>  echo "Running fsstress..." >> $seqres.full
> -$FSSTRESS_PROG $FSSTRESS_AVOID -d "$data_subvol" -p 1 -w \
> +_run_fsstress -d "$data_subvol" -p 1 -w \
>  	       -f subvol_create=0 -f subvol_delete=0 -f snapshot=0 \
>  	       -x "$snapshot_cmd" -X $num_snapshots \
> -	       -n $total_fsstress_ops >> $seqres.full
> +	       -n $total_fsstress_ops
>  
>  snapshots=(`IFS=$'\n' ls -1 "$snapshots_dir"`)
>  
> diff --git a/tests/btrfs/261 b/tests/btrfs/261
> index 4052baaec..7a08b5667 100755
> --- a/tests/btrfs/261
> +++ b/tests/btrfs/261
> @@ -35,7 +35,7 @@ prepare_fs()
>  	# Then use fsstress to generate some extra contents.
>  	# Disable setattr related operations, as it may set NODATACOW which will
>  	# not allow us to use btrfs checksum to verify the content.
> -	$FSSTRESS_PROG -f setattr=0 -d $SCRATCH_MNT -w -n 3000 >> $seqres.full
> +	_run_fsstress -f setattr=0 -d $SCRATCH_MNT -w -n 3000
>  	sync
>  
>  	# Save the fssum of this fs
> diff --git a/tests/btrfs/284 b/tests/btrfs/284
> index 6c554f325..ec3bc2720 100755
> --- a/tests/btrfs/284
> +++ b/tests/btrfs/284
> @@ -49,8 +49,8 @@ run_send_test()
>  
>  	# Use a single process so that in case of failure it's easier to
>  	# reproduce by using the same seed (logged in $seqres.full).
> -	run_check $FSSTRESS_PROG -d $SCRATCH_MNT -p 1 -n $((LOAD_FACTOR * 200)) \
> -		  -w $FSSTRESS_AVOID -x "$snapshot_cmd"
> +	_run_fsstress -d $SCRATCH_MNT -p 1 -n $((LOAD_FACTOR * 200)) \
> +		  -w -x "$snapshot_cmd"
>  
>  	$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/snap2 \
>  			 >> $seqres.full
> diff --git a/tests/btrfs/286 b/tests/btrfs/286
> index b8fa27673..7909fa507 100755
> --- a/tests/btrfs/286
> +++ b/tests/btrfs/286
> @@ -31,7 +31,7 @@ workload()
>  	# Use nodatasum mount option, so all data won't have checksum.
>  	_scratch_mount -o nodatasum
>  
> -	$FSSTRESS_PROG -p 10 -n 200 -d $SCRATCH_MNT >> $seqres.full
> +	_run_fsstress -p 10 -n 200 -d $SCRATCH_MNT
>  	sync
>  
>  	# Generate fssum for later verification, here we only care
> diff --git a/tests/btrfs/320 b/tests/btrfs/320
> index 15549165e..bcfb96d1a 100755
> --- a/tests/btrfs/320
> +++ b/tests/btrfs/320
> @@ -28,8 +28,7 @@ _basic_test()
>  	$BTRFS_UTIL_PROG qgroup show $units $SCRATCH_MNT | grep $subvolid >> \
>  		$seqres.full 2>&1
>  	[ $? -eq 0 ] || _fail "couldn't find our subvols quota group"
> -	run_check $FSSTRESS_PROG -d $SCRATCH_MNT/a -w -p 1 -n 2000 \
> -		$FSSTRESS_AVOID
> +	_run_fsstress -d $SCRATCH_MNT/a -w -p 1 -n 2000
>  	_btrfs subvolume snapshot $SCRATCH_MNT/a \
>  		$SCRATCH_MNT/b
>  
> @@ -55,8 +54,7 @@ _rescan_test()
>  	_btrfs subvolume create $SCRATCH_MNT/a
>  	_btrfs quota enable $SCRATCH_MNT/a
>  	subvolid=$(_btrfs_get_subvolid $SCRATCH_MNT a)
> -	run_check $FSSTRESS_PROG -d $SCRATCH_MNT/a -w -p 1 -n 2000 \
> -		$FSSTRESS_AVOID
> +	_run_fsstress -d $SCRATCH_MNT/a -w -p 1 -n 2000
>  	sync
>  	output=$($BTRFS_UTIL_PROG qgroup show $units $SCRATCH_MNT | grep "0/$subvolid")
>  	echo "qgroup values before rescan: $output" >> $seqres.full
> diff --git a/tests/btrfs/332 b/tests/btrfs/332
> index ab9860668..4fcdad4cd 100755
> --- a/tests/btrfs/332
> +++ b/tests/btrfs/332
> @@ -32,7 +32,7 @@ d1=$SCRATCH_MNT/d1
>  d2=$SCRATCH_MNT/d2
>  mkdir $d1
>  mkdir $d2
> -run_check $FSSTRESS_PROG -d $d1 -w -n 2000 $FSSTRESS_AVOID
> +_run_fsstress -d $d1 -w -n 2000
>  fssum_pre=$($FSSUM_PROG -A $SCRATCH_MNT)
>  
>  # enable squotas
> @@ -45,7 +45,7 @@ fssum_post=$($FSSUM_PROG -A $SCRATCH_MNT)
>  	|| echo "fssum $fssum_pre does not match $fssum_post after enabling squota"
>  
>  # do some more stuff
> -run_check $FSSTRESS_PROG -d $d2 -w -n 2000 $FSSTRESS_AVOID
> +_run_fsstress -d $d2 -w -n 2000
>  fssum_pre=$($FSSUM_PROG -A $SCRATCH_MNT)
>  _scratch_unmount
>  _check_btrfs_filesystem $SCRATCH_DEV
> diff --git a/tests/ext4/004 b/tests/ext4/004
> index 20cfdb444..ab2f838e9 100755
> --- a/tests/ext4/004
> +++ b/tests/ext4/004
> @@ -12,6 +12,7 @@ _begin_fstest auto dump
>  # Override the default cleanup function.
>  _cleanup()
>  {
> +	_kill_fsstress
>  	cd /
>  	rm -f $tmp.*
>  	# remove the generated data, which is much and meaningless.
> @@ -29,8 +30,7 @@ workout()
>  	echo "Run fsstress" >> $seqres.full
>  	args=`_scale_fsstress_args -z -f creat=5 -f write=20 -f mkdir=5 -n 100 -p 15 -d $dump_dir`
>  	echo "fsstress $args" >> $seqres.full
> -
> -	$FSSTRESS_PROG $args >> $seqres.full 2>&1
> +	_run_fsstress $args
>  
>  	echo "start Dump/Restore" >> $seqres.full
>  	cd $TEST_DIR
> diff --git a/tests/ext4/057 b/tests/ext4/057
> index 529f0c298..73cdf941a 100755
> --- a/tests/ext4/057
> +++ b/tests/ext4/057
> @@ -8,15 +8,6 @@
>  . ./common/preamble
>  _begin_fstest auto ioctl
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -        cd /
> -        rm -r -f $tmp.*
> -        kill -9 $fsstress_pid 2>/dev/null;
> -        wait > /dev/null 2>&1
> -}
> -
>  # Import common functions.
>  . ./common/filter
>  
> @@ -41,8 +32,7 @@ _scratch_mount
>  
>  # Begin fsstress while modifying UUID
>  fsstress_args=$(_scale_fsstress_args -d $SCRATCH_MNT -p 15 -n 999999)
> -$FSSTRESS_PROG $fsstress_args >> $seqres.full &
> -fsstress_pid=$!
> +_run_fsstress_bg $fsstress_args
>  
>  for n in $(seq 1 20); do
>          new_uuid=$($UUIDGEN_PROG)
> @@ -57,6 +47,8 @@ for n in $(seq 1 20); do
>          fi
>  done
>  
> +_kill_fsstress
> +
>  # success, all done
>  echo "Silence is golden"
>  status=0
> diff --git a/tests/ext4/058 b/tests/ext4/058
> index a7fc5e6c6..f85364964 100755
> --- a/tests/ext4/058
> +++ b/tests/ext4/058
> @@ -13,7 +13,6 @@
>  . ./common/preamble
>  _begin_fstest auto quick
>  
> -
>  _supported_fs ext4
>  _fixed_by_kernel_commit a08f789d2ab5 \
>  	"ext4: fix bug_on ext4_mb_use_inode_pa"
> @@ -23,7 +22,7 @@ _require_scratch
>  _scratch_mkfs -g 256 >> $seqres.full 2>&1 || _fail "mkfs failed"
>  _scratch_mount
>  
> -$FSSTRESS_PROG -d $SCRATCH_MNT/stress -n 1000 >> $seqres.full 2>&1
> +_run_fsstress -d $SCRATCH_MNT/stress -n 1000
>  
>  echo "Silence is golden"
>  
> diff --git a/tests/ext4/307 b/tests/ext4/307
> index f7c95c51b..8361f0431 100755
> --- a/tests/ext4/307
> +++ b/tests/ext4/307
> @@ -19,9 +19,9 @@ _workout()
>  	echo ""
>  	echo "Run fsstress"
>  	out=$SCRATCH_MNT/fsstress.$$
> -	args=`_scale_fsstress_args -p4 -n999 -f setattr=1 $FSSTRESS_AVOID -d $out`
> +	args=`_scale_fsstress_args -p4 -n999 -f setattr=1 -d $out`
>  	echo "fsstress $args" >> $seqres.full
> -	$FSSTRESS_PROG $args >> $seqres.full
> +	_run_fsstress $args
>  	find $out -type f > $out.list
>  	cat $out.list | xargs  md5sum > $out.md5sum
>  	usage=`du -sch $out | tail -n1 | gawk '{ print $1 }'`
> diff --git a/tests/generic/013 b/tests/generic/013
> index 3a000b97f..0b86d8b33 100755
> --- a/tests/generic/013
> +++ b/tests/generic/013
> @@ -9,18 +9,6 @@
>  . ./common/preamble
>  _begin_fstest other ioctl udf auto quick
>  
> -status=0	# success is the default!
> -
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -    cd /
> -    # we might get here with a RO FS
> -    _test_cycle_mount
> -    # now remove fsstress directory.
> -    rm -rf $TEST_DIR/fsstress.$$.*
> -}
> -
>  # Import common functions.
>  . ./common/filter
>  
> @@ -30,7 +18,7 @@ _do_test()
>      _param="$2"
>      _count="$3"
>  
> -    out=$TEST_DIR/fsstress.$$.$_n
> +    out=$TEST_DIR/fsstress.$seq.$_n
>      rm -rf $out
>      if ! mkdir $out
>      then
> @@ -44,9 +32,8 @@ _do_test()
>      echo "fsstress.$_n : $_param"
>      echo "-----------------------------------------------"
>      # -m limits number of users/groups so check doesn't fail (malloc) later
> -    dbgoutfile=$seqres.full
> -    if ! $FSSTRESS_PROG $_param $FSSTRESS_AVOID -v -m 8 -n $_count -d $out >>$dbgoutfile 2>&1
> -    then
> +    _run_fsstress $_param -v -m 8 -n $_count -d $out
> +    if [ $? -ne 0 ]; then
>          echo "    fsstress (count=$_count) returned $? - see $seqres.full"
>          echo "--------------------------------------"       >>$seqres.full
>          echo "$_n - output from fsstress:"                  >>$seqres.full
> @@ -62,6 +49,7 @@ _do_test()
>  _require_test
>  
>  echo "brevity is wit..."
> +status=0
>  
>  count=1000
>  procs=20
> @@ -80,7 +68,7 @@ _do_test 2 "-p $procs -r" $count
>  
>  _do_test 3 "-p 4 -z -f rmdir=10 -f link=10 -f creat=10 -f mkdir=10 -f rename=30 -f stat=30 -f unlink=30 -f truncate=20" $count
>  
> -# if all ok by here then probably don't need $seqres.full
> +rm -rf $TEST_DIR/fsstress.$seq.*
>  
>  exit
>  
> diff --git a/tests/generic/019 b/tests/generic/019
> index fe117ac8a..bed916b53 100755
> --- a/tests/generic/019
> +++ b/tests/generic/019
> @@ -22,7 +22,9 @@ _require_fail_make_request
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	kill $fs_pid $fio_pid &> /dev/null
> +	_kill_fsstress
> +	kill $fio_pid &> /dev/null
> +	wait
>  	_disallow_fail_make_request
>  	cd /
>  	rm -r -f $tmp.*
> @@ -85,13 +87,12 @@ FSSTRESS_AVOID="$FSSTRESS_AVOID -ffsync=0 -fsync=0 -ffdatasync=0 -f setattr=1"
>  _workout()
>  {
>  	out=$SCRATCH_MNT/fsstress.$$
> -	args=`_scale_fsstress_args -p 1 -n999999999 -f setattr=0 $FSSTRESS_AVOID -d $out`
> +	args=`_scale_fsstress_args -p 1 -n999999999 -f setattr=0 -d $out`
>  	echo ""
>  	echo "Start fsstress.."
>  	echo ""
>  	echo "fsstress $args" >> $seqres.full
> -	$FSSTRESS_PROG $args >> $seqres.full 2>&1 &
> -	fs_pid=$!
> +	_run_fsstress_bg $args
>  	echo "Start fio.."
>  	cat $fio_config >>  $seqres.full
>  	$FIO_PROG $fio_config >> $seqres.full 2>&1 &
> @@ -107,10 +108,8 @@ _workout()
>  	    >> $seqres.full 2>&1 && \
>  	    _fail "failed: still able to perform integrity fsync on $SCRATCH_MNT"
>  
> -	kill $fs_pid &> /dev/null
> -	wait $fs_pid
> +	_kill_fsstress
>  	wait $fio_pid
> -	unset fs_pid
>  	unset fio_pid
>  
>  	# We expect that broken FS still can be umounted
> diff --git a/tests/generic/051 b/tests/generic/051
> index 65571fdd0..69250cde6 100755
> --- a/tests/generic/051
> +++ b/tests/generic/051
> @@ -14,18 +14,8 @@ _begin_fstest shutdown auto stress log metadata repair
>  # Import common functions.
>  . ./common/filter
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	cd /
> -	_scratch_unmount 2>/dev/null
> -	rm -f $tmp.*
> -}
> -
> -
>  _require_scratch
>  _require_scratch_shutdown
> -_require_command "$KILLALL_PROG" killall
>  
>  _scratch_mkfs > $seqres.full 2>&1
>  _require_metadata_journaling $SCRATCH_DEV
> @@ -37,25 +27,23 @@ PROCS=$((2 * LOAD_FACTOR))
>  load_dir=$SCRATCH_MNT/test
>  
>  # let this run for a while
> -$FSSTRESS_PROG $FSSTRESS_AVOID -n10000000 -p $PROCS -d $load_dir >> $seqres.full 2>&1 &
> +_run_fsstress_bg -n 10000000 -p $PROCS -d $load_dir
>  sleep $SLEEP_TIME
> -$KILLALL_PROG -q $FSSTRESS_PROG
> -wait
> +_kill_fsstress
>  sync
>  _scratch_unmount
>  
>  # now mount again, run the load again, this time with a shutdown.
>  _scratch_mount
>  $XFS_FSR_PROG -v $load_dir >> $seqres.full 2>&1
> -$FSSTRESS_PROG -n10000000 -p $PROCS -d $load_dir >> $seqres.full 2>&1 &
> +_run_fsstress_bg -n10000000 -p $PROCS -d $load_dir
>  sleep $SLEEP_TIME
>  sync
>  
>  # now shutdown and unmount
>  sleep 5
>  _scratch_shutdown
> -$KILLALL_PROG -q $FSSTRESS_PROG
> -wait
> +_kill_fsstress
>  
>  # for some reason fsstress processes manage to live on beyond the wait?
>  sleep 5
> diff --git a/tests/generic/055 b/tests/generic/055
> index b1126c901..e57f95faf 100755
> --- a/tests/generic/055
> +++ b/tests/generic/055
> @@ -23,9 +23,9 @@ _do_meta()
>      param="-p 4 -z -f rmdir=10 -f link=10 -f creat=10 -f mkdir=10 \
>             -f rename=30 -f stat=30 -f unlink=30 -f truncate=20"
>      _echofull "calling fsstress $param -m8 -n $count"
> -    FSSTRESS_ARGS=`_scale_fsstress_args $param $FSSTRESS_AVOID -m 8 -n $count -d $out`
> -    if ! $FSSTRESS_PROG $FSSTRESS_ARGS >>$seqres.full 2>&1
> -    then
> +    FSSTRESS_ARGS=`_scale_fsstress_args $param -m 8 -n $count -d $out`
> +    _run_fsstress $FSSTRESS_ARGS
> +    if [ $? -ne 0 ]; then
>  	_echofull "fsstress failed"
>      fi
>  }
> diff --git a/tests/generic/068 b/tests/generic/068
> index 1e8248b9d..26c5ceea6 100755
> --- a/tests/generic/068
> +++ b/tests/generic/068
> @@ -19,8 +19,7 @@ _cleanup()
>  {
>  	# Make sure $SCRATCH_MNT is unfreezed
>  	xfs_freeze -u $SCRATCH_MNT 2>/dev/null
> -	[ -n "$pid" ] && kill -9 $pid 2>/dev/null
> -	wait $pid
> +	_kill_fsstress
>  	cd /
>  	rm -f $tmp.*
>  }
> @@ -54,8 +53,8 @@ touch $tmp.running
>        do
>        # We do both read & write IO - not only is this more realistic,
>        # but it also potentially tests atime updates
> -      FSSTRESS_ARGS=`_scale_fsstress_args -d $STRESS_DIR -p $procs -n $nops $FSSTRESS_AVOID`
> -      $FSSTRESS_PROG $FSSTRESS_ARGS >>$seqres.full
> +      FSSTRESS_ARGS=`_scale_fsstress_args -d $STRESS_DIR -p $procs -n $nops`
> +      _run_fsstress $FSSTRESS_ARGS >>$seqres.full
>      done
>  
>      rm -r $STRESS_DIR/*
> diff --git a/tests/generic/070 b/tests/generic/070
> index a8e84effd..000fc0482 100755
> --- a/tests/generic/070
> +++ b/tests/generic/070
> @@ -9,19 +9,10 @@
>  . ./common/preamble
>  _begin_fstest attr udf auto quick stress
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -    cd /
> -    rm -rf $TEST_DIR/fsstress
> -    rm -f $tmp.*
> -}
> -
>  # Import common functions.
>  . ./common/filter
>  . ./common/attr
>  
> -
>  _require_test
>  _require_attrs
>  
> @@ -34,7 +25,8 @@ FSSTRESS_ARGS=`_scale_fsstress_args \
>  	-f attr_set=100 \
>  	-f attr_remove=100 \
>          -p 1 -n 10000 -S c`
> -$FSSTRESS_PROG $FSSTRESS_ARGS >$seqres.full 2>&1
> +_run_fsstress $FSSTRESS_ARGS
> +rm -rf $TEST_DIR/fsstress
>  
>  status=$?
>  exit
> diff --git a/tests/generic/076 b/tests/generic/076
> index b50c2df5e..100f19715 100755
> --- a/tests/generic/076
> +++ b/tests/generic/076
> @@ -21,16 +21,14 @@ _lets_get_pidst()
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	echo "*** unmount"
> -	_scratch_unmount 2>/dev/null
>  	_lets_get_pidst
> +	cd /
> +	rm -f $tmp.*
>  }
> -_register_cleanup "_cleanup; rm -f $tmp.*"
>  
>  # Import common functions.
>  . ./common/filter
>  
> -
>  _require_scratch
>  _require_local_device $SCRATCH_DEV
>  
> @@ -48,9 +46,9 @@ echo "*** test concurrent block/fs access"
>  cat $SCRATCH_DEV >/dev/null &
>  pid=$!
>  
> -FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -p 2 -n 2000 $FSSTRESS_AVOID`
> +FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -p 2 -n 2000`
>  echo "run fsstress with args: $FSSTRESS_ARGS" >>$seqres.full
> -$FSSTRESS_PROG $FSSTRESS_ARGS >>$seqres.full
> +_run_fsstress $FSSTRESS_ARGS
>  _lets_get_pidst
>  
>  echo "*** done"
> diff --git a/tests/generic/076.out b/tests/generic/076.out
> index 54a8f7096..74a65bdec 100644
> --- a/tests/generic/076.out
> +++ b/tests/generic/076.out
> @@ -2,4 +2,3 @@ QA output created by 076
>  *** init fs
>  *** test concurrent block/fs access
>  *** done
> -*** unmount
> diff --git a/tests/generic/083 b/tests/generic/083
> index ff4785eee..6aa0ea06d 100755
> --- a/tests/generic/083
> +++ b/tests/generic/083
> @@ -18,18 +18,9 @@
>  . ./common/preamble
>  _begin_fstest rw auto enospc stress
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	echo "*** unmount"
> -	_scratch_unmount 2>/dev/null
> -	rm -f $tmp.*
> -}
> -
>  # Import common functions.
>  . ./common/filter
>  
> -
>  _require_scratch
>  _require_no_large_scratch_dev
>  
> @@ -52,8 +43,8 @@ workout()
>  	_scratch_mount
>  
>  	# -w ensures that the only ops are ones which cause write I/O
> -	FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -w -p $procs -n $nops $FSSTRESS_AVOID`
> -	$FSSTRESS_PROG $FSSTRESS_ARGS >>$seqres.full
> +	FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -w -p $procs -n $nops`
> +	_run_fsstress $FSSTRESS_ARGS >>$seqres.full
>  }
>  
>  echo "*** test out-of-space handling for random write operations"
> diff --git a/tests/generic/083.out b/tests/generic/083.out
> index 025afe30e..b853eadb4 100644
> --- a/tests/generic/083.out
> +++ b/tests/generic/083.out
> @@ -1,4 +1,3 @@
>  QA output created by 083
>  *** test out-of-space handling for random write operations
>  *** done
> -*** unmount
> diff --git a/tests/generic/117 b/tests/generic/117
> index f9769be94..a34f86165 100755
> --- a/tests/generic/117
> +++ b/tests/generic/117
> @@ -63,9 +63,7 @@ echo Running fsstress in serial:
>  i=0
>  while [ $i -lt $ITERATIONS ]; do
>      echo fsstress iteration: $i | tee -a $seqres.full
> -    $FSSTRESS_PROG \
> -	-d $SCRATCH_MNT/fsstress \
> -	$fss_ops -S c >>$seqres.full 2>&1
> +    _run_fsstress -d $SCRATCH_MNT/fsstress $fss_ops -S c
>  
>      let i=$i+1
>  done
> diff --git a/tests/generic/232 b/tests/generic/232
> index 35934cc18..c903a5619 100755
> --- a/tests/generic/232
> +++ b/tests/generic/232
> @@ -30,13 +30,12 @@ _fsstress()
>  
>  	out=$SCRATCH_MNT/fsstress.$$
>  	count=2000
> -	args=`_scale_fsstress_args -d $out -n $count -p 7 $FSSTRESS_AVOID`
> +	args=`_scale_fsstress_args -d $out -n $count -p 7`
>  
>  	echo "fsstress $args" >> $seqres.full
> -	if ! $FSSTRESS_PROG $args | tee -a $seqres.full | _filter_num
> +	if ! _run_fsstress $args
>  	then
>  		echo "    fsstress $args returned $?"
> -		cat $tmp.out | tee -a $seqres.full
>  		status=1
>  	fi
>  }
> diff --git a/tests/generic/232.out b/tests/generic/232.out
> index 5da53d4bf..9214607f0 100644
> --- a/tests/generic/232.out
> +++ b/tests/generic/232.out
> @@ -2,6 +2,5 @@ QA output created by 232
>  
>  Testing fsstress
>  
> -seed = S
>  Comparing user usage
>  Comparing group usage
> diff --git a/tests/generic/269 b/tests/generic/269
> index 341fcd22f..979cc15cb 100755
> --- a/tests/generic/269
> +++ b/tests/generic/269
> @@ -21,10 +21,9 @@ _workout()
>  	num_iterations=10
>  	enospc_time=2
>  	out=$SCRATCH_MNT/fsstress.$$
> -	args=`_scale_fsstress_args -p128 -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out`
> +	args=`_scale_fsstress_args -p128 -n999999999 -f setattr=1 -d $out`
>  	echo "fsstress $args" >> $seqres.full
> -	$FSSTRESS_PROG $args &>> $seqres.full &
> -	pid=$!
> +	_run_fsstress_bg $args
>  	echo "Run dd writers in parallel"
>  	for ((i=0; i < num_iterations; i++))
>  	do
> @@ -34,8 +33,7 @@ _workout()
>  		sleep $enospc_time
>  	done
>  	echo "Killing fsstress process..." >> $seqres.full
> -	kill $pid >> $seqres.full 2>&1
> -	wait $pid
> +	_kill_fsstress
>  }
>  
>  _require_scratch
> diff --git a/tests/generic/270 b/tests/generic/270
> index cf523f4ea..aff379ac5 100755
> --- a/tests/generic/270
> +++ b/tests/generic/270
> @@ -28,8 +28,8 @@ _workout()
>  	args=`_scale_fsstress_args -p128 -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out`
>  	echo "fsstress $args" >> $seqres.full
>  	# Grant chown capability 
> -	cp $FSSTRESS_PROG  $tmp.fsstress.bin
> -	$SETCAP_PROG cap_chown=epi  $tmp.fsstress.bin
> +	cp $FSSTRESS_PROG $_FSSTRESS_PROG
> +	$SETCAP_PROG cap_chown=epi $_FSSTRESS_PROG
>  
>  	# io_uring accounts memory it needs under the rlimit memlocked option,
>  	# which can be quite low on some setups (especially 64K pagesize). root
> @@ -37,7 +37,8 @@ _workout()
>  	# io_uring_queue_init fail on ENOMEM, set max locked memory to unlimited
>  	# temporarily.
>  	ulimit -l unlimited
> -	(su $qa_user -c "$tmp.fsstress.bin $args" &) > /dev/null 2>&1
> +	su $qa_user -c "$_FSSTRESS_PROG $args" > /dev/null 2>&1 &
> +	_FSSTRESS_PID=$!
>  
>  	echo "Run dd writers in parallel"
>  	for ((i=0; i < num_iterations; i++))
> @@ -49,7 +50,7 @@ _workout()
>  		sleep $enospc_time
>  	done
>  
> -	$KILLALL_PROG -w $tmp.fsstress.bin
> +	_kill_fsstress
>  }
>  
>  _require_quota
> diff --git a/tests/generic/388 b/tests/generic/388
> index 89ddda31d..34609a0d3 100755
> --- a/tests/generic/388
> +++ b/tests/generic/388
> @@ -17,23 +17,9 @@
>  . ./common/preamble
>  _begin_fstest shutdown auto log metadata recoveryloop
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	cd /
> -	rm -f $tmp.*
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -	_scratch_unmount > /dev/null 2>&1
> -}
> -
> -# Import common functions.
> -
> -# Modify as appropriate.
> -
>  _require_scratch
>  _require_local_device $SCRATCH_DEV
>  _require_scratch_shutdown
> -_require_command "$KILLALL_PROG" "killall"
>  
>  echo "Silence is golden."
>  
> @@ -42,20 +28,14 @@ _require_metadata_journaling $SCRATCH_DEV
>  _scratch_mount
>  
>  while _soak_loop_running $((50 * TIME_FACTOR)); do
> -	($FSSTRESS_PROG $FSSTRESS_AVOID -d $SCRATCH_MNT -n 999999 -p 4 >> $seqres.full &) \
> -		> /dev/null 2>&1
> +	_run_fsstress_bg -d $SCRATCH_MNT -n 999999 -p 4
>  
>  	# purposely include 0 second sleeps to test shutdown immediately after
>  	# recovery
>  	sleep $((RANDOM % 3))
>  	_scratch_shutdown
>  
> -	ps -e | grep fsstress > /dev/null 2>&1
> -	while [ $? -eq 0 ]; do
> -		$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -		wait > /dev/null 2>&1
> -		ps -e | grep fsstress > /dev/null 2>&1
> -	done
> +	_kill_fsstress
>  
>  	# Toggle between rw and ro mounts for recovery. Quit if any mount
>  	# attempt fails so we don't shutdown the host fs.
> diff --git a/tests/generic/390 b/tests/generic/390
> index 02f6c5eef..52270782e 100755
> --- a/tests/generic/390
> +++ b/tests/generic/390
> @@ -18,8 +18,7 @@ _cleanup()
>  	[ -n "$freeze_pids" ] && kill -9 $freeze_pids 2>/dev/null
>  	wait $freeze_pids
>  	xfs_freeze -u $SCRATCH_MNT 2>/dev/null
> -	[ -n "$fsstress_pid" ] && kill -9 $fsstress_pid 2>/dev/null
> -	wait $fsstress_pid
> +	_kill_fsstress
>  	rm -f $tmp.*
>  }
>  
> @@ -49,9 +48,8 @@ fi
>  nops=1000
>  stress_dir="$SCRATCH_MNT/fsstress_test_dir"
>  mkdir "$stress_dir"
> -fsstress_args=`_scale_fsstress_args -d $stress_dir -p $procs -n $nops $FSSTRESS_AVOID`
> -$FSSTRESS_PROG $fsstress_args >>$seqres.full 2>&1 &
> -fsstress_pid=$!
> +fsstress_args=`_scale_fsstress_args -d $stress_dir -p $procs -n $nops`
> +_run_fsstress_bg $fsstress_args
>  
>  # Start multi-threads freeze/unfreeze
>  for ((i=0; i<$procs; i++)); do
> @@ -62,9 +60,8 @@ for ((i=0; i<$procs; i++)); do
>  	freeze_pids="$! $freeze_pids"
>  done
>  
> -wait $fsstress_pid
> +_wait_for_fsstress
>  result=$?
> -unset fsstress_pid
>  wait $freeze_pids
>  unset freeze_pids
>  
> diff --git a/tests/generic/409 b/tests/generic/409
> index b7edc2ac6..ab7e7eb55 100755
> --- a/tests/generic/409
> +++ b/tests/generic/409
> @@ -25,11 +25,12 @@ _begin_fstest auto quick mount
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	cd /
> -	rm -f $tmp.*
> +	_kill_fsstress
>  	_clear_mount_stack
>  	# make sure there's no bug cause dentry isn't be freed
>  	rm -rf $MNTHEAD
> +	cd /
> +	rm -f $tmp.*
>  }
>  
>  # Import common functions.
> @@ -43,7 +44,7 @@ fs_stress()
>  {
>  	local target=$1
>  
> -	$FSSTRESS_PROG -z -n 50 -p 3 \
> +	_run_fsstress -z -n 50 -p 3 \
>  		       -f creat=5 \
>  		       -f mkdir=5 \
>  		       -f link=2 \
> @@ -56,7 +57,7 @@ fs_stress()
>  		       -f chown=1 \
>  		       -f getdents=1 \
>  		       -f fiemap=1 \
> -		       -d $target >>$seqres.full
> +		       -d $target
>  	sync
>  }
>  
> diff --git a/tests/generic/410 b/tests/generic/410
> index 902f27144..f0f0921be 100755
> --- a/tests/generic/410
> +++ b/tests/generic/410
> @@ -33,11 +33,12 @@ _begin_fstest auto quick mount
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	cd /
> -	rm -f $tmp.*
> +	_kill_fsstress
>  	_clear_mount_stack
>  	# make sure there's no bug cause dentry isn't be freed
>  	rm -rf $MNTHEAD
> +	cd /
> +	rm -f $tmp.*
>  }
>  
>  # Import common functions.
> @@ -51,7 +52,7 @@ fs_stress()
>  {
>  	local target=$1
>  
> -	$FSSTRESS_PROG -z -n 50 -p 3 \
> +	_run_fsstress -z -n 50 -p 3 \
>  		       -f creat=5 \
>  		       -f mkdir=5 \
>  		       -f link=2 \
> @@ -64,7 +65,7 @@ fs_stress()
>  		       -f chown=1 \
>  		       -f getdents=1 \
>  		       -f fiemap=1 \
> -		       -d $target >>$seqres.full
> +		       -d $target
>  	sync
>  }
>  
> diff --git a/tests/generic/411 b/tests/generic/411
> index c35436c82..3b55b4f91 100755
> --- a/tests/generic/411
> +++ b/tests/generic/411
> @@ -14,11 +14,12 @@ _begin_fstest auto quick mount
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	cd /
> -	rm -f $tmp.*
> +	_kill_fsstress
>  	_clear_mount_stack
>  	# make sure there's no bug cause dentry isn't be freed
>  	rm -rf $MNTHEAD
> +	cd /
> +	rm -f $tmp.*
>  }
>  
>  # Import common functions.
> @@ -32,7 +33,7 @@ fs_stress()
>  {
>  	local target=$1
>  
> -	$FSSTRESS_PROG -z -n 500 -p 5 \
> +	_run_fsstress -z -n 500 -p 5 \
>  		       -f creat=5 \
>  		       -f mkdir=5 \
>  		       -f dwrite=1 \
> @@ -47,7 +48,7 @@ fs_stress()
>  		       -f chown=1 \
>  		       -f getdents=1 \
>  		       -f fiemap=1 \
> -		       -d $target >>$seqres.full
> +		       -d $target
>  	sync
>  }
>  
> diff --git a/tests/generic/461 b/tests/generic/461
> index 468ce46f0..95dd6a34d 100755
> --- a/tests/generic/461
> +++ b/tests/generic/461
> @@ -14,18 +14,8 @@ _begin_fstest auto shutdown stress
>  # Import common functions.
>  . ./common/filter
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	cd /
> -	_scratch_unmount 2>/dev/null
> -	rm -f $tmp.*
> -}
> -
> -
>  _require_scratch_nocheck
>  _require_scratch_shutdown
> -_require_command "$KILLALL_PROG" killall
>  
>  _scratch_mkfs > $seqres.full 2>&1
>  _scratch_mount
> @@ -35,15 +25,14 @@ PROCS=$((4 * LOAD_FACTOR))
>  
>  load_dir=$SCRATCH_MNT/test
>  
> -$FSSTRESS_PROG $FSSTRESS_AVOID -n10000000 -p $PROCS -d $load_dir >> $seqres.full 2>&1 &
> +_run_fsstress_bg -n10000000 -p $PROCS -d $load_dir
>  sleep $SLEEP_TIME
>  sync
>  
>  # now shutdown and unmount
>  sleep 5
>  _scratch_shutdown
> -$KILLALL_PROG -q $FSSTRESS_PROG
> -wait
> +_kill_fsstress
>  
>  # for some reason fsstress processes manage to live on beyond the wait?
>  sleep 5
> diff --git a/tests/generic/475 b/tests/generic/475
> index 4b854f9ab..9df2051fb 100755
> --- a/tests/generic/475
> +++ b/tests/generic/475
> @@ -17,11 +17,11 @@ _begin_fstest shutdown auto log metadata eio recoveryloop smoketest
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	cd /
> -	rm -f $tmp.*
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> +	_kill_fsstress
>  	_dmerror_unmount
>  	_dmerror_cleanup
> +	cd /
> +	rm -f $tmp.*
>  }
>  
>  # Import common functions.
> @@ -31,7 +31,6 @@ _cleanup()
>  
>  _require_scratch
>  _require_dm_target error
> -_require_command "$KILLALL_PROG" "killall"
>  
>  echo "Silence is golden."
>  
> @@ -41,8 +40,7 @@ _dmerror_init
>  _dmerror_mount
>  
>  while _soak_loop_running $((50 * TIME_FACTOR)); do
> -	($FSSTRESS_PROG $FSSTRESS_AVOID -d $SCRATCH_MNT -n 999999 -p $((LOAD_FACTOR * 4)) >> $seqres.full &) \
> -		> /dev/null 2>&1
> +	_run_fsstress_bg -d $SCRATCH_MNT -n 999999 -p $((LOAD_FACTOR * 4))
>  
>  	# purposely include 0 second sleeps to test shutdown immediately after
>  	# recovery
> @@ -55,12 +53,7 @@ while _soak_loop_running $((50 * TIME_FACTOR)); do
>  	# error table helper *without* 'lockfs'.
>  	_dmerror_load_error_table
>  
> -	ps -e | grep fsstress > /dev/null 2>&1
> -	while [ $? -eq 0 ]; do
> -		$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -		wait > /dev/null 2>&1
> -		ps -e | grep fsstress > /dev/null 2>&1
> -	done
> +	_kill_fsstress
>  
>  	# Mount again to replay log after loading working table, so we have a
>  	# consistent XFS after test.
> diff --git a/tests/generic/476 b/tests/generic/476
> index cf7402a12..769b3745f 100755
> --- a/tests/generic/476
> +++ b/tests/generic/476
> @@ -10,20 +10,7 @@
>  . ./common/preamble
>  _begin_fstest auto rw long_rw stress soak smoketest
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	cd /
> -	rm -f $tmp.*
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -}
> -
> -# Import common functions.
> -
> -# Modify as appropriate.
> -
>  _require_scratch
> -_require_command "$KILLALL_PROG" "killall"
>  
>  echo "Silence is golden."
>  
> @@ -35,7 +22,7 @@ nr_ops=$((25000 * nr_cpus * TIME_FACTOR))
>  fsstress_args=(-w -d $SCRATCH_MNT -n $nr_ops -p $nr_cpus)
>  test -n "$SOAK_DURATION" && fsstress_args+=(--duration="$SOAK_DURATION")
>  
> -$FSSTRESS_PROG $FSSTRESS_AVOID "${fsstress_args[@]}" >> $seqres.full
> +_run_fsstress_bg "${fsstress_args[@]}"
>  
>  # success, all done
>  status=0
> diff --git a/tests/generic/482 b/tests/generic/482
> index 54fee07d4..8c114ee03 100755
> --- a/tests/generic/482
> +++ b/tests/generic/482
> @@ -18,10 +18,10 @@ _begin_fstest auto metadata replay thin recoveryloop
>  # failure leaves the corpse intact for post-mortem failure analysis.
>  _cleanup()
>  {
> -	cd /
> -	$KILLALL_PROG -KILL -q $FSSTRESS_PROG &> /dev/null
> +	_kill_fsstress
>  	_log_writes_cleanup &> /dev/null
>  	_dmthin_cleanup
> +	cd /
>  	rm -f $tmp.*
>  }
>  
> @@ -29,7 +29,7 @@ _cleanup()
>  #_cleanup()
>  #{
>  #	cd /
> -#	$KILLALL_PROG -KILL -q $FSSTRESS_PROG &> /dev/null
> +#	[ -n "$fsstress_pid" ] && kill $fsstress_pid
>  #	if [ $status -eq 0 ]; then
>  #		_log_writes_cleanup &> /dev/null
>  #		_dmthin_cleanup
> @@ -48,7 +48,6 @@ _cleanup()
>  # Modify as appropriate.
>  
>  _require_no_logdev
> -_require_command "$KILLALL_PROG" killall
>  # Use thin device as replay device, which requires $SCRATCH_DEV
>  _require_scratch_nocheck
>  # and we need extra device as log device
> @@ -60,8 +59,7 @@ nr_cpus=$("$here/src/feature" -o)
>  if [ $nr_cpus -gt 8 ]; then
>  	nr_cpus=8
>  fi
> -fsstress_args=$(_scale_fsstress_args -w -d $SCRATCH_MNT -n 512 -p $nr_cpus \
> -		$FSSTRESS_AVOID)
> +fsstress_args=$(_scale_fsstress_args -w -d $SCRATCH_MNT -n 512 -p $nr_cpus)
>  
>  size=$(_small_fs_size_mb 200)           # 200m phys/virt size
>  devsize=$((1024*1024*size / 512))
> @@ -77,7 +75,7 @@ _log_writes_mkfs >> $seqres.full 2>&1
>  _log_writes_mark mkfs
>  
>  _log_writes_mount
> -run_check $FSSTRESS_PROG $fsstress_args
> +_run_fsstress $fsstress_args
>  _log_writes_unmount
>  
>  _log_writes_remove
> diff --git a/tests/generic/547 b/tests/generic/547
> index 1e3881db9..14d02b4fd 100755
> --- a/tests/generic/547
> +++ b/tests/generic/547
> @@ -14,6 +14,7 @@ _begin_fstest auto quick log
>  # Override the default cleanup function.
>  _cleanup()
>  {
> +	_kill_fsstress
>  	_cleanup_flakey
>  	cd /
>  	rm -f $tmp.*
> @@ -38,10 +39,10 @@ _init_flakey
>  _mount_flakey
>  
>  mkdir $SCRATCH_MNT/test
> -args=`_scale_fsstress_args -p 4 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/test`
> +args=`_scale_fsstress_args -p 4 -n 100 -d $SCRATCH_MNT/test`
>  args="$args -f mknod=0 -f symlink=0"
>  echo "Running fsstress with arguments: $args" >>$seqres.full
> -$FSSTRESS_PROG $args >>$seqres.full
> +_run_fsstress $args
>  
>  # Fsync every file and directory.
>  find $SCRATCH_MNT/test \( -type f -o -type d \) -exec $XFS_IO_PROG -c fsync {} \;
> diff --git a/tests/generic/560 b/tests/generic/560
> index 62983d69b..067d3ec00 100755
> --- a/tests/generic/560
> +++ b/tests/generic/560
> @@ -30,8 +30,8 @@ function iterate_dedup_verify()
>  		find $dest -type f -exec md5sum {} \; \
>  			> $md5file$index
>  		# Make some noise
> -		$FSSTRESS_PROG $fsstress_opts -d $noisedir \
> -			       -n 200 -p $((5 * LOAD_FACTOR)) >/dev/null 2>&1
> +		_run_fsstress $fsstress_opts -d $noisedir \
> +			       -n 200 -p $((5 * LOAD_FACTOR))
>  		# Too many output, so only save error output
>  		$DUPEREMOVE_PROG -dr --dedupe-options=same $dupdir \
>  			>/dev/null 2>$seqres.full
> @@ -51,8 +51,7 @@ md5file=${tmp}.md5sum
>  
>  fsstress_opts="-w -r"
>  # Create some files to be original data
> -$FSSTRESS_PROG $fsstress_opts -d $srcdir \
> -	       -n 500 -p $((5 * LOAD_FACTOR)) >/dev/null 2>&1
> +_run_fsstress $fsstress_opts -d $srcdir -n 500 -p $((5 * LOAD_FACTOR))
>  
>  # Calculate how many test cycles will be run
>  src_size=`du -ks $srcdir | awk '{print $1}'`
> diff --git a/tests/generic/561 b/tests/generic/561
> index 39e5977a3..3e931b1a7 100755
> --- a/tests/generic/561
> +++ b/tests/generic/561
> @@ -13,9 +13,9 @@ _begin_fstest auto stress dedupe
>  # Override the default cleanup function.
>  _cleanup()
>  {
> +	end_test
>  	cd /
>  	rm -f $tmp.*
> -	end_test
>  }
>  
>  # Import common functions.
> @@ -23,28 +23,20 @@ _cleanup()
>  . ./common/reflink
>  
>  _require_scratch_duperemove
> -_require_command "$KILLALL_PROG" killall
>  
>  _scratch_mkfs > $seqres.full 2>&1
>  _scratch_mount >> $seqres.full 2>&1
>  
>  function end_test()
>  {
> -	local f=1
> +	_kill_fsstress
>  
>  	# stop duperemove running
>  	if [ -e $dupe_run ]; then
>  		rm -f $dupe_run
> -		$KILLALL_PROG -q $DUPEREMOVE_PROG > /dev/null 2>&1
> +		kill $dedup_pids
>  		wait $dedup_pids
>  	fi
> -
> -	# Make sure all fsstress get killed
> -	while [ $f -ne 0 ]; do
> -		$KILLALL_PROG -q $FSSTRESS_PROG > /dev/null 2>&1
> -		sleep 1
> -		f=`ps -eLf | grep $FSSTRESS_PROG | grep -v "grep" | wc -l`
> -	done
>  }
>  
>  sleep_time=$((50 * TIME_FACTOR))
> @@ -53,7 +45,8 @@ sleep_time=$((50 * TIME_FACTOR))
>  testdir="$SCRATCH_MNT/dir"
>  mkdir $testdir
>  fsstress_opts="-r -n 1000 -p $((5 * LOAD_FACTOR))"
> -$FSSTRESS_PROG $fsstress_opts -d $testdir -l 0 >> $seqres.full 2>&1 &
> +_run_fsstress_bg $fsstress_opts -d $testdir -l 0
> +
>  dedup_pids=""
>  dupe_run=$TEST_DIR/${seq}-running
>  # Start several dedupe processes on same directory
> diff --git a/tests/generic/579 b/tests/generic/579
> index 3191342b3..4187ab0f0 100755
> --- a/tests/generic/579
> +++ b/tests/generic/579
> @@ -16,7 +16,7 @@ _begin_fstest auto stress verity
>  _cleanup()
>  {
>  	# Stop all subprocesses.
> -	$KILLALL_PROG -q $FSSTRESS_PROG
> +	_kill_fsstress
>  	touch $tmp.done
>  	wait
>  
> @@ -29,7 +29,6 @@ _cleanup()
>  . ./common/verity
>  
>  _require_scratch_verity
> -_require_command "$KILLALL_PROG" killall
>  _disable_fsverity_signatures
>  
>  _scratch_mkfs_verity &>> $seqres.full
> @@ -92,8 +91,7 @@ done
>  ) &
>  
>  # Start the fsstress processes.
> -$FSSTRESS_PROG $FSSTRESS_AVOID -p $nproc_stress -l 0 -d $SCRATCH_MNT/stressdir \
> -	>> $seqres.full 2>&1 &
> +_run_fsstress_bg -p $nproc_stress -l 0 -d $SCRATCH_MNT/stressdir
>  
>  # Run for a while.
>  sleep $runtime
> diff --git a/tests/generic/585 b/tests/generic/585
> index fb675c8d5..b95cd9abf 100755
> --- a/tests/generic/585
> +++ b/tests/generic/585
> @@ -23,10 +23,10 @@ _scratch_mount >> $seqres.full 2>&1
>  # start a create and rename(rename_whiteout) workload. These processes
>  # occur simultaneously may cause the deadlock between AGI and AGF with
>  # RENAME_WHITEOUT.
> -$FSSTRESS_PROG -z -n 150 -p 100 \
> +_run_fsstress -z -n 150 -p 100 \
>  		-f mknod=5 \
>  		-f rwhiteout=5 \
> -		-d $SCRATCH_MNT/fsstress >> $seqres.full 2>&1
> +		-d $SCRATCH_MNT/fsstress
>  
>  echo Silence is golden
>  
> diff --git a/tests/generic/589 b/tests/generic/589
> index 0ce16556a..969a8ac61 100755
> --- a/tests/generic/589
> +++ b/tests/generic/589
> @@ -28,11 +28,12 @@ _begin_fstest auto mount
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	cd /
> -	rm -f $tmp.*
> +	_kill_fsstress
>  	_clear_mount_stack
>  	# make sure there's no bug cause dentry isn't be freed
>  	rm -rf $MNTHEAD
> +	cd /
> +	rm -f $tmp.*
>  }
>  
>  # Import common functions.
> @@ -46,7 +47,7 @@ fs_stress()
>  {
>  	local target=$1
>  
> -	$FSSTRESS_PROG -n 50 -p 3 -d $target >>$seqres.full
> +	_run_fsstress -n 50 -p 3 -d $target
>  	sync
>  }
>  
> diff --git a/tests/generic/642 b/tests/generic/642
> index a7112a08f..4b92a9c18 100755
> --- a/tests/generic/642
> +++ b/tests/generic/642
> @@ -10,17 +10,9 @@
>  . ./common/preamble
>  _begin_fstest auto soak attr long_rw stress smoketest
>  
> -_cleanup()
> -{
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -	cd /
> -	rm -f $tmp.*
> -}
> -
>  # Modify as appropriate.
>  
>  _require_scratch
> -_require_command "$KILLALL_PROG" "killall"
>  
>  echo "Silence is golden."
>  
> @@ -50,7 +42,7 @@ args+=('-f' "setfattr=20")
>  args+=('-f' "attr_set=60")	# sets larger xattrs
>  test -n "$SOAK_DURATION" && args+=(--duration="$SOAK_DURATION")
>  
> -$FSSTRESS_PROG "${args[@]}" $FSSTRESS_AVOID -d $SCRATCH_MNT -n $nr_ops -p $nr_cpus >> $seqres.full
> +_run_fsstress "${args[@]}" -d $SCRATCH_MNT -n $nr_ops -p $nr_cpus
>  
>  # success, all done
>  status=0
> diff --git a/tests/generic/648 b/tests/generic/648
> index 29d1b470b..e4c9990e1 100755
> --- a/tests/generic/648
> +++ b/tests/generic/648
> @@ -16,16 +16,15 @@ _begin_fstest shutdown auto log metadata eio recoveryloop
>  
>  _cleanup()
>  {
> -	cd /
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -	wait
> +	_kill_fsstress
>  	if [ -n "$loopmnt" ]; then
>  		$UMOUNT_PROG $loopmnt 2>/dev/null
>  		rm -r -f $loopmnt
>  	fi
> -	rm -f $tmp.*
>  	_dmerror_unmount
>  	_dmerror_cleanup
> +	cd /
> +	rm -f $tmp.*
>  }
>  
>  # Import common functions.
> @@ -37,7 +36,6 @@ _cleanup()
>  _require_scratch_reflink
>  _require_cp_reflink
>  _require_dm_target error
> -_require_command "$KILLALL_PROG" "killall"
>  _require_loop
>  
>  echo "Silence is golden."
> @@ -71,8 +69,6 @@ snap_loop_fs() {
>  	rm -f "$snap_aliveflag"
>  }
>  
> -fsstress=($FSSTRESS_PROG $FSSTRESS_AVOID -d "$loopmnt" -n 999999 -p "$((LOAD_FACTOR * 4))")
> -
>  while _soak_loop_running $((25 * TIME_FACTOR)); do
>  	touch $scratch_aliveflag
>  	snap_loop_fs >> $seqres.full 2>&1 &
> @@ -84,7 +80,7 @@ while _soak_loop_running $((25 * TIME_FACTOR)); do
>  		break
>  	fi
>  
> -	("${fsstress[@]}" >> $seqres.full &) > /dev/null 2>&1
> +	_run_fsstress_bg -d "$loopmnt" -n 999999 -p "$((LOAD_FACTOR * 4))"
>  
>  	# purposely include 0 second sleeps to test shutdown immediately after
>  	# recovery
> @@ -98,12 +94,7 @@ while _soak_loop_running $((25 * TIME_FACTOR)); do
>  	# error table helper *without* 'lockfs'.
>  	_dmerror_load_error_table
>  
> -	ps -e | grep fsstress > /dev/null 2>&1
> -	while [ $? -eq 0 ]; do
> -		$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -		wait > /dev/null 2>&1
> -		ps -e | grep fsstress > /dev/null 2>&1
> -	done
> +	_kill_fsstress
>  	for ((j = 0; j < 10; j++)); do
>  		test -e "$snap_aliveflag" || break
>  		sleep 1
> diff --git a/tests/generic/650 b/tests/generic/650
> index 5d2cb8977..36a23e48d 100755
> --- a/tests/generic/650
> +++ b/tests/generic/650
> @@ -16,14 +16,14 @@ _begin_fstest auto rw stress soak
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	cd /
> -	rm -f $tmp.*
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> +	_kill_fsstress
>  	wait	# for exercise_cpu_hotplug subprocess
>  	for i in "$sysfs_cpu_dir/"cpu*/online; do
>  		echo 1 > "$i" 2>/dev/null
>  	done
>  	test -n "$stress_dir" && rm -r -f "$stress_dir"
> +	cd /
> +	rm -f $tmp.*
>  }
>  
>  exercise_cpu_hotplug()
> @@ -39,7 +39,6 @@ exercise_cpu_hotplug()
>  }
>  
>  _require_test
> -_require_command "$KILLALL_PROG" "killall"
>  
>  sysfs_cpu_dir="/sys/devices/system/cpu"
>  
> @@ -71,13 +70,17 @@ test "$nr_cpus" -gt 1024 && nr_cpus="$nr_hotplug_cpus"
>  fsstress_args+=(-p $nr_cpus)
>  if [ -n "$SOAK_DURATION" ]; then
>  	test "$SOAK_DURATION" -lt 10 && SOAK_DURATION=10
> -	fsstress_args+=(--duration="$((SOAK_DURATION / 10))")
> +else
> +	# run for 30s per iteration max
> +	SOAK_DURATION=300
>  fi
> +fsstress_args+=(--duration="$((SOAK_DURATION / 10))")
>  
>  nr_ops=$((2500 * TIME_FACTOR))
>  fsstress_args+=(-n $nr_ops)
>  for ((i = 0; i < 10; i++)); do
> -	$FSSTRESS_PROG $FSSTRESS_AVOID -w "${fsstress_args[@]}" >> $seqres.full
> +	_run_fsstress_bg -w "${fsstress_args[@]}"
> +	_wait_for_fsstress
>  	_test_cycle_mount
>  done
>  
> diff --git a/tests/generic/750 b/tests/generic/750
> index dba8021d6..5c54a5c78 100755
> --- a/tests/generic/750
> +++ b/tests/generic/750
> @@ -11,13 +11,12 @@ _begin_fstest auto rw long_rw stress soak smoketest
>  
>  _cleanup()
>  {
> -	cd /
> +	_kill_fsstress
>  	rm -f $runfile
> -	rm -f $tmp.*
>  	kill -9 $trigger_compaction_pid > /dev/null 2>&1
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -
>  	wait > /dev/null 2>&1
> +	rm -f $tmp.*
> +	cd /
>  }
>  
>  # Import common functions.
> @@ -26,7 +25,6 @@ _cleanup()
>  
>  _require_scratch
>  _require_vm_compaction
> -_require_command "$KILLALL_PROG" "killall"
>  
>  # We still deadlock with this test on v6.10-rc2, we need more work.
>  # but the below makes things better.
> @@ -52,7 +50,7 @@ while [ -e $runfile ]; do
>  done &
>  trigger_compaction_pid=$!
>  
> -$FSSTRESS_PROG $FSSTRESS_AVOID "${fsstress_args[@]}" >> $seqres.full
> +_run_fsstress "${fsstress_args[@]}"
>  
>  rm -f $runfile
>  wait > /dev/null 2>&1
> diff --git a/tests/generic/753 b/tests/generic/753
> index e427d62d1..f5665320a 100755
> --- a/tests/generic/753
> +++ b/tests/generic/753
> @@ -16,11 +16,11 @@ _begin_fstest shutdown auto log metadata eio recoveryloop attr
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	cd /
> -	rm -f $tmp.*
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> +	_kill_fsstress
>  	_dmerror_unmount
>  	_dmerror_cleanup
> +	cd /
> +	rm -f $tmp.*
>  }
>  
>  # Import common functions.
> @@ -30,7 +30,6 @@ _cleanup()
>  
>  _require_scratch
>  _require_dm_target error
> -_require_command "$KILLALL_PROG" "killall"
>  
>  echo "Silence is golden."
>  
> @@ -59,8 +58,7 @@ args+=('-f' "setfattr=20")
>  args+=('-f' "attr_set=60")	# sets larger xattrs
>  
>  while _soak_loop_running $((50 * TIME_FACTOR)); do
> -	($FSSTRESS_PROG "${args[@]}" $FSSTRESS_AVOID -d $SCRATCH_MNT -n 999999 -p $((LOAD_FACTOR * 4)) >> $seqres.full &) \
> -		> /dev/null 2>&1
> +	_run_fsstress_bg "${args[@]}" -d $SCRATCH_MNT -n 999999 -p $((LOAD_FACTOR * 4))
>  
>  	# purposely include 0 second sleeps to test shutdown immediately after
>  	# recovery
> @@ -73,12 +71,7 @@ while _soak_loop_running $((50 * TIME_FACTOR)); do
>  	# error table helper *without* 'lockfs'.
>  	_dmerror_load_error_table
>  
> -	ps -e | grep fsstress > /dev/null 2>&1
> -	while [ $? -eq 0 ]; do
> -		$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -		wait > /dev/null 2>&1
> -		ps -e | grep fsstress > /dev/null 2>&1
> -	done
> +	_kill_fsstress
>  
>  	# Mount again to replay log after loading working table, so we have a
>  	# consistent XFS after test.
> diff --git a/tests/overlay/019 b/tests/overlay/019
> index ae026604d..b20b7ae52 100755
> --- a/tests/overlay/019
> +++ b/tests/overlay/019
> @@ -9,6 +9,22 @@
>  . ./common/preamble
>  _begin_fstest auto stress
>  
> +# This nests multiple background fsstress instances, so we have to
> +# do some magic with _FSSTRESS_PID here.
> +_cleanup()
> +{
> +	if [ -n "$fsstress_pid_1" ]; then
> +		 FSTRESS_PID=$fsstress_pid_1
> +		_kill_fsstress
> +	fi
> +	if [ -n "$fsstress_pid_2" ]; then
> +		 FSTRESS_PID=$fsstress_pid_2
> +		_kill_fsstress
> +	fi
> +	cd /
> +	rm -f tmp.*
> +}
> +
>  # Import common functions.
>  . ./common/filter
>  
> @@ -28,29 +44,31 @@ d_low=$lowerdir/fsstress
>  d_top=$SCRATCH_MNT/fsstress
>  mkdir -p $d_low $d_top
>  
> -echo $FSSTRESS_PROG -s 42 -d $d_low -p 4 -n 1000 -l100 -v > $seqres.full.1
> -$FSSTRESS_PROG -s 42 -d $d_low -p 4 -n 1000 -l100 -v >> $seqres.full.1 2>&1 &
> +echo fsstress -s 42 -d $d_low -p 4 -n 1000 -l100 -v >> $seqres.full
> +_run_fsstress_bg -s 42 -d $d_low -p 4 -n 1000 -l100 -v
> +fsstress_pid_1=$_FSSTRESS_PID
>  
> -echo $FSSTRESS_PROG -s 42 -d $d_top -p 4 -n 1000 -l100 -v > $seqres.full.2
> -$FSSTRESS_PROG -s 42 -d $d_top -p 4 -n 1000 -l100 -v >> $seqres.full.2 2>&1 &
> +echo fsstress -s 42 -d $d_top -p 4 -n 1000 -l100 -v >> $seqres.full
> +_run_fsstress_bg -s 42 -d $d_top -p 4 -n 1000 -l100 -v
> +fsstress_pid_2=$_FSTRESS_PID
> +unset _FSSTRESS_PID
>  
>  ret=0
> -if ! wait %1; then
> -	echo "--------------------------------------"       >>$seqres.full.1
> -	echo "fsstress on lower directory returned $? - see $seqres.full.1"
> -	echo "--------------------------------------"       >>$seqres.full.1
> +if ! wait $fsstress_pid_1; then
> +	echo "--------------------------------------"       >>$seqres.full
> +	echo "fsstress on lower directory returned $? - see $seqres.full"
> +	echo "--------------------------------------"       >>$seqres.full
>  	ret=1
>  fi
> +unset fsstress_pid_1
>  
> -if ! wait %2; then
> -	echo "--------------------------------------"       >>$seqres.full.2
> -	echo "fsstress on overlay directory returned $? - see $seqres.full.2"
> -	echo "--------------------------------------"       >>$seqres.full.2
> +if ! wait $fsstress_pid_2; then
> +	echo "--------------------------------------"       >>$seqres.full
> +	echo "fsstress on overlay directory returned $? - see $seqres.full"
> +	echo "--------------------------------------"       >>$seqres.full
>  	ret=1
>  fi
> -
> -cat $seqres.full.1 $seqres.full.2 > $seqres.full
> -rm $seqres.full.1 $seqres.full.2
> +unset fsstress_pid_2
>  
>  if [ "$ret" -eq 1 ]; then
>  	status=1
> diff --git a/tests/overlay/021 b/tests/overlay/021
> index 95a9ada5d..ee5a51007 100755
> --- a/tests/overlay/021
> +++ b/tests/overlay/021
> @@ -33,8 +33,8 @@ d_low=$lowerdir/$testdir
>  mkdir -p $d_low
>  
>  # Create 4K empty files in 4 directories
> -echo $FSSTRESS_PROG -d $d_low -p 4 -z -f creat=1 -n 1024 -v >> $seqres.full
> -$FSSTRESS_PROG -d $d_low -p 4 -z -f creat=1 -n 1024 -v >> $seqres.full 2>&1
> +echo fsstress -d $d_low -p 4 -z -f creat=1 -n 1024 -v >> $seqres.full
> +_run_fsstress -d $d_low -p 4 -z -f creat=1 -n 1024 -v
>  echo "--------------------------------------"       >> $seqres.full
>  echo "Created 1K files in lower directory.  "       >> $seqres.full
>  
> @@ -91,9 +91,9 @@ echo "Go team truncate!!                    "       >> $seqres.full
>  # Give team 'touch' a 1 second head start.
>  # Team 'truncate' players should catch up after few copy up bombs.
>  sleep 1
> -$FSSTRESS_PROG -d $d_top -p 4 -z -f creat=1 -n 1024 -v >> $seqres.full &
> +_run_fsstress -d $d_top -p 4 -z -f creat=1 -n 1024 -v
>  
> -wait %1 %2 %3 %4 %5
> +wait %1 %2 %3 %4
>  
>  echo "Silence is golden"
>  status=0
> diff --git a/tests/xfs/006 b/tests/xfs/006
> index 50b36947d..20fd104bc 100755
> --- a/tests/xfs/006
> +++ b/tests/xfs/006
> @@ -13,9 +13,10 @@ _begin_fstest auto quick mount eio
>  # Override the default cleanup function.
>  _cleanup()
>  {
> +	_kill_fsstress
> +	_dmerror_cleanup
>  	cd /
>  	rm -f $tmp.*
> -	_dmerror_cleanup
>  }
>  
>  # Import common functions.
> @@ -45,7 +46,7 @@ fi
>  # start a metadata-intensive workload, but no data allocation operation.
>  # Because uncompleted new space allocation I/Os may cause XFS to shutdown
>  # after loading error table.
> -$FSSTRESS_PROG -z -n 5000 -p 10 \
> +_run_fsstress -z -n 5000 -p 10 \
>  	       -f creat=10 \
>  	       -f resvsp=1 \
>  	       -f truncate=1 \
> @@ -57,7 +58,7 @@ $FSSTRESS_PROG -z -n 5000 -p 10 \
>  	       -f unlink=1 \
>  	       -f symlink=1 \
>  	       -f rename=1 \
> -	       -d $SCRATCH_MNT/fsstress >> $seqres.full 2>&1
> +	       -d $SCRATCH_MNT/fsstress
>  
>  # Loading error table without "--nolockfs" option. Because "--nolockfs"
>  # won't freeze fs, then some running I/Os may cause XFS to shutdown
> diff --git a/tests/xfs/011 b/tests/xfs/011
> index df967f098..ed69879c5 100755
> --- a/tests/xfs/011
> +++ b/tests/xfs/011
> @@ -26,8 +26,7 @@ _cleanup()
>  {
>  	# Make sure $SCRATCH_MNT is unfreezed
>  	xfs_freeze -u $SCRATCH_MNT 2>/dev/null
> -	$KILLALL_PROG -9 fsstress 2>/dev/null
> -	wait
> +	_kill_fsstress
>  	cd /
>  	rm -f $tmp.*
>  }
> @@ -102,8 +101,7 @@ _scratch_mount
>  
>  _check_scratch_log_state
>  
> -$FSSTRESS_PROG -d $SCRATCH_MNT/fsstress -n 9999999 -p 2 -S t \
> -	>> $seqres.full 2>&1 &
> +_run_fsstress_bg -d $SCRATCH_MNT/fsstress -n 9999999 -p 2 -S t
>  
>  iters=5
>  while [ $iters -gt 0 ]; do
> @@ -112,9 +110,7 @@ while [ $iters -gt 0 ]; do
>  	iters=$((iters - 1))
>  done
>  
> -$KILLALL_PROG $FSSTRESS_PROG
> -wait
> -
> +_kill_fsstress
>  _scratch_unmount
>  
>  status=0
> diff --git a/tests/xfs/013 b/tests/xfs/013
> index f4f406aa9..c68c6ad85 100755
> --- a/tests/xfs/013
> +++ b/tests/xfs/013
> @@ -16,16 +16,6 @@ _begin_fstest auto metadata stress
>  # Import common functions.
>  . ./common/filter
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	$KILLALL_PROG -9 fsstress 2>/dev/null
> -	wait
> -	cd /
> -	_scratch_unmount 2>/dev/null
> -	rm -f $tmp.*
> -}
> -
>  filter_enospc() {
>  	sed -e '/^.*No space left on device.*/d'
>  }
> @@ -103,8 +93,7 @@ _create $SCRATCH_MNT/dir1 $COUNT
>  _cleaner $SCRATCH_MNT $LOOPS $MINDIRS &
>  
>  # start a background stress workload on the fs
> -$FSSTRESS_PROG -d $SCRATCH_MNT/fsstress -n 9999999 -p 2 -S t \
> -	>> $seqres.full 2>&1 &
> +_run_fsstress_bg -d $SCRATCH_MNT/fsstress -n 9999999 -p 2 -S t
>  
>  # Each cycle clones the current directory and makes a random file replacement
>  # pass on the new directory. The directory is copied to the next using hard
> @@ -127,8 +116,7 @@ do
>  	_rand_replace $SCRATCH_MNT/dir$((i+1)) $COUNT
>  done
>  
> -$KILLALL_PROG fsstress
> -wait
> +_kill_fsstress
>  
>  # clean out the competing fsstress allocations, then everything else
>  rm -rf $SCRATCH_MNT/fsstress
> diff --git a/tests/xfs/017 b/tests/xfs/017
> index c40d9cf09..263ecc753 100755
> --- a/tests/xfs/017
> +++ b/tests/xfs/017
> @@ -9,15 +9,6 @@
>  . ./common/preamble
>  _begin_fstest mount auto quick stress
>  
> -_register_cleanup "_cleanup; rm -f $tmp.*"
> -
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -    echo "*** unmount"
> -    _scratch_unmount 2>/dev/null
> -}
> -
>  # Import common functions.
>  . ./common/filter
>  
> @@ -41,8 +32,8 @@ echo "*** test"
>  for l in 0 1 2 3 4
>  do
>          echo "    *** test $l"
> -	FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -n 1000 $FSSTRESS_AVOID`
> -        $FSSTRESS_PROG  $FSSTRESS_ARGS >>$seqres.full
> +	FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -n 1000`
> +        _run_fsstress $FSSTRESS_ARGS
>  
>          _try_scratch_mount -o remount,ro \
>              || _fail "remount ro failed"
> diff --git a/tests/xfs/017.out b/tests/xfs/017.out
> index 2d11c9492..e61793df1 100644
> --- a/tests/xfs/017.out
> +++ b/tests/xfs/017.out
> @@ -7,4 +7,3 @@ QA output created by 017
>      *** test 3
>      *** test 4
>  *** done
> -*** unmount
> diff --git a/tests/xfs/032 b/tests/xfs/032
> index 75edf0e9c..1ecc02fe0 100755
> --- a/tests/xfs/032
> +++ b/tests/xfs/032
> @@ -50,7 +50,7 @@ while [ $SECTORSIZE -le $PAGESIZE ]; do
>  		fi
>  		_scratch_mount
>  		# light population of the fs
> -		$FSSTRESS_PROG -n 100 -d $SCRATCH_MNT >> $seqres.full 2>&1
> +		_run_fsstress -n 100 -d $SCRATCH_MNT
>  		_scratch_unmount
>  
>  		# Test "duplicate" copy at first, if $XFS_COPY_PROG won't do it.
> diff --git a/tests/xfs/049 b/tests/xfs/049
> index 668ac3745..4163a144f 100755
> --- a/tests/xfs/049
> +++ b/tests/xfs/049
> @@ -68,7 +68,7 @@ mount -t xfs -o loop $SCRATCH_MNT/test.xfs $SCRATCH_MNT/test >> $seqres.full 2>&
>      || _fail "!!! failed to loop mount xfs"
>  
>  _log "stress"
> -$FSSTRESS_PROG -d $SCRATCH_MNT/test -n 1000 $FSSTRESS_AVOID >> $seqres.full 2>&1 \
> +_run_fsstress -d $SCRATCH_MNT/test -n 1000 \
>      || _fail "!!! stress failed"
>  
>  _log "clean"
> @@ -88,7 +88,7 @@ mount -t ext2 -o loop $SCRATCH_MNT/test/test.ext2 $SCRATCH_MNT/test2 >> $seqres.
>      || _fail "!!! failed to loop mount xfs"
>  
>  _log "stress ext2 on xfs via loop"
> -$FSSTRESS_PROG -d $SCRATCH_MNT/test2 -n 1000 $FSSTRESS_AVOID >> $seqres.full 2>&1 \
> +_run_fsstress -d $SCRATCH_MNT/test2 -n 1000 \
>      || _fail "!!! stress ext2 failed"
>  
>  _log "clean"
> diff --git a/tests/xfs/051 b/tests/xfs/051
> index 43fee4c45..bb9c36da8 100755
> --- a/tests/xfs/051
> +++ b/tests/xfs/051
> @@ -11,15 +11,6 @@
>  . ./common/preamble
>  _begin_fstest shutdown auto log metadata
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	cd /
> -	rm -f $tmp.*
> -	$KILLALL_PROG -9 $FSSTRESS_PROG > /dev/null 2>&1
> -	_scratch_unmount > /dev/null 2>&1
> -}
> -
>  # Import common functions.
>  . ./common/dmflakey
>  
> @@ -37,11 +28,10 @@ _scratch_mount
>  
>  # Start a workload and shutdown the fs. The subsequent mount will require log
>  # recovery.
> -$FSSTRESS_PROG -n 9999 -p 2 -w -d $SCRATCH_MNT &>> $seqres.full &
> +_run_fsstress_bg -n 9999 -p 2 -w -d $SCRATCH_MNT
>  sleep 5
>  _scratch_shutdown -f
> -$KILLALL_PROG -q $FSSTRESS_PROG
> -wait
> +_kill_fsstress
>  _scratch_unmount
>  
>  # Initialize a dm-flakey device that will pass I/Os for 5s and fail thereafter.
> diff --git a/tests/xfs/057 b/tests/xfs/057
> index f1c947795..62eb8b93c 100755
> --- a/tests/xfs/057
> +++ b/tests/xfs/057
> @@ -26,12 +26,12 @@ _begin_fstest auto log recoveryloop
>  # Override the default cleanup function.
>  _cleanup()
>  {
> -	cd /
> -	rm -f $tmp.*
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
>  	[ -e /sys/fs/xfs/$sdev/errortag/log_item_pin ] &&
>  		echo 0 > /sys/fs/xfs/$sdev/errortag/log_item_pin
> +	_kill_fsstress
>  	wait > /dev/null 2>&1
> +	cd /
> +	rm -f $tmp.*
>  }
>  
>  # Import common functions.
> @@ -53,7 +53,7 @@ _scratch_mkfs_sized $((1024 * 1024 * 500)) >> $seqres.full 2>&1
>  _scratch_mount
>  
>  # populate the fs with some data and cycle the mount to reset the log head/tail
> -$FSSTRESS_PROG -d $SCRATCH_MNT -z -fcreat=1 -p 4 -n 100000 >> $seqres.full
> +_run_fsstress -d $SCRATCH_MNT -z -fcreat=1 -p 4 -n 100000
>  _scratch_cycle_mount || _fail "cycle mount failed"
>  
>  # Pin the tail and start a file removal workload. File removal tends to
> diff --git a/tests/xfs/077 b/tests/xfs/077
> index 4a4ac4702..3d8ecd9f6 100755
> --- a/tests/xfs/077
> +++ b/tests/xfs/077
> @@ -54,7 +54,7 @@ ORIG_UUID=`_scratch_xfs_db -c "uuid" | awk '{print $NF}'`
>  
>  _scratch_mount
>  # Put some stuff on the fs
> -$FSSTRESS_PROG -d $SCRATCH_MNT -n 100 -p 4 >> $seqres.full 2>&1
> +_run_fsstress -d $SCRATCH_MNT -n 100 -p 4
>  _scratch_unmount
>  
>  # Can xfs_db change it?
> diff --git a/tests/xfs/079 b/tests/xfs/079
> index 46a15ed78..794d2db49 100755
> --- a/tests/xfs/079
> +++ b/tests/xfs/079
> @@ -17,19 +17,9 @@
>  . ./common/preamble
>  _begin_fstest shutdown auto log quick
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	cd /
> -	rm -f $tmp.*
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -	wait > /dev/null 2>&1
> -}
> -
>  # Import common functions.
>  . ./common/log
>  
> -
>  # Modify as appropriate.
>  _require_scratch
>  _require_v2log
> @@ -43,10 +33,10 @@ _scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
>  _scratch_mount "-o logbsize=32k"
>  
>  # Run a workload to dirty the log, wait a bit and shutdown the fs.
> -$FSSTRESS_PROG -d $SCRATCH_MNT -p 4 -n 99999999 >> $seqres.full 2>&1 &
> +_run_fsstress_bg -d $SCRATCH_MNT -p 4 -n 99999999
>  sleep 10
>  _scratch_shutdown -f
> -wait
> +_wait_for_fsstress
>  
>  # Remount with a different log buffer size. Going from 32k to 64k increases the
>  # log record extended header count, as the log record header can only handle 32k
> diff --git a/tests/xfs/104 b/tests/xfs/104
> index 7f11f89a5..cd625d6b7 100755
> --- a/tests/xfs/104
> +++ b/tests/xfs/104
> @@ -40,9 +40,8 @@ _stress_scratch()
>  	procs=3
>  	nops=1000
>  	# -w ensures that the only ops are ones which cause write I/O
> -	FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -w -p $procs \
> -	    -n $nops $FSSTRESS_AVOID`
> -	$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 &
> +	args=`_scale_fsstress_args -d $SCRATCH_MNT -w -p $procs -n $nops`
> +	_run_fsstress_bg $args
>  }
>  
>  _require_scratch
> @@ -73,14 +72,11 @@ for i in `seq 125 -1 90`; do
>  	break
>  done
>  
> -#
>  # Grow the filesystem while actively stressing it...
> -# Kick off more stress threads on each iteration, grow; repeat.
> -#
>  while [ $size -le $endsize ]; do
>  	echo "*** stressing filesystem"
>  	echo "*** stressing a ${sizeb} block filesystem" >> $seqres.full
> -	_stress_scratch
> +	_stress_scratch 
>  	sleep 1
>  	size=`expr $size + $incsize`
>  	sizeb=`expr $size / $dbsize`	# in data blocks
> @@ -92,10 +88,8 @@ while [ $size -le $endsize ]; do
>  	[ `expr $size % $modsize` -eq 0 ] && wait	# every 4th iteration
>  	echo AGCOUNT=$agcount | tee -a $seqres.full
>  	echo && echo >> $seqres.full
> +	_wait_for_fsstress
>  done
> -wait	# stop for any remaining stress processes
> -
> -_scratch_unmount
>  
>  status=0
>  exit
> diff --git a/tests/xfs/137 b/tests/xfs/137
> index dfc653573..d97942bf6 100755
> --- a/tests/xfs/137
> +++ b/tests/xfs/137
> @@ -29,7 +29,7 @@ _scratch_xfs_db -x -c "logformat -c 3" >> $seqres.full 2>&1
>  
>  # do some work on the fs to update metadata LSNs
>  _scratch_mount
> -$FSSTRESS_PROG -d $SCRATCH_MNT -n 999 -p 4 -w >> $seqres.full 2>&1
> +_run_fsstress -d $SCRATCH_MNT -n 999 -p 4 -w
>  _scratch_unmount
>  
>  # Reformat to the current cycle and try to mount. This fails in most cases
> diff --git a/tests/xfs/141 b/tests/xfs/141
> index 5e9067e24..b630ba10d 100755
> --- a/tests/xfs/141
> +++ b/tests/xfs/141
> @@ -14,19 +14,9 @@
>  . ./common/preamble
>  _begin_fstest auto log metadata
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	cd /
> -	rm -f $tmp.*
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -	wait > /dev/null 2>&1
> -}
> -
>  # Import common functions.
>  . ./common/inject
>  
> -
>  # Modify as appropriate.
>  _require_xfs_io_error_injection "log_bad_crc"
>  _require_scratch
> @@ -49,7 +39,7 @@ while [ $nr_times -gt 0 ]; do
>  
>  	# Run fsstress until the filesystem shuts down. It will shut down
>  	# automatically when error injection triggers.
> -	$FSSTRESS_PROG -d $SCRATCH_MNT -p 4 -n 999999 >> $seqres.full 2>&1
> +	_run_fsstress -d $SCRATCH_MNT -p 4 -n 999999
>  
>  	# Verify that we can remount the fs. Log recovery should handle the torn
>  	# write.
> diff --git a/tests/xfs/158 b/tests/xfs/158
> index 3c4e60f0e..89bf8c851 100755
> --- a/tests/xfs/158
> +++ b/tests/xfs/158
> @@ -31,7 +31,7 @@ _scratch_mkfs -m crc=1,inobtcount=0 >> $seqres.full
>  _scratch_mount
>  
>  mkdir $SCRATCH_MNT/stress
> -$FSSTRESS_PROG -d $SCRATCH_MNT/stress -n 1000 >> $seqres.full
> +_run_fsstress -d $SCRATCH_MNT/stress -n 1000
>  echo moo > $SCRATCH_MNT/urk
>  
>  _scratch_unmount
> @@ -56,7 +56,7 @@ _check_scratch_xfs_features NEEDSREPAIR INOBTCNT
>  
>  echo "Filesystem should be usable again"
>  _scratch_mount
> -$FSSTRESS_PROG -d $SCRATCH_MNT/stress -n 1000 >> $seqres.full
> +_run_fsstress -d $SCRATCH_MNT/stress -n 1000
>  _scratch_unmount
>  _check_scratch_fs
>  _check_scratch_xfs_features INOBTCNT
> diff --git a/tests/xfs/167 b/tests/xfs/167
> index f9da261db..5ef2aa2ea 100755
> --- a/tests/xfs/167
> +++ b/tests/xfs/167
> @@ -9,20 +9,12 @@
>  . ./common/preamble
>  _begin_fstest rw metadata auto stress prealloc
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	$KILLALL_PROG -r -q -TERM fsstress 2> /dev/null
> -	wait	# ensures all fsstress processes died
> -}
> -
>  workout()
>  {
>  	procs=100
>  	nops=15000
> -	FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -p $procs -n $nops \
> -	    $FSSTRESS_AVOID`
> -	$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full &
> +	FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -p $procs -n $nops`
> +	_run_fsstress_bg $FSSTRESS_ARGS
>  	sleep 2
>  }
>  
> @@ -52,6 +44,8 @@ rm -f $TEST_FILE
>  workout
>  $TEST_PROG $LOOPS $TEST_FILE
>  
> +_kill_fsstress
> +
>  echo "     *** test done"
>  
>  status=0
> diff --git a/tests/xfs/168 b/tests/xfs/168
> index f187a336f..098e0c86a 100755
> --- a/tests/xfs/168
> +++ b/tests/xfs/168
> @@ -38,9 +38,8 @@ stress_scratch()
>  	local procs=3
>  	local nops=1000
>  	# -w ensures that the only ops are ones which cause write I/O
> -	local FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -w \
> -		-p $procs -n $nops $FSSTRESS_AVOID`
> -	$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1
> +	local args=`_scale_fsstress_args -d $SCRATCH_MNT -w -p $procs -n $nops`
> +	_run_fsstress_bg $args
>  }
>  
>  _require_scratch_xfs_shrink
> @@ -73,7 +72,7 @@ while [ $totalcount -gt 0 ]; do
>  	decsize=`expr  41 \* 1048576 + 1 + $RANDOM \* $RANDOM % 1048576`
>  
>  	while [ $size -gt $endsize ]; do
> -		stress_scratch &
> +		stress_scratch
>  		sleep 1
>  
>  		decb=`expr $decsize / $dbsize`    # in data blocks
> @@ -95,6 +94,7 @@ while [ $totalcount -gt 0 ]; do
>  		. $tmp.growfs
>  
>  		size=`expr $dblocks \* $dbsize`
> +		_kill_fsstress
>  		_scratch_unmount
>  		_scratch_xfs_repair -n >> $seqres.full 2>&1 || \
>  			_fail "xfs_repair failed with shrinking $sizeb"
> diff --git a/tests/xfs/264 b/tests/xfs/264
> index 109fecd1c..a6e816d3c 100755
> --- a/tests/xfs/264
> +++ b/tests/xfs/264
> @@ -55,7 +55,7 @@ do_test()
>  	# start a metadata-intensive workload, but no data allocation operation.
>  	# Because uncompleted new space allocation I/Os may cause XFS to shutdown
>  	# after loading error table.
> -	$FSSTRESS_PROG -z -n 5000 -p 10 \
> +	_run_fsstress -z -n 5000 -p 10 \
>  		       -f creat=10 \
>  		       -f resvsp=1 \
>  		       -f truncate=1 \
> @@ -67,7 +67,7 @@ do_test()
>  		       -f unlink=1 \
>  		       -f symlink=1 \
>  		       -f rename=1 \
> -		       -d $SCRATCH_MNT/fsstress >> $seqres.full 2>&1
> +		       -d $SCRATCH_MNT/fsstress
>  
>  	# Loading error table without "--nolockfs" option. Because "--nolockfs"
>  	# won't freeze fs, then some running I/Os may cause XFS to shutdown
> diff --git a/tests/xfs/270 b/tests/xfs/270
> index 3744df5a9..d3bce386a 100755
> --- a/tests/xfs/270
> +++ b/tests/xfs/270
> @@ -80,7 +80,7 @@ if [ $? -ne 0 ]; then
>  else
>  	# no hang/panic is fine
>  	cat $SCRATCH_MNT/testfile > /dev/null
> -	$FSSTRESS_PROG -d $SCRATCH_MNT -p 4 -n 400 >>$seqres.full 2>&1
> +	_run_fsstress -d $SCRATCH_MNT -p 4 -n 400
>  fi
>  
>  # remount as rw, kernel should reject it
> diff --git a/tests/xfs/297 b/tests/xfs/297
> index 2c5b03c5c..66c5d0cc7 100755
> --- a/tests/xfs/297
> +++ b/tests/xfs/297
> @@ -16,8 +16,7 @@ _cleanup()
>  {
>  	# Make sure $SCRATCH_MNT is unfreezed
>  	xfs_freeze -u $SCRATCH_MNT 2>/dev/null
> -	$KILLALL_PROG -q -9 $FSSTRESS_PROG
> -	wait
> +	_kill_fsstress
>  	cd /
>  	rm -f $tmp.*
>  }
> @@ -37,7 +36,7 @@ _scratch_mount
>  STRESS_DIR="$SCRATCH_MNT/testdir"
>  mkdir -p $STRESS_DIR
>  
> -$FSSTRESS_PROG -d $STRESS_DIR -n 100 -p 1000 $FSSTRESS_AVOID >>$seqres.full &
> +_run_fsstress_bg -d $STRESS_DIR -n 1000 -p 1000 $FSSTRESS_AVOID
>  
>  # Freeze/unfreeze file system randomly
>  echo "Start freeze/unfreeze randomly" | tee -a $seqres.full
> @@ -60,8 +59,7 @@ while [ $LOOP -gt 0 ];do
>  	let LOOP=$LOOP-1
>  done
>  echo "Test done" | tee -a $seqres.full
> -$KILLALL_PROG -q $FSSTRESS_PROG
> -wait
> +_kill_fsstress
>  
>  status=0
>  exit
> diff --git a/tests/xfs/305 b/tests/xfs/305
> index 0ad3ef7fb..6371ed8a6 100755
> --- a/tests/xfs/305
> +++ b/tests/xfs/305
> @@ -4,7 +4,7 @@
>  #
>  # FS QA Test No. 305
>  #
> -# Test to verify that turn group/project quotas off while fstress and
> +# Test to verify that turn group/project quotas off while fsstress and
>  # user quotas are left on.
>  #
>  . ./common/preamble
> @@ -18,7 +18,6 @@ _begin_fstest auto quota
>  
>  _require_scratch
>  _require_xfs_quota
> -_require_command "$KILLALL_PROG" killall
>  
>  _scratch_mkfs_xfs -m crc=1 >/dev/null 2>&1
>  
> @@ -33,12 +32,11 @@ _exercise()
>  	_qmount
>  	mkdir -p $QUOTA_DIR
>  
> -	$FSSTRESS_PROG -d $QUOTA_DIR -n 1000000 -p 100 $FSSTRESS_AVOID >>$seqres.full &
> +	_run_fsstress_bg -d $QUOTA_DIR -n 1000000 -p 100
>  	sleep 10
>  	$XFS_QUOTA_PROG -x -c "disable -$type" $SCRATCH_DEV
>  	sleep 5
> -	$KILLALL_PROG -q $FSSTRESS_PROG
> -	wait
> +	_kill_fsstress
>  }
>  
>  echo "*** turn off group quotas"
> diff --git a/tests/xfs/442 b/tests/xfs/442
> index 77d08fda5..5cbd8dd19 100755
> --- a/tests/xfs/442
> +++ b/tests/xfs/442
> @@ -12,14 +12,6 @@
>  . ./common/preamble
>  _begin_fstest auto stress clone quota
>  
> -# Override the default cleanup function.
> -_cleanup()
> -{
> -	cd /
> -	rm -f $tmp.*
> -	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -}
> -
>  # Import common functions.
>  . ./common/quota
>  . ./common/filter
> @@ -72,7 +64,7 @@ _scratch_mount >> $seqres.full 2>&1
>  
>  nr_cpus=$((LOAD_FACTOR * 4))
>  nr_ops=$((25000 * nr_cpus * TIME_FACTOR))
> -$FSSTRESS_PROG $FSSTRESS_AVOID -w -d $SCRATCH_MNT -n $nr_ops -p $nr_cpus >> $seqres.full
> +_run_fsstress -w -d $SCRATCH_MNT -n $nr_ops -p $nr_cpus
>  
>  echo "Check quota before remount"
>  check_quota_du_blocks
> diff --git a/tests/xfs/538 b/tests/xfs/538
> index 57113d341..f858cadc3 100755
> --- a/tests/xfs/538
> +++ b/tests/xfs/538
> @@ -46,7 +46,7 @@ echo "Inject bmap_alloc_minlen_extent error tag"
>  _scratch_inject_error bmap_alloc_minlen_extent 1
>  
>  echo "Execute fsstress"
> -$FSSTRESS_PROG -d $SCRATCH_MNT \
> +_run_fsstress -d $SCRATCH_MNT \
>  		$(_scale_fsstress_args -p 75 -n 1000) \
>  		-f bulkstat=0 \
>  		-f bulkstat1=0 \
> @@ -61,7 +61,7 @@ $FSSTRESS_PROG -d $SCRATCH_MNT \
>  		-f readv=0 \
>  		-f stat=0 \
>  		-f aread=0 \
> -		-f dread=0 >> $seqres.full
> +		-f dread=0
>  
>  # success, all done
>  status=0
> diff --git a/tests/xfs/609 b/tests/xfs/609
> index c23b6893d..88dc3c683 100755
> --- a/tests/xfs/609
> +++ b/tests/xfs/609
> @@ -18,21 +18,12 @@ _stress_scratch()
>  	nops=999999
>  	# -w ensures that the only ops are ones which cause write I/O
>  	FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -w -p $procs \
> -	    -n $nops $FSSTRESS_AVOID`
> -	$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 &
> +	    -n $nops`
> +	_run_fsstress_bg $FSSTRESS_ARGS >> $seqres.full 2>&1
>  }
>  
>  _require_scratch
>  _require_command "$XFS_GROWFS_PROG" xfs_growfs
> -_require_command "$KILLALL_PROG" killall
> -
> -_cleanup()
> -{
> -	$KILLALL_ALL fsstress > /dev/null 2>&1
> -	wait
> -	cd /
> -	rm -f $tmp.*
> -}
>  
>  _scratch_mkfs_xfs | _filter_mkfs >$seqres.full 2>$tmp.mkfs
>  . $tmp.mkfs	# extract blocksize and data size for scratch device
> @@ -63,12 +54,7 @@ while [ $size -le $endsize ]; do
>  
>  	sleep $((RANDOM % 3))
>  	_scratch_shutdown
> -	ps -e | grep fsstress > /dev/null 2>&1
> -	while [ $? -eq 0 ]; do
> -		$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -		wait > /dev/null 2>&1
> -		ps -e | grep fsstress > /dev/null 2>&1
> -	done
> +	_kill_fsstress
>  	_scratch_cycle_mount
>  done > /dev/null 2>&1
>  wait	# stop for any remaining stress processes
> diff --git a/tests/xfs/610 b/tests/xfs/610
> index 23fbd8585..8610b912c 100755
> --- a/tests/xfs/610
> +++ b/tests/xfs/610
> @@ -18,22 +18,13 @@ _stress_scratch()
>  	nops=999999
>  	# -w ensures that the only ops are ones which cause write I/O
>  	FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -w -p $procs \
> -	    -n $nops $FSSTRESS_AVOID`
> -	$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 &
> +	    -n $nops`
> +	_run_fsstress_bg $FSSTRESS_ARGS >> $seqres.full 2>&1
>  }
>  
>  _require_scratch
>  _require_realtime
>  _require_command "$XFS_GROWFS_PROG" xfs_growfs
> -_require_command "$KILLALL_PROG" killall
> -
> -_cleanup()
> -{
> -	$KILLALL_ALL fsstress > /dev/null 2>&1
> -	wait
> -	cd /
> -	rm -f $tmp.*
> -}
>  
>  _scratch_mkfs_xfs | _filter_mkfs >$seqres.full 2>$tmp.mkfs
>  . $tmp.mkfs	# extract blocksize and data size for scratch device
> @@ -65,12 +56,7 @@ while [ $size -le $endsize ]; do
>  
>  	sleep $((RANDOM % 3))
>  	_scratch_shutdown
> -	ps -e | grep fsstress > /dev/null 2>&1
> -	while [ $? -eq 0 ]; do
> -		$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> -		wait > /dev/null 2>&1
> -		ps -e | grep fsstress > /dev/null 2>&1
> -	done
> +	_kill_fsstress
>  	_scratch_cycle_mount
>  done > /dev/null 2>&1
>  wait	# stop for any remaining stress processes
> -- 
> 2.45.2
> 
> 





[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux