]> git.apps.os.sepia.ceph.com Git - xfstests-dev.git/commitdiff
xfs/049: umount -d fails when kernel wins teardown race
authorDave Chinner <dchinner@redhat.com>
Wed, 18 Mar 2015 03:54:44 +0000 (14:54 +1100)
committerDave Chinner <david@fromorbit.com>
Wed, 18 Mar 2015 03:54:44 +0000 (14:54 +1100)
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>
tests/xfs/049
tests/xfs/073
tests/xfs/078
tests/xfs/216
tests/xfs/217
tests/xfs/250

index 04c2c7573dd14a678e2aaa5d46c37a38144c03d7..8d4e07479f56bfb7711ec521f35dc7e27bd07771 100755 (executable)
@@ -29,8 +29,8 @@ echo "QA output created by $seq"
 _cleanup()
 {
     cd /
-    umount -d $SCRATCH_MNT/test2 > /dev/null 2>&1
-    umount -d $SCRATCH_MNT/test > /dev/null 2>&1
+    umount $SCRATCH_MNT/test2 > /dev/null 2>&1
+    umount $SCRATCH_MNT/test > /dev/null 2>&1
     rm -f $tmp.*
 
     if [ -w $seqres.full ]
@@ -123,11 +123,11 @@ rm -rf $SCRATCH_MNT/test/* >> $seqres.full 2>&1 \
     || _fail "!!! clean failed"
 
 _log "umount ext2 on xfs"
-umount -d $SCRATCH_MNT/test2 >> $seqres.full 2>&1 \
+umount $SCRATCH_MNT/test2 >> $seqres.full 2>&1 \
     || _fail "!!! umount ext2 failed"
 
 _log "umount xfs"
-umount -d $SCRATCH_MNT/test >> $seqres.full 2>&1 \
+umount $SCRATCH_MNT/test >> $seqres.full 2>&1 \
     || _fail "!!! umount xfs failed"
 
 echo "--- mounts at end (before cleanup)" >> $seqres.full
index f9557719c92fc36aa639e8b7859696966f00894f..38ed2cb743f0fe722523e71a834af15bb7e8bfd7 100755 (executable)
@@ -41,9 +41,9 @@ _cleanup()
 {
        cd /
        umount $SCRATCH_MNT 2>/dev/null
-       umount -d $imgs.loop 2>/dev/null
+       umount $imgs.loop 2>/dev/null
        [ -d $imgs.loop ] && rmdir $imgs.loop
-       umount -d $imgs.source_dir 2>/dev/null
+       umount $imgs.source_dir 2>/dev/null
        [ -d $imgs.source_dir ] && rm -rf $imgs.source_dir
        rm -f $imgs.* $tmp.* /var/tmp/xfs_copy.log.*
 }
@@ -119,7 +119,7 @@ _verify_copy()
 
        echo unmounting and removing new image
        umount $source_dir
-       umount -d $target_dir > /dev/null 2>&1
+       umount $target_dir > /dev/null 2>&1
        rm -f $target
 }
 
index f859efcffc167f9b6c550cd814e2ed7d5149f99c..d8cb9196c21963426fec2e58213f5226fb7fad91 100755 (executable)
@@ -36,7 +36,7 @@ _cleanup()
 {
     cd /
     rm -f $tmp.*
-    umount -d $LOOP_MNT 2>/dev/null
+    umount $LOOP_MNT 2>/dev/null
     rmdir $LOOP_MNT
 }
 
@@ -97,7 +97,7 @@ _grow_loop()
        $XFS_GROWFS_PROG $LOOP_MNT 2>&1 |  _filter_growfs 2>&1
 
        echo "*** unmount"
-       umount -d $LOOP_MNT > /dev/null 2>&1
+       umount $LOOP_MNT > /dev/null 2>&1
 
        # Large grows takes forever to check..
        if [ "$check" -gt "0" ]
index 851347961cea5c76f55d5567b6a5fcffaa40bc36..76f79ca1f129a18c3df9c6f22b678190189f2778 100755 (executable)
@@ -60,7 +60,7 @@ _do_mkfs()
                        -d name=$LOOP_DEV,size=${i}g |grep log
                mount -o loop -t xfs $LOOP_DEV $LOOP_MNT
                echo "test write" > $LOOP_MNT/test
-               umount -d $LOOP_MNT > /dev/null 2>&1
+               umount $LOOP_MNT > /dev/null 2>&1
        done
 }
 # make large holey file
index ab55a30a79f8cf4439d151108ddcb2e3cb8ddfad..8aacdf96a46ff06c37a829b248f425c17adde0c6 100755 (executable)
@@ -62,7 +62,7 @@ _do_mkfs()
                        -d name=$LOOP_DEV,size=${i}g |grep log
                mount -o loop -t xfs $LOOP_DEV $LOOP_MNT
                echo "test write" > $LOOP_MNT/test
-               umount -d $LOOP_MNT > /dev/null 2>&1
+               umount $LOOP_MNT > /dev/null 2>&1
 
                # punch out the previous blocks so that we keep the amount of
                # disk space the test requires down to a minimum.
index c1622a4b47d4476fef776b26fe8d470c9897948f..0cdc3822fa328c871adecbdd872ababa0f44fab0 100755 (executable)
@@ -33,7 +33,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
 _cleanup()
 {
        cd /
-       umount -d $LOOP_MNT 2>/dev/null
+       umount $LOOP_MNT 2>/dev/null
        rm -f $LOOP_DEV
        rmdir $LOOP_MNT
 }
@@ -84,7 +84,7 @@ _test_loop()
        xfs_io -f -c "resvsp 0 $fsize" $LOOP_MNT/foo | _filter_io
 
        echo "*** unmount loop filesystem"
-       umount -d $LOOP_MNT > /dev/null 2>&1
+       umount $LOOP_MNT > /dev/null 2>&1
 
        echo "*** check loop filesystem"
         _check_xfs_filesystem $LOOP_DEV none none