Files
apfstests/tests/xfs/049
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

139 lines
3.8 KiB
Bash
Executable File

#! /bin/bash
# FS QA Test No. 049
#
# XFS on loop test
#
#-----------------------------------------------------------------------
# Copyright (c) 2000-2002 Silicon Graphics, 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"
_cleanup()
{
cd /
umount $SCRATCH_MNT/test2 > /dev/null 2>&1
umount $SCRATCH_MNT/test > /dev/null 2>&1
rm -f $tmp.*
if [ -w $seqres.full ]
then
echo "--- mounts at end (after cleanup)" >> $seqres.full
mount >> $seqres.full
fi
}
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
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 xfs
_supported_os Linux
_log()
{
echo "--- $*"
echo "--- $*" >> $seqres.full
}
_require_nonexternal
_require_scratch_nocheck
_require_no_large_scratch_dev
_require_loop
_require_ext2
rm -f $seqres.full
echo "(dev=$SCRATCH_DEV, mount=$SCRATCH_MNT)" >> $seqres.full
echo "" >> $seqres.full
echo "--- mounts" >> $seqres.full
mount >> $seqres.full
_log "Create ext2 fs on scratch"
mkfs -t ext2 -F $SCRATCH_DEV >> $seqres.full 2>&1 \
|| _fail "!!! failed to mkfs ext2"
_log "Mount ext2 fs on scratch"
mount -t ext2 $SCRATCH_DEV $SCRATCH_MNT >> $seqres.full 2>&1 \
|| _fail "!!! failed to mount"
_log "Create xfs fs in file on scratch"
${MKFS_XFS_PROG} -f -dfile,name=$SCRATCH_MNT/test.xfs,size=40m \
>> $seqres.full 2>&1 \
|| _fail "!!! failed to mkfs xfs"
_log "Make mount points"
mkdir $SCRATCH_MNT/test $SCRATCH_MNT/test2 >> $seqres.full 2>&1 \
|| _fail "!!! failed to make mount points"
_log "Mount xfs via loop"
mount -t xfs -o loop $SCRATCH_MNT/test.xfs $SCRATCH_MNT/test >> $seqres.full 2>&1 \
|| _fail "!!! failed to loop mount xfs"
_log "stress"
$FSSTRESS_PROG -d $SCRATCH_MNT/test -n 1000 $FSSTRESS_AVOID >> $seqres.full 2>&1 \
|| _fail "!!! stress failed"
_log "clean"
rm -rf $SCRATCH_MNT/test/* >> $seqres.full 2>&1 \
|| _fail "!!! clean failed"
_log "create file for ext2 fs"
dd if=/dev/zero of=$SCRATCH_MNT/test/test.ext2 bs=1024 count=10240 >> $seqres.full 2>&1 \
|| _fail "!!! create file failed"
_log "Create ext2 fs in file on looped xfs"
echo y | mkfs -t ext2 $SCRATCH_MNT/test/test.ext2 >> $seqres.full 2>&1 \
|| _fail "!!! failed to mkfs ext2 on xfs"
_log "Mount ext2 on xfs via loop"
mount -t ext2 -o loop $SCRATCH_MNT/test/test.ext2 $SCRATCH_MNT/test2 >> $seqres.full 2>&1 \
|| _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 \
|| _fail "!!! stress ext2 failed"
_log "clean"
rm -rf $SCRATCH_MNT/test/* >> $seqres.full 2>&1 \
|| _fail "!!! clean failed"
_log "umount ext2 on xfs"
umount $SCRATCH_MNT/test2 >> $seqres.full 2>&1 \
|| _fail "!!! umount ext2 failed"
_log "umount xfs"
umount $SCRATCH_MNT/test >> $seqres.full 2>&1 \
|| _fail "!!! umount xfs failed"
echo "--- mounts at end (before cleanup)" >> $seqres.full
mount >> $seqres.full
# success, all done
status=0
exit