Files
apfstests/tests/xfs/250
T
Dave Chinner ee6ad7f578 xfs/049: umount -d fails when kernel wins teardown race
When /etc/mtab is linked to /proc/mounts and we are using mount time
created loop devices (i.e. mount -o loop), the unmount can fail
with this amazingly informative error message:

umount: /mnt/scratch/test2: filesystem was unmounted, but mount(8) failed: Invalid argument

What it actually means in this case is that the kernel tore down the
loop device when the last reference went away, and it did it so fast
that mount was not able to find it in /etc/mtab after the unmount
syscall. Hence it could not find the loop device it was supposed to
tear down and has a hissy fit.

This is simple to fix: mount does not need to tear down the loop
device as the kernel does it automatically. Remove the "-d" from
the umount command, and the test passes again.

There's quite a few other tests that also use umount -d - fix them
as well.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
2015-03-18 14:54:44 +11:00

97 lines
2.2 KiB
Bash
Executable File

#! /bin/bash
# FS QA Test No. 250
#
# Bmap btree corruption regression test
#
#-----------------------------------------------------------------------
# Copyright (c) 2011 Red Hat, Inc. All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#-----------------------------------------------------------------------
#
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
cd /
umount $LOOP_MNT 2>/dev/null
rm -f $LOOP_DEV
rmdir $LOOP_MNT
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
# real QA test starts here
_supported_fs xfs
_supported_os Linux
_require_test
_require_loop
LOOP_DEV=$TEST_DIR/$seq.fs
LOOP_MNT=$TEST_DIR/$seq.mnt
_filter_io()
{
sed -e '/.* ops; /d'
}
# real QA test starts here
echo "*** create loop mount point"
rmdir $LOOP_MNT 2>/dev/null
mkdir -p $LOOP_MNT || _fail "cannot create loopback mount point"
_test_loop()
{
size=$1
agsize=$2
fsize=$3
dparam="file,name=$LOOP_DEV,size=$size"
if [ -n "$agsize" ]; then
dparam="$dparam,agsize=$agsize"
fi
echo "*** mkfs loop file (size=$size)"
$MKFS_XFS_PROG -d $dparam \
| _filter_mkfs 2>/dev/null
echo "*** mount loop filesystem"
mount -t xfs -o loop $LOOP_DEV $LOOP_MNT
echo "*** preallocate large file"
xfs_io -f -c "resvsp 0 $fsize" $LOOP_MNT/foo | _filter_io
echo "*** unmount loop filesystem"
umount $LOOP_MNT > /dev/null 2>&1
echo "*** check loop filesystem"
_check_xfs_filesystem $LOOP_DEV none none
}
_test_loop 50g 16m 40G
echo "*** done"
status=0
exit