mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
b727d8af32
Often this test can fail on unmount because a 'btrfs subvolume snapshot'
command is still running and using the scratch the mount point:
btrfs/036 168s ... umount: /home/fdmanana/btrfs-tests/scratch_1: target is busy
(In some cases useful info about processes that
use the device is found by lsof(8) or fuser(1).)
_check_btrfs_filesystem: filesystem on /dev/sdc is inconsistent
(see /home/fdmanana/git/hub/xfstests/results//btrfs/036.full for details)
This happens because when we kill the process running the do_snapshots()
function we only kill the subshell and don't wait for any processes it
has spawned to finish before the subshell exits. Fix this by setting a
trap in the do_snapshots() function, so that when the subshell receives
a SIGTERM signal it waits for any running 'btrfs subvolume snapshot'
to finish before exitting. We were also not waiting for the subshell
to exit after sending it the SIGTERM signal, so fix that as well by
calling the 'wait' command after calling 'kill' to send that signal.
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
77 lines
1.6 KiB
Bash
Executable File
77 lines
1.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (c) 2014 Fujitsu. All Rights Reserved.
|
|
#
|
|
# FS QA Test No. btrfs/036
|
|
#
|
|
# Regression test for running snapshots and send concurrently.
|
|
#
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
tmp=/tmp/$$
|
|
status=1 # failure is the default!
|
|
snapshots_pid=0
|
|
|
|
_cleanup()
|
|
{
|
|
# kill backgroud snapshots
|
|
if [ $snapshots_pid -ne 0 ] && ps -p $snapshots_pid | grep -q $snapshots_pid; then
|
|
kill -TERM $snapshots_pid 2> /dev/null
|
|
wait $snapshots_pid
|
|
fi
|
|
rm -f $tmp.*
|
|
}
|
|
|
|
do_snapshots()
|
|
{
|
|
# Wait for any running 'btrfs subvolume snapshot' subcommand before
|
|
# exitting so that after the test kills the subshell running this
|
|
# function, it does not fail with EBUSY when unmounting the scratch
|
|
# device.
|
|
trap "wait; exit" SIGTERM
|
|
|
|
i=2
|
|
while [ 1 ]
|
|
do
|
|
$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT/snap_1 \
|
|
$SCRATCH_MNT/snap_$i >> $seqres.full 2>&1
|
|
let i=$i+1
|
|
sleep 1
|
|
done
|
|
}
|
|
|
|
trap "_cleanup ; exit \$status" 0 1 2 3 15
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/filter
|
|
|
|
# real QA test starts here
|
|
_supported_fs btrfs
|
|
_supported_os Linux
|
|
_require_scratch
|
|
|
|
_scratch_mkfs > /dev/null 2>&1
|
|
_scratch_mount
|
|
|
|
touch $SCRATCH_MNT/foo
|
|
|
|
# get file with fragments by using backwards writes.
|
|
for i in `seq 10240 -1 1`; do
|
|
$XFS_IO_PROG -f -d -c "pwrite $(($i * 4096)) 4096" \
|
|
$SCRATCH_MNT/foo > /dev/null | _filter_xfs_io
|
|
done
|
|
|
|
$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT \
|
|
$SCRATCH_MNT/snap_1 >> $seqres.full 2>&1
|
|
|
|
do_snapshots &
|
|
snapshots_pid=$!
|
|
|
|
$BTRFS_UTIL_PROG send -f /dev/null $SCRATCH_MNT/snap_1 2>&1 | _filter_scratch
|
|
|
|
status=0 ; exit
|