Re: [PATCH 13/40] fstests: clean up loop device instantiation

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



On Sun, Dec 08, 2024 at 02:59:38AM +0800, Zorro Lang wrote:
> On Sat, Dec 07, 2024 at 08:44:57PM +0800, Zorro Lang wrote:
> > On Wed, Nov 27, 2024 at 03:51:43PM +1100, Dave Chinner wrote:
> > > From: Dave Chinner <dchinner@xxxxxxxxxx>
> > > 
> > > Lots of tests do there own special thing with loop devices rather
> > > than using _create_loop_device() and _destroy_loop_device(). This
> > > oftens means they do not clean up after themselves properly,
> > > leaving stale loop devices around that result in unmountable test or
> > > scratch devices. This is common when tests are killed by user
> > > interrupt.
> > > 
> > > Even the tests that do use _destroy_loop_device and try to clean up
> > > often do it incorrectly, leading to spurious error messages.
> > > 
> > > Some tests try to use dynamic instantiation via "mount -o loop",
> > > but then don't clean up in the correct order or hack around to find
> > > the loop device that was instantiated because the test needs to know
> > > the instantiated device name
> > > 
> > > Clean this up by converting all the tests to use
> > > _create_loop_device() and _destroy_loop_device(). In all the tests,
> > > use the variable "loop_dev" for the device consistently. In
> > > _destroy_loop_device(), test that a device name has been passed
> > > so that we don't try to clean up the same device twice (e.g. once
> > > before test exit and again from the _cleanup() function). When we
> > > destroy a loop device, unset the variable used to hold the loop
> > > device name so that we don't try to destroy it twice.
> > > 
> > > This results in much more reliable cleanup and clean exit from
> > > fstests when killed by the user.
> > > 
> > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
> > > ---
> > >  common/metadump   | 32 ++++++++++++--------------------
> > >  tests/generic/067 | 11 ++++++++---
> > >  tests/generic/361 |  6 +++++-
> > >  tests/generic/563 | 14 +++++++++-----
> > >  tests/generic/564 | 12 ++++++------
> > >  tests/generic/590 |  9 ++++++---
> > >  tests/generic/744 |  4 ++--
> > >  tests/generic/746 |  6 +++++-
> > >  tests/xfs/014     |  7 +++++--
> > >  tests/xfs/049     | 35 +++++++++++++++++++++--------------
> > >  tests/xfs/073     | 24 +++++++++++++-----------
> > >  tests/xfs/074     | 21 ++++++++++++---------
> > >  tests/xfs/078     | 16 +++++++++-------
> > >  tests/xfs/148     | 23 ++++++++++++++---------
> > >  tests/xfs/149     |  4 ++++
> > >  tests/xfs/216     | 15 ++++++++++-----
> > >  tests/xfs/217     | 22 ++++++++++++++++------
> > >  tests/xfs/250     | 14 +++++++++-----
> > >  tests/xfs/259     | 13 ++++++++-----
> > >  tests/xfs/513     | 44 ++++++++++++++++++++------------------------
> > >  tests/xfs/521     |  8 ++++++--
> > >  tests/xfs/528     | 10 +++++++---
> > >  tests/xfs/530     | 11 ++++++-----
> > >  tests/xfs/606     | 12 ++++++++----
> > >  tests/xfs/613     | 40 ++++++++++++++--------------------------
> > >  tests/xfs/613.out |  1 -
> > >  26 files changed, 235 insertions(+), 179 deletions(-)
> > > 
> > > diff --git a/common/metadump b/common/metadump
> > > index 3373edfe9..bc3038e3b 100644
> > > --- a/common/metadump
> > > +++ b/common/metadump
> > > @@ -24,17 +24,9 @@ _xfs_cleanup_verify_metadump()
> > >  
> > >  	test -n "$XFS_METADUMP_FILE" && rm -f "$XFS_METADUMP_FILE"
> > >  
> > > -	if [ -n "$XFS_METADUMP_IMG" ]; then
> > > -		losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> > > -			losetup -d "$ldev"
> > > -		done
> > > -
> > > -		# Don't call rm directly with a globbed argument here to avoid
> > > -		# issues issues with variable expansions.
> > > -		for img in "$XFS_METADUMP_IMG"*; do
> > > -			test -e "$img" && rm -f "$img"
> > > -		done
> > > -	fi
> > > +	[ -n "$md_data_loop_dev" ] && _destroy_loop_device $md_data_loop_dev
> > > +	[ -n "$md_log_loop_dev" ] && _destroy_loop_device $md_log_loop_dev
> > 
> > As Darrick reported that he always hit below error:
> > 
> >   losetup: /dev/loop0: detach failed: No such device or address
> >   Cannot destroy loop device /dev/loop0
> > 
> > I'm wondering we should use [ -b ] not [ -n ] at here? Or output the stderr
> > to /dev/null directly. Due to... (see below)
> > 
> > > +	rm -f $data_img $log_img
>                 ^^^^^^   ^^^^^^
> Besides above problems, this line doesn't work either, due to the "data_img"
> and "log_img" are local variables in other functions. Even they're not local, 
> think these variable names are too common to be global variable in common helper.
> 
> I'll try to change part of above new code back to old code as below [1]. Hope
> it can help the test work as usual, then we can merge this patch and move
> on. And we can improve this part in later patch.
> 
> Thanks,
> Zorro
> 
> [1]
> -       [ -n "$md_data_loop_dev" ] && _destroy_loop_device $md_data_loop_dev
> -       [ -n "$md_log_loop_dev" ] && _destroy_loop_device $md_log_loop_dev
> -       rm -f $data_img $log_img
> +       if [ -n "$XFS_METADUMP_IMG" ]; then
> +               [ -b "$md_data_loop_dev" ] && _destroy_loop_device $md_data_loop_dev
> +               [ -b "$md_log_loop_dev" ] && _destroy_loop_device $md_log_loop_dev

Finally I can reproduce the issue which Darrick metioned, it needs a new xfsprogs
feature which hasn't been merged. Then I found The [ -b ] only solves half of the
problem, due to even the /dev/loop0 is deteched, the /dev/loop0 is still there, and
[ -b /dev/loop0 ] return true.

To solve this problem totally, I think there're 3 ways:
1) Check if a loop device is really detected, likes the old code did:
     "losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev"
2) unset md_data_loop_dev and md_log_loop_dev properly, after _xfs_verify_metadump_v2()
   deteches them. Something likes this:
  @@ -134,9 +134,11 @@ _xfs_verify_metadump_v2()
        # Tear down what we created
        if [ -b "$md_log_loop_dev" ]; then
                _destroy_loop_device $md_log_loop_dev
+               unset md_log_loop_dev
                rm -f $log_img
        fi
        _destroy_loop_device $md_data_loop_dev
+       unset md_data_loop_dev
        rm -f $data_img

3) Ignore all outputs of _destroy_loop_device, e.g.
  _destroy_loop_device $md_data_loop_dev >/dev/null 2>&1
  _destroy_loop_device $md_log_loop_dev >/dev/null 2>&1

The 1st and 3rd methods can avoid this failure totally. But the 2nd one looks
smoother, and the xfs/129 test passed with it. I'm just not sure if I missed
something else :)

  # ./check -s default xfs/129
  SECTION       -- default
  FSTYP         -- xfs (non-debug)
  PLATFORM      -- Linux/x86_64 dell-per750-41 6.12.0-0.rc7.58.fc42.x86_64 #1 SMP PREEMPT_DYNAMIC Mon Nov 11 15:23:45 UTC 2024
  MKFS_OPTIONS  -- -f /dev/sda6
  MOUNT_OPTIONS -- -o context=system_u:object_r:root_t:s0 /dev/sda6 /mnt/scratch

  xfs/129 9s ...  14s
  Ran: xfs/129
  Passed all 1 tests

If you all agree, I can change this part as the 2nd way when I merge it.

Thanks,
Zorro

> +               for img in "$XFS_METADUMP_IMG"*; do
> +                       test -e "$img" && rm -f "$img"
> +               done
> +       fi
> 
> > >  }
> > >  
> > >  # Can xfs_metadump snapshot the fs metadata to a v1 metadump file?
> > > @@ -122,25 +114,25 @@ _xfs_verify_metadump_v2()
> > >  		_scratch_xfs_mdrestore $metadump_file
> > >  
> > >  	# Create loopdev for data device so we can mount the fs
> > > -	data_loop=$(_create_loop_device $data_img)
> > > +	md_data_loop_dev=$(_create_loop_device $data_img)
> > >  
> > >  	# Create loopdev for log device if we recovered anything
> > > -	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> > > +	test -s "$log_img" && md_log_loop_dev=$(_create_loop_device $log_img)
> > >  
> > >  	# Mount fs, run an extra test, fsck, and unmount
> > > -	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> > > +	SCRATCH_DEV=$md_data_loop_dev SCRATCH_LOGDEV=$md_log_loop_dev _scratch_mount
> > >  	if [ -n "$extra_test" ]; then
> > > -		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> > > +		SCRATCH_DEV=$md_data_loop_dev SCRATCH_LOGDEV=$md_log_loop_dev $extra_test
> > >  	fi
> > > -	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> > > -	SCRATCH_DEV=$data_loop _scratch_unmount
> > > +	SCRATCH_DEV=$md_data_loop_dev SCRATCH_LOGDEV=$md_log_loop_dev _check_xfs_scratch_fs
> > > +	_unmount $md_data_loop_dev
> > 
> > We umount loop devices we created above at here, and ...
> > 
> > >  
> > >  	# Tear down what we created
> > > -	if [ -b "$log_loop" ]; then
> > > -		_destroy_loop_device $log_loop
> > > +	if [ -b "$md_log_loop_dev" ]; then
> > > +		_destroy_loop_device $md_log_loop_dev
> > >  		rm -f $log_img
> > >  	fi
> > > -	_destroy_loop_device $data_loop
> > > +	_destroy_loop_device $md_data_loop_dev
> > 
> > we even has destroied them at here.
> > 
> > So that _xfs_cleanup_verify_metadump function hit "detach failed: No such
> > device or address", due to those loop devices might have been released,
> > but the variables are not unset.
> > 
> > I didn't give it a test, just did a code review. As Darrick uses this part mostly,
> > could you please check what I said above?
> > 
> > Thanks,
> > Zorro
> > 
> > >  	rm -f $data_img
> > >  }
> > >  
> > > diff --git a/tests/generic/067 b/tests/generic/067
> > > index ccb1e3fbb..b45ae834f 100755
> > > --- a/tests/generic/067
> > > +++ b/tests/generic/067
> > > @@ -37,13 +37,18 @@ mount_nonexistent_mnt()
> > >  	$MOUNT_PROG $SCRATCH_DEV $TEST_DIR/nosuchdir >>$seqres.full 2>&1
> > >  }
> > >  
> > > -# fs driver should be able to handle mounting a free loop device gracefully
> > > -# xfs ever hung, "ec53d1d xfs: don't block on buffer read errors" fixed it
> > > +# fs driver should be able to handle mounting a free loop device gracefully xfs
> > > +# ever hung, "ec53d1d xfs: don't block on buffer read errors" fixed it
> > > +#
> > > +# Using 'losetup -f' like this is racy. We might end up mounting a real loop dev
> > > +# here, so unmount $SCRATCH_MNT (not the loop dev we might not own!) and ignore
> > > +# any error it might return.
> > >  mount_free_loopdev()
> > >  {
> > >  	echo "# mount a free loop device" >>$seqres.full
> > >  	loopdev=`losetup -f`
> > > -	$MOUNT_PROG -t $FSTYP $loopdev $SCRATCH_MNT >>$seqres.full 2>&1
> > > +	_mount $loopdev $SCRATCH_MNT >>$seqres.full 2>&1
> > > +	_unmount $SCRATCH_MNT >> /dev/null 2>&1
> > >  }
> > >  
> > >  # mount with wrong fs type specified.
> > > diff --git a/tests/generic/361 b/tests/generic/361
> > > index 7273dd056..e2b798436 100755
> > > --- a/tests/generic/361
> > > +++ b/tests/generic/361
> > > @@ -17,7 +17,7 @@ _begin_fstest auto quick
> > >  _cleanup()
> > >  {
> > >  	_unmount $fs_mnt
> > > -	_destroy_loop_device $loop_dev
> > > +	[ -n "$loop_dev" ] && _destroy_loop_device $loop_dev
> > >  	cd /
> > >  	rm -f $tmp.*
> > >  }
> > > @@ -54,6 +54,10 @@ $XFS_IO_PROG -fc "pwrite 0 520m" $fs_mnt/testfile >>$seqres.full 2>&1
> > >  # remount should not hang
> > >  $MOUNT_PROG -o remount,ro $fs_mnt >>$seqres.full 2>&1
> > >  
> > > +_unmount $fs_mnt
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > > +
> > >  # success, all done
> > >  echo "Silence is golden"
> > >  status=0
> > > diff --git a/tests/generic/563 b/tests/generic/563
> > > index f0d2f404c..34d21170c 100755
> > > --- a/tests/generic/563
> > > +++ b/tests/generic/563
> > > @@ -87,12 +87,12 @@ reset()
> > >  
> > >  # cgroup I/O accounting doesn't work on partitions. Use a loop device to rule
> > >  # that out.
> > > -LOOP_DEV=$(_create_loop_device $SCRATCH_DEV)
> > > -smajor=$((0x`stat -L -c %t $LOOP_DEV`))
> > > -sminor=$((0x`stat -L -c %T $LOOP_DEV`))
> > > +loop_dev=$(_create_loop_device $SCRATCH_DEV)
> > > +smajor=$((0x`stat -L -c %t $loop_dev`))
> > > +sminor=$((0x`stat -L -c %T $loop_dev`))
> > >  
> > > -_mkfs_dev $LOOP_DEV >> $seqres.full 2>&1
> > > -_mount $LOOP_DEV $SCRATCH_MNT || _fail "mount failed"
> > > +_mkfs_dev $loop_dev >> $seqres.full 2>&1
> > > +_mount $loop_dev $SCRATCH_MNT || _fail "mount failed"
> > >  
> > >  blksize=$(_get_block_size "$SCRATCH_MNT")
> > >  
> > > @@ -147,6 +147,10 @@ if [ "$drop_io_cgroup" = 1 ]; then
> > >  	echo "-io" > $cgdir/cgroup.subtree_control || _fail "subtree control"
> > >  fi
> > >  
> > > +_unmount $SCRATCH_MNT
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > > +
> > >  # success, all done
> > >  status=0
> > >  exit
> > > diff --git a/tests/generic/564 b/tests/generic/564
> > > index 647472d78..b66b72496 100755
> > > --- a/tests/generic/564
> > > +++ b/tests/generic/564
> > > @@ -19,7 +19,7 @@ _cleanup()
> > >  {
> > >  	cd /
> > >  	rm -rf $tmp.*
> > > -	[ -z "$loopdev" ] || _destroy_loop_device $loopdev
> > > +	[ -n "$loop_dev" ] && _destroy_loop_device $loop_dev
> > >  }
> > >  
> > >  # Import common functions.
> > > @@ -72,11 +72,11 @@ $XFS_IO_PROG -f -c "copy_range -l 32k $testdir" $testdir/copy
> > >  echo
> > >  echo source/destination as blkdev returns EINVAL
> > >  $XFS_IO_PROG -f -c "truncate 128k" $testdir/img >> $seqres.full 2>&1
> > > -loopdev=`_create_loop_device $testdir/img`
> > > -$XFS_IO_PROG -c "copy_range -l 32k $testdir/file" $loopdev
> > > -$XFS_IO_PROG -f -c "copy_range -l 32k $loopdev" $testdir/copy
> > > -_destroy_loop_device $loopdev
> > > -loopdev=
> > > +loop_dev=`_create_loop_device $testdir/img`
> > > +$XFS_IO_PROG -c "copy_range -l 32k $testdir/file" $loop_dev
> > > +$XFS_IO_PROG -f -c "copy_range -l 32k $loop_dev" $testdir/copy
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > >  
> > >  echo
> > >  echo source/destination as chardev returns EINVAL
> > > diff --git a/tests/generic/590 b/tests/generic/590
> > > index 2b7ccfb53..2eefa2c62 100755
> > > --- a/tests/generic/590
> > > +++ b/tests/generic/590
> > > @@ -15,9 +15,10 @@ _begin_fstest auto prealloc preallocrw
> > >  # Override the default cleanup function.
> > >  _cleanup()
> > >  {
> > > +	_scratch_unmount
> > > +	[ -n $loop_dev ] && _destroy_loop_device $loop_dev
> > >  	cd /
> > >  	rm -f $tmp.*
> > > -	test -n "$loop" && _destroy_loop_device "$loop"
> > >  	rm -f "$TEST_DIR/$seq"
> > >  }
> > >  
> > > @@ -56,9 +57,9 @@ if [[ $FSTYP = xfs ]]; then
> > >  		loopsz="$((filesz + (1 << 26)))"
> > >  		_require_fs_space "$TEST_DIR" $((loopsz / 1024))
> > >  		$XFS_IO_PROG -c "truncate $loopsz" -f "$TEST_DIR/$seq"
> > > -		loop="$(_create_loop_device "$TEST_DIR/$seq")"
> > > +		loop_dev="$(_create_loop_device "$TEST_DIR/$seq")"
> > >  		USE_EXTERNAL=yes
> > > -		SCRATCH_RTDEV="$loop"
> > > +		SCRATCH_RTDEV="$loop_dev"
> > >  		disabled_features=()
> > >  
> > >  		# disable reflink if not supported by realtime devices
> > > @@ -114,6 +115,8 @@ $XFS_IO_PROG -c "truncate 0" -c fsync "$SCRATCH_MNT/file"
> > >  # We need to do this before the loop device gets torn down.
> > >  _scratch_unmount
> > >  _check_scratch_fs
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > >  
> > >  echo "Silence is golden"
> > >  status=0
> > > diff --git a/tests/generic/744 b/tests/generic/744
> > > index df8f6ae9b..cda10e0f6 100755
> > > --- a/tests/generic/744
> > > +++ b/tests/generic/744
> > > @@ -17,8 +17,8 @@ _cleanup()
> > >  
> > >  	_unmount $mnt2 &> /dev/null
> > >  	_unmount $mnt1 &> /dev/null
> > > -	[ -b "$loop_dev2" ] && losetup -d $loop_dev2
> > > -	[ -b "$loop_dev1" ] && losetup -d $loop_dev1
> > > +	[ -b "$loop_dev2" ] && _destroy_loop_device $loop_dev2
> > > +	[ -b "$loop_dev1" ] && _destroy_loop_device $loop_dev1
> > >  	[ -n "$seq" ] && rm -rf $TEST_DIR/$seq
> > >  }
> > >  
> > > diff --git a/tests/generic/746 b/tests/generic/746
> > > index 671910606..ba8ed25e8 100755
> > > --- a/tests/generic/746
> > > +++ b/tests/generic/746
> > > @@ -39,7 +39,7 @@ esac
> > >  _cleanup()
> > >  {
> > >  	_unmount $loop_mnt &> /dev/null
> > > -	_destroy_loop_device $loop_dev
> > > +	[ -n "$loop_dev" ] && _destroy_loop_device $loop_dev
> > >  	if [ $status -eq 0 ]; then
> > >  		rm -rf $tmp
> > >  		rm $img_file
> > > @@ -223,5 +223,9 @@ while read line; do
> > >  done < $fiemap_after
> > >  echo "done."
> > >  
> > > +_unmount $loop_mnt
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > > +
> > >  status=0
> > >  exit
> > > diff --git a/tests/xfs/014 b/tests/xfs/014
> > > index f638e4b16..39ea40e2a 100755
> > > --- a/tests/xfs/014
> > > +++ b/tests/xfs/014
> > > @@ -23,6 +23,7 @@ _cleanup()
> > >  {
> > >  	cd /
> > >  	_unmount $LOOP_MNT 2>/dev/null
> > > +	[ -n "$loop_dev" ] && _destroy_loop_device $loop_dev
> > >  	_scratch_unmount 2>/dev/null
> > >  	rm -f $tmp.*
> > >  }
> > > @@ -166,19 +167,21 @@ LOOP_FILE=$SCRATCH_MNT/$seq.fs
> > >  LOOP_MNT=$SCRATCH_MNT/$seq.mnt
> > >  
> > >  $MKFS_XFS_PROG -d "file=1,name=$LOOP_FILE,size=10g" >> $seqres.full 2>&1
> > > +loop_dev=$(_create_loop_device $LOOP_FILE)
> > >  
> > >  mkdir -p $LOOP_MNT
> > > -_mount -o uquota,gquota $LOOP_FILE $LOOP_MNT || \
> > > +_mount -o uquota,gquota $loop_dev $LOOP_MNT || \
> > >  	_fail "Failed to mount loop fs."
> > >  
> > >  _test_enospc $LOOP_MNT
> > >  _test_edquot $LOOP_MNT
> > >  
> > >  _unmount $LOOP_MNT
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > >  
> > >  echo $orig_sp_time > /proc/sys/fs/xfs/speculative_prealloc_lifetime
> > >  
> > >  _scratch_unmount
> > > -
> > >  status=0
> > >  exit
> > > diff --git a/tests/xfs/049 b/tests/xfs/049
> > > index 4163a144f..cdcddf764 100755
> > > --- a/tests/xfs/049
> > > +++ b/tests/xfs/049
> > > @@ -12,16 +12,17 @@ _begin_fstest rw auto quick
> > >  # Override the default cleanup function.
> > >  _cleanup()
> > >  {
> > > -    cd /
> > > -    umount $SCRATCH_MNT/test2 > /dev/null 2>&1
> > > -    umount $SCRATCH_MNT/test > /dev/null 2>&1
> > > -    rm -f $tmp.*
> > > +	cd /
> > > +	_unmount $SCRATCH_MNT/test2 > /dev/null 2>&1
> > > +	_unmount $SCRATCH_MNT/test > /dev/null 2>&1
> > > +	[ -n "$loop_dev2" ] && _destroy_loop_device $loop_dev2
> > > +	[ -n "$loop_dev1" ] && _destroy_loop_device $loop_dev1
> > > +	rm -f $tmp.*
> > >  
> > > -    if [ -w $seqres.full ]
> > > -    then
> > > -        echo "--- mounts at end (after cleanup)" >> $seqres.full
> > > -        mount >> $seqres.full
> > > -    fi
> > > +	if [ -w $seqres.full ]; then
> > > +		echo "--- mounts at end (after cleanup)" >> $seqres.full
> > > +		mount >> $seqres.full
> > > +	fi
> > >  }
> > >  
> > >  # Import common functions.
> > > @@ -64,7 +65,8 @@ 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 \
> > > +loop_dev1=$(_create_loop_device $SCRATCH_MNT/test.xfs)
> > > +_mount $loop_dev1 $SCRATCH_MNT/test >> $seqres.full 2>&1 \
> > >      || _fail "!!! failed to loop mount xfs"
> > >  
> > >  _log "stress"
> > > @@ -80,11 +82,12 @@ dd if=/dev/zero of=$SCRATCH_MNT/test/test.ext2 bs=1024 count=10240 >> $seqres.fu
> > >      || _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 \
> > > +loop_dev2=$(_create_loop_device $SCRATCH_MNT/test/test.ext2)
> > > +echo y | mkfs -t ext2 $loop_dev2 >> $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 \
> > > +_mount $loop_dev2 $SCRATCH_MNT/test2 >> $seqres.full 2>&1 \
> > >      || _fail "!!! failed to loop mount xfs"
> > >  
> > >  _log "stress ext2 on xfs via loop"
> > > @@ -96,12 +99,16 @@ 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 \
> > > +_unmount $SCRATCH_MNT/test2 >> $seqres.full 2>&1 \
> > >      || _fail "!!! umount ext2 failed"
> > > +_destroy_loop_device $loop_dev2
> > > +unset loop_dev2
> > >  
> > >  _log "umount xfs"
> > > -umount $SCRATCH_MNT/test >> $seqres.full 2>&1 \
> > > +_unmount $SCRATCH_MNT/test >> $seqres.full 2>&1 \
> > >      || _fail "!!! umount xfs failed"
> > > +_destroy_loop_device $loop_dev1
> > > +unset loop_dev1
> > >  
> > >  echo "--- mounts at end (before cleanup)" >> $seqres.full
> > >  mount >> $seqres.full
> > > diff --git a/tests/xfs/073 b/tests/xfs/073
> > > index e4b17c5e7..2274079ef 100755
> > > --- a/tests/xfs/073
> > > +++ b/tests/xfs/073
> > > @@ -23,6 +23,8 @@ _cleanup()
> > >  	_scratch_unmount 2>/dev/null
> > >  	_unmount $imgs.loop 2>/dev/null
> > >  	_unmount $imgs.source_dir 2>/dev/null
> > > +	[ -n "$loop_dev1" ] && _destroy_loop_device $loop_dev1
> > > +	[ -n "$loop_dev2" ] && _destroy_loop_device $loop_dev2
> > >  	[ -d $imgs.loop ] && rmdir $imgs.loop
> > >  	[ -d $imgs.source_dir ] && rm -rf $imgs.source_dir
> > >  	rm -f $imgs.* $tmp.* /var/tmp/xfs_copy.log.*
> > > @@ -65,10 +67,11 @@ _verify_copy()
> > >  	rmdir $target_dir 2>/dev/null
> > >  	mkdir $target_dir
> > >  
> > > -	_mount -t xfs -o loop $target $target_dir 2>/dev/null
> > > +	loop_dev1=$(_create_loop_device $target)
> > > +	_mount $loop_dev1 $target_dir 2>/dev/null
> > >  	if [ $? -ne 0 ]; then
> > >  		echo retrying mount with nouuid option >>$seqres.full
> > > -		_mount -t xfs -o loop -o nouuid $target $target_dir
> > > +		_mount -o nouuid $loop_dev1 $target_dir
> > >  		if [ $? -ne 0 ]; then
> > >  			echo mount failed - evil!
> > >  			return
> > > @@ -100,6 +103,8 @@ _verify_copy()
> > >  	echo unmounting and removing new image
> > >  	_unmount $source_dir
> > >  	_unmount $target_dir > /dev/null 2>&1
> > > +	_destroy_loop_device $loop_dev1
> > > +	unset loop_dev1
> > >  	rm -f $target
> > >  }
> > >  
> > > @@ -134,18 +139,15 @@ ${MKFS_XFS_PROG} -dfile,name=$imgs.source,size=100g \
> > >  rmdir $imgs.source_dir 2>/dev/null
> > >  mkdir $imgs.source_dir
> > >  
> > > -_mount -t xfs -o loop $imgs.source $imgs.source_dir
> > > -loop2=`mount | grep $imgs.source | grep -o -e 'loop=.*[^),]' | grep -o -e '/.*$'`
> > > +loop_dev2=$(_create_loop_device $imgs.source)
> > > +_mount $loop_dev2 $imgs.source_dir
> > >  cp -a $here $imgs.source_dir
> > > -_mount -t xfs -o remount,ro $imgs.source $imgs.source_dir
> > > -$XFS_COPY_PROG $imgs.source $imgs.image | _filter_copy '#' $imgs.image '#' '#'
> > > +_mount -o remount,ro $loop_dev2 $imgs.source_dir
> > > +$XFS_COPY_PROG $loop_dev2 $imgs.image 2> /dev/null | _filter_copy '#' $imgs.image '#' '#'
> > >  _verify_copy $imgs.image $imgs.source $imgs.source_dir
> > >  
> > > -# HACK WARNING:
> > > -#
> > > -# We're done with the nested loop mount, now we have to clean
> > > -# up the pieces that mount is incapable of doing.
> > > -losetup -d $loop2 > /dev/null 2>&1
> > > +_destroy_loop_device $loop_dev2
> > > +unset loop_dev2
> > >  
> > >  echo
> > >  echo === copying scratch device to multiple targets
> > > diff --git a/tests/xfs/074 b/tests/xfs/074
> > > index 6a03c8111..5df864fad 100755
> > > --- a/tests/xfs/074
> > > +++ b/tests/xfs/074
> > > @@ -26,7 +26,7 @@ _begin_fstest quick auto prealloc rw
> > >  _cleanup()
> > >  {
> > >  	cd /
> > > -	_destroy_loop_device $LOOP_DEV
> > > +	[ -n "$loop_dev" ] &&_destroy_loop_device $loop_dev
> > >  	rm -f $tmp.* $LOOP_FILE
> > >  }
> > >  
> > > @@ -45,10 +45,10 @@ LOOP_FILE=$TEST_DIR/$seq.img
> > >  LOOP_MNT=$TEST_DIR/$seq.mnt
> > >  mkdir -p $LOOP_MNT
> > >  $XFS_IO_PROG -ft -c "truncate 1t" $LOOP_FILE >> $seqres.full
> > > -LOOP_DEV=`_create_loop_device $LOOP_FILE`
> > > +loop_dev=`_create_loop_device $LOOP_FILE`
> > >  
> > > -_mkfs_dev -d size=260g,agcount=2 $LOOP_DEV
> > > -_mount $LOOP_DEV $LOOP_MNT
> > > +_mkfs_dev -d size=260g,agcount=2 $loop_dev
> > > +_mount $loop_dev $LOOP_MNT
> > >  
> > >  BLOCK_SIZE=$(_get_file_block_size $LOOP_MNT)
> > >  
> > > @@ -59,11 +59,11 @@ $XFS_IO_PROG -ft \
> > >  	-c "falloc 0 $(($BLOCK_SIZE * 2097152))" \
> > >  	$LOOP_MNT/foo >> $seqres.full
> > >  
> > > -umount $LOOP_MNT
> > > -_check_xfs_filesystem $LOOP_DEV none none
> > > +_unmount $LOOP_MNT
> > > +_check_xfs_filesystem $loop_dev none none
> > >  
> > > -_mkfs_dev -f $LOOP_DEV
> > > -_mount $LOOP_DEV $LOOP_MNT
> > > +_mkfs_dev -f $loop_dev
> > > +_mount $loop_dev $LOOP_MNT
> > >  
> > >  # check we trim both ends of the extent approproiately; this will fail
> > >  # on 1k block size filesystems without the correct fixes in place.
> > > @@ -73,7 +73,10 @@ $XFS_IO_PROG -ft \
> > >  	$LOOP_MNT/foo >> $seqres.full
> > >  
> > >  _unmount $LOOP_MNT
> > > -_check_xfs_filesystem $LOOP_DEV none none
> > > +_check_xfs_filesystem $loop_dev none none
> > > +
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > >  
> > >  # success, all done
> > >  echo "Silence is golden"
> > > diff --git a/tests/xfs/078 b/tests/xfs/078
> > > index 6b325e05f..0d3c2eb23 100755
> > > --- a/tests/xfs/078
> > > +++ b/tests/xfs/078
> > > @@ -17,7 +17,7 @@ _cleanup()
> > >  	cd /
> > >  	rm -f $tmp.*
> > >  	_unmount $LOOP_MNT 2>/dev/null
> > > -	[ -n "$LOOP_DEV" ] && _destroy_loop_device $LOOP_DEV 2>/dev/null
> > > +	[ -n "$loop_dev" ] && _destroy_loop_device $loop_dev 2>/dev/null
> > >  	# try to keep the image file if test fails
> > >  	[ $status -eq 0 ] && rm -f $LOOP_IMG
> > >  	rmdir $LOOP_MNT
> > > @@ -55,7 +55,7 @@ _grow_loop()
> > >  	agsize=$5
> > >  
> > >  	$XFS_IO_PROG -f -c "truncate $original" $LOOP_IMG
> > > -	LOOP_DEV=`_create_loop_device $LOOP_IMG`
> > > +	loop_dev=`_create_loop_device $LOOP_IMG`
> > >  
> > >  	dparam=""
> > >  	if [ -n "$agsize" ]; then
> > > @@ -67,15 +67,15 @@ _grow_loop()
> > >  	echo
> > >  
> > >  	echo "*** mkfs loop file (size=$original)"
> > > -	$MKFS_XFS_PROG -b size=$bsize $dparam $LOOP_DEV | \
> > > +	$MKFS_XFS_PROG -b size=$bsize $dparam $loop_dev | \
> > >  		_filter_mkfs 2>/dev/null
> > >  
> > >  	echo "*** extend loop file"
> > > -	_destroy_loop_device $LOOP_DEV
> > > +	_destroy_loop_device $loop_dev
> > >  	$XFS_IO_PROG -c "pwrite $new_size $bsize" $LOOP_IMG | _filter_io
> > > -	LOOP_DEV=`_create_loop_device $LOOP_IMG`
> > > +	loop_dev=`_create_loop_device $LOOP_IMG`
> > >  	echo "*** mount loop filesystem"
> > > -	_mount -t xfs $LOOP_DEV $LOOP_MNT
> > > +	_mount $loop_dev $LOOP_MNT
> > >  
> > >  	echo "*** grow loop filesystem"
> > >  	$XFS_GROWFS_PROG $LOOP_MNT 2>&1 |  _filter_growfs 2>&1
> > > @@ -87,9 +87,11 @@ _grow_loop()
> > >  	if [ "$check" -gt "0" ]
> > >  	then
> > >  		echo "*** check"
> > > -		_check_xfs_filesystem $LOOP_IMG none none
> > > +		_check_xfs_filesystem $loop_dev none none
> > >  	fi
> > >  
> > > +	_destroy_loop_device $loop_dev
> > > +	unset loop_dev
> > >  	rm -f $LOOP_IMG
> > >  }
> > >  
> > > diff --git a/tests/xfs/148 b/tests/xfs/148
> > > index c42c9b119..4d2f7a808 100755
> > > --- a/tests/xfs/148
> > > +++ b/tests/xfs/148
> > > @@ -15,7 +15,7 @@ _cleanup()
> > >  {
> > >  	cd /
> > >  	_unmount $mntpt > /dev/null 2>&1
> > > -	_destroy_loop_device $loopdev > /dev/null 2>&1
> > > +	[ -n "$loop_dev" ] && _destroy_loop_device $loop_dev
> > >  	rm -r -f $tmp.*
> > >  }
> > >  
> > > @@ -48,12 +48,12 @@ rm -f $imgfile $imgfile.old
> > >  # even when security xattrs are present so we are always doing name matches on
> > >  # lookup and not name hash compares as leaf/node forms will do.
> > >  $XFS_IO_PROG -f -c 'truncate 40m' $imgfile
> > > -loopdev=$(_create_loop_device $imgfile)
> > > -MKFS_OPTIONS="-m crc=0 -i size=512" _mkfs_dev $loopdev >> $seqres.full
> > > +loop_dev=$(_create_loop_device $imgfile)
> > > +MKFS_OPTIONS="-m crc=0 -i size=512" _mkfs_dev $loop_dev >> $seqres.full
> > >  
> > >  # Mount image file
> > >  mkdir -p $mntpt
> > > -_mount $loopdev $mntpt
> > > +_mount $loop_dev $mntpt
> > >  
> > >  echo "creating entries" >> $seqres.full
> > >  
> > > @@ -91,7 +91,8 @@ cat $tmp.log | _filter_test_dir
> > >  
> > >  # Corrupt the entries
> > >  _unmount $mntpt
> > > -_destroy_loop_device $loopdev
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > >  cp $imgfile $imgfile.old
> > >  sed -b \
> > >  	-e "s/$nullstr/too_many\x00beans/g" \
> > > @@ -99,8 +100,9 @@ sed -b \
> > >  	-i $imgfile
> > >  test "$(md5sum < $imgfile)" != "$(md5sum < $imgfile.old)" ||
> > >  	_fail "sed failed to change the image file?"
> > > -loopdev=$(_create_loop_device $imgfile)
> > > -_mount $loopdev $mntpt
> > > +
> > > +loop_dev=$(_create_loop_device $imgfile)
> > > +_mount $loop_dev $mntpt
> > >  
> > >  # Try to access the corrupt metadata
> > >  echo "++ ACCESSING BAD METADATA" | tee -a $seqres.full
> > > @@ -111,7 +113,7 @@ cat $tmp.log | _filter_test_dir | sed -e '/Could not list/d'
> > >  echo "does scrub complain?" >> $seqres.full
> > >  
> > >  # Does scrub complain about this?
> > > -if _supports_xfs_scrub $mntpt $loopdev; then
> > > +if _supports_xfs_scrub $mntpt $loop_dev; then
> > >  	$XFS_SCRUB_PROG -n $mntpt >> $seqres.full 2>&1
> > >  	res=$?
> > >  	test $((res & 1)) -eq 0 && \
> > > @@ -122,11 +124,14 @@ echo "does repair complain?" >> $seqres.full
> > >  
> > >  # Does repair complain about this?
> > >  _unmount $mntpt
> > > -$XFS_REPAIR_PROG -n $loopdev >> $seqres.full 2>&1
> > > +$XFS_REPAIR_PROG -n $loop_dev >> $seqres.full 2>&1
> > >  res=$?
> > >  test $res -eq 1 || \
> > >  	echo "repair failed to report corruption ($res)"
> > >  
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > > +
> > >  # success, all done
> > >  status=0
> > >  exit
> > > diff --git a/tests/xfs/149 b/tests/xfs/149
> > > index f2187109b..9a96f82ed 100755
> > > --- a/tests/xfs/149
> > > +++ b/tests/xfs/149
> > > @@ -84,6 +84,10 @@ $XFS_GROWFS_PROG -D 16384 $loop_symlink > /dev/null
> > >  echo "=== xfs_growfs - check device node ==="
> > >  $XFS_GROWFS_PROG -D 20480 $loop_dev > /dev/null
> > >  
> > > +_unmount $mntdir
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > > +
> > >  # success, all done
> > >  status=0
> > >  exit
> > > diff --git a/tests/xfs/216 b/tests/xfs/216
> > > index 6b8b2eb22..091c11d08 100755
> > > --- a/tests/xfs/216
> > > +++ b/tests/xfs/216
> > > @@ -15,6 +15,7 @@ _begin_fstest log metadata auto quick
> > >  _cleanup()
> > >  {
> > >  	_unmount $LOOP_MNT > /dev/null 2>&1
> > > +	[ -n "$loop_dev" ] && _destroy_loop_device $loop_dev
> > >  	cd /
> > >  	rm -f $tmp.*
> > >  }
> > > @@ -24,7 +25,7 @@ _scratch_mkfs_xfs >/dev/null 2>&1
> > >  _scratch_mount
> > >  
> > >  _require_loop
> > > -LOOP_DEV=$SCRATCH_MNT/test_fs
> > > +LOOP_IMG=$SCRATCH_MNT/test_fs
> > >  LOOP_MNT=$SCRATCH_MNT/test_fs_dir
> > >  
> > >  loop_mkfs_opts=
> > > @@ -55,22 +56,26 @@ _do_mkfs()
> > >  	for i in $*; do
> > >  		echo -n "fssize=${i}g "
> > >  		$MKFS_XFS_PROG -f -b size=4096 -l version=2 \
> > > -			-d name=$LOOP_DEV,size=${i}g $loop_mkfs_opts |grep log
> > > -		_mount -o loop -t xfs $LOOP_DEV $LOOP_MNT
> > > +			-d size=${i}g $loop_mkfs_opts $loop_dev |grep log
> > > +		_mount $loop_dev $LOOP_MNT
> > >  		echo "test write" > $LOOP_MNT/test
> > >  		_unmount $LOOP_MNT > /dev/null 2>&1
> > >  	done
> > >  }
> > >  # make large holey file
> > > -$XFS_IO_PROG -f -c "truncate 256g" $LOOP_DEV
> > > +$XFS_IO_PROG -f -c "truncate 256g" $LOOP_IMG
> > >  
> > > -choose_golden_output $0 $LOOP_DEV
> > > +choose_golden_output $0 $LOOP_IMG
> > >  
> > >  #make loopback mount dir
> > >  mkdir $LOOP_MNT
> > >  
> > > +loop_dev=$(_create_loop_device $LOOP_IMG)
> > > +
> > >  # walk over standard sizes (up to 256GB)
> > >  _do_mkfs 1 2 4 8 16 32 64 128 256
> > >  
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > >  status=0
> > >  exit
> > > diff --git a/tests/xfs/217 b/tests/xfs/217
> > > index b2eb34490..dae6ce55f 100755
> > > --- a/tests/xfs/217
> > > +++ b/tests/xfs/217
> > > @@ -12,6 +12,12 @@ _begin_fstest log metadata auto
> > >  # Import common functions.
> > >  . ./common/filter
> > >  
> > > +_cleanup()
> > > +{
> > > +	[ -n "$loop_dev" ] && _destroy_loop_device $loop_dev
> > > +	cd /
> > > +	rm -f $tmp.*
> > > +}
> > >  
> > >  _require_scratch
> > >  _scratch_mkfs_xfs >/dev/null 2>&1
> > > @@ -20,7 +26,7 @@ _scratch_mount
> > >  _require_fs_space $SCRATCH_MNT 2202000
> > >  
> > >  _require_loop
> > > -LOOP_DEV=$SCRATCH_MNT/test_fs
> > > +LOOP_IMG=$SCRATCH_MNT/test_fs
> > >  LOOP_MNT=$SCRATCH_MNT/test_fs_dir
> > >  
> > >  _do_mkfs()
> > > @@ -28,28 +34,30 @@ _do_mkfs()
> > >  	for i in $*; do
> > >  		echo -n "fssize=${i}g "
> > >  		$MKFS_XFS_PROG -f -b size=4096 -l version=2 \
> > > -			-d name=$LOOP_DEV,size=${i}g |grep log
> > > -		_mount -o loop -t xfs $LOOP_DEV $LOOP_MNT
> > > +			-d size=${i}g $loop_dev |grep log
> > > +		_mount $loop_dev $LOOP_MNT
> > >  		echo "test write" > $LOOP_MNT/test
> > >  		_unmount $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.
> > > -		$XFS_IO_PROG -f -c "unresvsp 0 16383g" $LOOP_DEV
> > > +		$XFS_IO_PROG -f -c "unresvsp 0 16383g" $LOOP_IMG
> > >  	done
> > >  }
> > >  # make large holey file
> > > -$XFS_IO_PROG -f -c "truncate 16383g" $LOOP_DEV
> > > +$XFS_IO_PROG -f -c "truncate 16383g" $LOOP_IMG
> > >  
> > >  #make loopback mount dir
> > >  mkdir $LOOP_MNT
> > >  
> > >  # test if large logs are supported
> > > -$MKFS_XFS_PROG -f -l size=256m -d name=$LOOP_DEV,size=10g > /dev/null 2>&1
> > > +$MKFS_XFS_PROG -f -l size=256m -d name=$LOOP_IMG,size=10g > /dev/null 2>&1
> > >  if [ $? -ne 0 ]; then
> > >  	_notrun "large log sizes not supported by mkfs"
> > >  fi
> > >  
> > > +loop_dev=$(_create_loop_device $LOOP_IMG)
> > > +
> > >  #
> > >  # walk over "new" sizes supported by recent xfsprogs.
> > >  # Note that the last test is for 16TB-1GB as 32bit platforms only support
> > > @@ -57,5 +65,7 @@ fi
> > >  #
> > >  _do_mkfs 512 1024 2048 4096 8192 16383
> > >  
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > >  status=0
> > >  exit
> > > diff --git a/tests/xfs/250 b/tests/xfs/250
> > > index 4e3473ebc..2554e1e91 100755
> > > --- a/tests/xfs/250
> > > +++ b/tests/xfs/250
> > > @@ -14,7 +14,8 @@ _cleanup()
> > >  {
> > >  	cd /
> > >  	_unmount $LOOP_MNT 2>/dev/null
> > > -	rm -f $LOOP_DEV
> > > +	[ -n "$loop_dev" ] && _destroy_loop_device $loop_dev
> > > +	rm -f $LOOP_IMG
> > >  	rmdir $LOOP_MNT
> > >  	rm -f $tmp.*
> > >  }
> > > @@ -26,7 +27,7 @@ _require_test
> > >  _require_loop
> > >  _require_xfs_io_command "falloc"
> > >  
> > > -LOOP_DEV=$TEST_DIR/$seq.fs
> > > +LOOP_IMG=$TEST_DIR/$seq.fs
> > >  LOOP_MNT=$TEST_DIR/$seq.mnt
> > >  
> > >  _filter_io()
> > > @@ -45,7 +46,7 @@ _test_loop()
> > >  	agsize=$2
> > >  	fsize=$3
> > >  
> > > -	dparam="file,name=$LOOP_DEV,size=$size"
> > > +	dparam="file,name=$LOOP_IMG,size=$size"
> > >  	if [ -n "$agsize" ]; then
> > >  		dparam="$dparam,agsize=$agsize"
> > >  	fi
> > > @@ -55,7 +56,8 @@ _test_loop()
> > >  		| _filter_mkfs 2>/dev/null
> > >  
> > >  	echo "*** mount loop filesystem"
> > > -	_mount -t xfs -o loop $LOOP_DEV $LOOP_MNT
> > > +	loop_dev=$(_create_loop_device $LOOP_IMG)
> > > +	mount $loop_dev $LOOP_MNT
> > >  
> > >  	echo "*** preallocate large file"
> > >  	$XFS_IO_PROG -f -c "resvsp 0 $fsize" $LOOP_MNT/foo | _filter_io
> > > @@ -64,7 +66,9 @@ _test_loop()
> > >  	_unmount $LOOP_MNT > /dev/null 2>&1
> > >  
> > >  	echo "*** check loop filesystem"
> > > -	 _check_xfs_filesystem $LOOP_DEV none none
> > > +	_check_xfs_filesystem $loop_dev none none
> > > +	_destroy_loop_device $loop_dev
> > > +	unset loop_dev
> > >  }
> > >  
> > >  _test_loop 50g 16m 40G
> > > diff --git a/tests/xfs/259 b/tests/xfs/259
> > > index 0c8d6eb56..c2d26381a 100755
> > > --- a/tests/xfs/259
> > > +++ b/tests/xfs/259
> > > @@ -12,7 +12,10 @@ _begin_fstest auto quick
> > >  # Override the default cleanup function.
> > >  _cleanup()
> > >  {
> > > -    rm -f "$testfile"
> > > +	[ -n "$loop_dev" ] && _destroy_loop_device $testfile
> > > +	rm -f "$testfile"
> > > +	cd /
> > > +	rm -f $tmp.*
> > >  }
> > >  
> > >  # Import common functions.
> > > @@ -45,13 +48,13 @@ for del in $sizes_to_check; do
> > >  		rm -f "$testfile"
> > >  		dd if=/dev/zero "of=$testfile" bs=1 count=0 seek=$ddseek \
> > >  			>/dev/null 2>&1 || echo "dd failed"
> > > -		lofile=$(losetup -f)
> > > -		losetup $lofile "$testfile"
> > > -		$MKFS_XFS_PROG -l size=32m -b size=$bs $lofile |  _filter_mkfs \
> > > +		loop_dev=$(_create_loop_device $testfile)
> > > +		$MKFS_XFS_PROG -l size=32m -b size=$bs $loop_dev |  _filter_mkfs \
> > >  			>/dev/null 2> $tmp.mkfs || echo "mkfs failed!"
> > >  		. $tmp.mkfs
> > >  		sync
> > > -		losetup -d $lofile
> > > +		_destroy_loop_device $loop_dev
> > > +		unset loop_dev
> > >  	done
> > >  done
> > >  
> > > diff --git a/tests/xfs/513 b/tests/xfs/513
> > > index 5895e6e2d..0c0edc75e 100755
> > > --- a/tests/xfs/513
> > > +++ b/tests/xfs/513
> > > @@ -15,12 +15,8 @@ _cleanup()
> > >  	cd /
> > >  	rm -f $tmp.*
> > >  	_unmount $LOOP_MNT 2>/dev/null
> > > -	if [ -n "$LOOP_DEV" ];then
> > > -		_destroy_loop_device $LOOP_DEV 2>/dev/null
> > > -	fi
> > > -	if [ -n "$LOOP_SPARE_DEV" ];then
> > > -		_destroy_loop_device $LOOP_SPARE_DEV 2>/dev/null
> > > -	fi
> > > +	[ -n $loop_dev ] &&_destroy_loop_device $loop_dev
> > > +	[ -n $loop_spare_dev ] &&_destroy_loop_device $loop_spare_dev
> > >  	rm -f $LOOP_IMG
> > >  	rm -f $LOOP_SPARE_IMG
> > >  	rmdir $LOOP_MNT
> > > @@ -42,11 +38,11 @@ LOOP_MNT=$TEST_DIR/$seq.mnt
> > >  
> > >  echo "** create loop device"
> > >  $XFS_IO_PROG -f -c "truncate 32g" $LOOP_IMG
> > > -LOOP_DEV=`_create_loop_device $LOOP_IMG`
> > > +loop_dev=`_create_loop_device $LOOP_IMG`
> > >  
> > >  echo "** create loop log device"
> > >  $XFS_IO_PROG -f -c "truncate 1g" $LOOP_SPARE_IMG
> > > -LOOP_SPARE_DEV=`_create_loop_device $LOOP_SPARE_IMG`
> > > +loop_spare_dev=`_create_loop_device $LOOP_SPARE_IMG`
> > >  
> > >  echo "** create loop mount point"
> > >  rmdir $LOOP_MNT 2>/dev/null
> > > @@ -55,8 +51,8 @@ mkdir -p $LOOP_MNT || _fail "cannot create loopback mount point"
> > >  filter_loop()
> > >  {
> > >  	sed -e "s,\B$LOOP_MNT,LOOP_MNT,g" \
> > > -	    -e "s,\B$LOOP_DEV,LOOP_DEV,g" \
> > > -	    -e "s,\B$LOOP_SPARE_DEV,LOOP_SPARE_DEV,g"
> > > +	    -e "s,\B$loop_dev,LOOP_DEV,g" \
> > > +	    -e "s,\B$loop_spare_dev,LOOP_SPARE_DEV,g"
> > >  }
> > >  
> > >  filter_xfs_opt()
> > > @@ -69,22 +65,22 @@ MKFS_OPTIONS=""
> > >  do_mkfs()
> > >  {
> > >  	echo "FORMAT: $@" | filter_loop | tee -a $seqres.full
> > > -	$MKFS_XFS_PROG -f $* $LOOP_DEV | _filter_mkfs >>$seqres.full 2>$tmp.mkfs
> > > +	$MKFS_XFS_PROG -f $* $loop_dev | _filter_mkfs >>$seqres.full 2>$tmp.mkfs
> > >  	if [ "${PIPESTATUS[0]}" -ne 0 ]; then
> > > -		_fail "Fails on _mkfs_dev $* $LOOP_DEV"
> > > +		_fail "Fails on _mkfs_dev $* $loop_dev"
> > >  	fi
> > >  	. $tmp.mkfs
> > >  }
> > >  
> > >  is_dev_mounted()
> > >  {
> > > -	findmnt --source $LOOP_DEV >/dev/null
> > > +	findmnt --source $loop_dev >/dev/null
> > >  	return $?
> > >  }
> > >  
> > >  get_mount_info()
> > >  {
> > > -	findmnt --source $LOOP_DEV -o OPTIONS -n
> > > +	findmnt --source $loop_dev -o OPTIONS -n
> > >  }
> > >  
> > >  force_unmount()
> > > @@ -103,29 +99,29 @@ _do_test()
> > >  	local info
> > >  
> > >  	# mount test
> > > -	_mount $LOOP_DEV $LOOP_MNT $opts 2>>$seqres.full
> > > +	_mount $loop_dev $LOOP_MNT $opts 2>>$seqres.full
> > >  	rc=$?
> > >  	if [ $rc -eq 0 ];then
> > >  		if [ "${mounted}" = "fail" ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: expect mount to fail, but it succeeded"
> > >  			return 1
> > >  		fi
> > >  		is_dev_mounted
> > >  		if [ $? -ne 0 ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: fs not mounted even mount return 0"
> > >  			return 1
> > >  		fi
> > >  	else
> > >  		if [ "${mounted}" = "pass" ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: expect mount to succeed, but it failed"
> > >  			return 1
> > >  		fi
> > >  		is_dev_mounted
> > >  		if [ $? -eq 0 ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: fs is mounted even mount return non-zero"
> > >  			return 1
> > >  		fi
> > > @@ -141,13 +137,13 @@ _do_test()
> > >  	rc=$?
> > >  	if [ $rc -eq 0 ];then
> > >  		if [ "$found" != "true" ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: expected to find \"$key\" in mount info \"$info\""
> > >  			return 1
> > >  		fi
> > >  	else
> > >  		if [ "$found" != "false" ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: did not expect to find \"$key\" in \"$info\""
> > >  			return 1
> > >  		fi
> > > @@ -253,9 +249,9 @@ do_test "-o logbsize=512k" fail
> > >  # Test logdev
> > >  do_mkfs
> > >  do_test "" pass "logdev" "false"
> > > -do_test "-o logdev=$LOOP_SPARE_DEV" fail
> > > -do_mkfs -l logdev=$LOOP_SPARE_DEV
> > > -do_test "-o logdev=$LOOP_SPARE_DEV" pass "logdev=$LOOP_SPARE_DEV" "true"
> > > +do_test "-o logdev=$loop_spare_dev" fail
> > > +do_mkfs -l logdev=$loop_spare_dev
> > > +do_test "-o logdev=$loop_spare_dev" pass "logdev=$loop_spare_dev" "true"
> > >  do_test "" fail
> > >  
> > >  # Test noalign
> > > diff --git a/tests/xfs/521 b/tests/xfs/521
> > > index 13982c440..c92c621a2 100755
> > > --- a/tests/xfs/521
> > > +++ b/tests/xfs/521
> > > @@ -21,7 +21,7 @@ _cleanup()
> > >  {
> > >  	cd /
> > >  	_scratch_unmount >> $seqres.full 2>&1
> > > -	test -e "$rtdev" && losetup -d $rtdev >> $seqres.full 2>&1
> > > +	[ -n "$rt_loop_dev" ] && _destroy_loop_device $rt_loop_dev
> > >  	rm -f $tmp.* $TEST_DIR/$seq.rtvol
> > >  }
> > >  
> > > @@ -35,7 +35,7 @@ _require_no_large_scratch_dev
> > >  
> > >  echo "Create fake rt volume"
> > >  truncate -s 400m $TEST_DIR/$seq.rtvol
> > > -rtdev=$(_create_loop_device $TEST_DIR/$seq.rtvol)
> > > +rt_loop_dev=$(_create_loop_device $TEST_DIR/$seq.rtvol)
> > >  
> > >  echo "Format and mount 100m rt volume"
> > >  export USE_EXTERNAL=yes
> > > @@ -69,6 +69,10 @@ cp -p $testdir/original $testdir/copy3
> > >  echo "Check filesystem"
> > >  _check_scratch_fs
> > >  
> > > +_scratch_unmount
> > > +_destroy_loop_device $rt_loop_dev
> > > +unset rt_loop_dev
> > > +
> > >  # success, all done
> > >  status=0
> > >  exit
> > > diff --git a/tests/xfs/528 b/tests/xfs/528
> > > index 6ca9a2370..a1efbbd27 100755
> > > --- a/tests/xfs/528
> > > +++ b/tests/xfs/528
> > > @@ -15,7 +15,7 @@ _cleanup()
> > >  {
> > >  	cd /
> > >  	_scratch_unmount >> $seqres.full 2>&1
> > > -	test -e "$rtdev" && losetup -d $rtdev >> $seqres.full 2>&1
> > > +	[ -n "$rt_loop_dev" ] && _destroy_loop_device $rt_loop_dev
> > >  	rm -f $tmp.* $TEST_DIR/$seq.rtvol
> > >  }
> > >  
> > > @@ -155,11 +155,11 @@ test_ops() {
> > >  
> > >  echo "Create fake rt volume"
> > >  $XFS_IO_PROG -f -c "truncate 400m" $TEST_DIR/$seq.rtvol
> > > -rtdev=$(_create_loop_device $TEST_DIR/$seq.rtvol)
> > > +rt_loop_dev=$(_create_loop_device $TEST_DIR/$seq.rtvol)
> > >  
> > >  echo "Make sure synth rt volume works"
> > >  export USE_EXTERNAL=yes
> > > -export SCRATCH_RTDEV=$rtdev
> > > +export SCRATCH_RTDEV=$rt_loop_dev
> > >  _scratch_mkfs > $seqres.full
> > >  _try_scratch_mount || \
> > >  	_notrun "Could not mount with synthetic rt volume"
> > > @@ -170,6 +170,10 @@ test_ops 262144
> > >  # not a power of two
> > >  test_ops 327680
> > >  
> > > +_scratch_unmount
> > > +_destroy_loop_device $rt_loop_dev
> > > +unset rt_loop_dev
> > > +
> > >  # success, all done
> > >  status=0
> > >  exit
> > > diff --git a/tests/xfs/530 b/tests/xfs/530
> > > index 8a182bd6a..d0d0e2665 100755
> > > --- a/tests/xfs/530
> > > +++ b/tests/xfs/530
> > > @@ -15,7 +15,7 @@ _cleanup()
> > >  {
> > >  	cd /
> > >  	_scratch_unmount >> $seqres.full 2>&1
> > > -	test -e "$rtdev" && losetup -d $rtdev >> $seqres.full 2>&1
> > > +	[ -n "$rt_loop_dev" ] && _destroy_loop_device $rt_loop_dev
> > >  	rm -f $tmp.* $TEST_DIR/$seq.rtvol
> > >  }
> > >  
> > > @@ -52,12 +52,12 @@ fi
> > >  
> > >  rtdevsz=$((nr_bits * rtextsz))
> > >  truncate -s $rtdevsz $TEST_DIR/$seq.rtvol
> > > -rtdev=$(_create_loop_device $TEST_DIR/$seq.rtvol)
> > > +rt_loop_dev=$(_create_loop_device $TEST_DIR/$seq.rtvol)
> > >  
> > >  echo "Format and mount rt volume"
> > >  
> > >  export USE_EXTERNAL=yes
> > > -export SCRATCH_RTDEV=$rtdev
> > > +export SCRATCH_RTDEV=$rt_loop_dev
> > >  _scratch_mkfs -d size=$((1024 * 1024 * 1024)) \
> > >  	      -r size=${rtextsz},extsize=${rtextsz} >> $seqres.full
> > >  _try_scratch_mount || _notrun "Couldn't mount fs with synthetic rt volume"
> > > @@ -116,8 +116,9 @@ done
> > >  echo "Check filesystem"
> > >  _check_scratch_fs
> > >  
> > > -losetup -d $rtdev
> > > -rm -f $TEST_DIR/$seq.rtvol
> > > +_scratch_unmount
> > > +_destroy_loop_device $rt_loop_dev
> > > +unset rt_loop_dev
> > >  
> > >  # success, all done
> > >  status=0
> > > diff --git a/tests/xfs/606 b/tests/xfs/606
> > > index f958bddd8..b537ea145 100755
> > > --- a/tests/xfs/606
> > > +++ b/tests/xfs/606
> > > @@ -13,10 +13,8 @@ _begin_fstest auto quick growfs
> > >  
> > >  _cleanup()
> > >  {
> > > -	local dev
> > >  	_unmount $LOOP_MNT 2>/dev/null
> > > -	dev=$(losetup -j testfile | cut -d: -f1)
> > > -	losetup -d $dev 2>/dev/null
> > > +	[ -n "$loop_dev" ] && _destroy_loop_device $loop_dev
> > >  	rm -rf $LOOP_IMG $LOOP_MNT
> > >  	cd /
> > >  	rm -f $tmp.*
> > > @@ -40,7 +38,9 @@ $MKFS_XFS_PROG -f $LOOP_IMG >$seqres.full
> > >  # Extend by just 8K, expected to start with the last full-size AG ends of
> > >  # above 1G block device.
> > >  $XFS_IO_PROG -f -c "truncate 1073750016" $LOOP_IMG
> > > -_mount -oloop $LOOP_IMG $LOOP_MNT
> > > +
> > > +loop_dev=$(_create_loop_device $LOOP_IMG)
> > > +_mount $loop_dev $LOOP_MNT
> > >  # A known bug shows "XFS_IOC_FSGROWFSDATA xfsctl failed: No space left on
> > >  # device" at here, refer to _fixed_by_kernel_commit above
> > >  $XFS_GROWFS_PROG $LOOP_MNT >$seqres.full
> > > @@ -48,6 +48,10 @@ if [ $? -ne 0 ];then
> > >  	echo "xfs_growfs fails!"
> > >  fi
> > >  
> > > +_unmount $LOOP_MNT
> > > +_destroy_loop_device $loop_dev
> > > +unset loop_dev
> > > +
> > >  echo "Silence is golden"
> > >  # success, all done
> > >  status=0
> > > diff --git a/tests/xfs/613 b/tests/xfs/613
> > > index 6ba3d87bf..b87cae91e 100755
> > > --- a/tests/xfs/613
> > > +++ b/tests/xfs/613
> > > @@ -15,14 +15,8 @@ _cleanup()
> > >  	cd /
> > >  	rm -f $tmp.*
> > >  	_unmount $LOOP_MNT 2>/dev/null
> > > -	if [ -n "$LOOP_DEV" ];then
> > > -		_destroy_loop_device $LOOP_DEV 2>/dev/null
> > > -	fi
> > > -	if [ -n "$LOOP_SPARE_DEV" ];then
> > > -		_destroy_loop_device $LOOP_SPARE_DEV 2>/dev/null
> > > -	fi
> > > +	[ -n $loop_dev ] &&_destroy_loop_device $loop_dev
> > >  	rm -f $LOOP_IMG
> > > -	rm -f $LOOP_SPARE_IMG
> > >  	rmdir $LOOP_MNT
> > >  }
> > >  
> > > @@ -38,16 +32,11 @@ _require_loop
> > >  _require_xfs_io_command "falloc"
> > >  
> > >  LOOP_IMG=$TEST_DIR/$seq.dev
> > > -LOOP_SPARE_IMG=$TEST_DIR/$seq.logdev
> > >  LOOP_MNT=$TEST_DIR/$seq.mnt
> > >  
> > >  echo "** create loop device"
> > >  $XFS_IO_PROG -f -c "truncate 32g" $LOOP_IMG
> > > -LOOP_DEV=`_create_loop_device $LOOP_IMG`
> > > -
> > > -echo "** create loop log device"
> > > -$XFS_IO_PROG -f -c "truncate 1g" $LOOP_SPARE_IMG
> > > -LOOP_SPARE_DEV=`_create_loop_device $LOOP_SPARE_IMG`
> > > +loop_dev=`_create_loop_device $LOOP_IMG`
> > >  
> > >  echo "** create loop mount point"
> > >  rmdir $LOOP_MNT 2>/dev/null
> > > @@ -56,8 +45,7 @@ mkdir -p $LOOP_MNT || _fail "cannot create loopback mount point"
> > >  filter_loop()
> > >  {
> > >  	sed -e "s,\B$LOOP_MNT,LOOP_MNT,g" \
> > > -	    -e "s,\B$LOOP_DEV,LOOP_DEV,g" \
> > > -	    -e "s,\B$LOOP_SPARE_DEV,LOOP_SPARE_DEV,g"
> > > +	    -e "s,\B$loop_dev,LOOP_DEV,g"
> > >  }
> > >  
> > >  filter_xfs_opt()
> > > @@ -70,22 +58,22 @@ MKFS_OPTIONS=""
> > >  do_mkfs()
> > >  {
> > >  	echo "FORMAT: $@" | filter_loop | tee -a $seqres.full
> > > -	$MKFS_XFS_PROG -f $* $LOOP_DEV | _filter_mkfs >>$seqres.full 2>$tmp.mkfs
> > > +	$MKFS_XFS_PROG -f $* $loop_dev | _filter_mkfs >>$seqres.full 2>$tmp.mkfs
> > >  	if [ "${PIPESTATUS[0]}" -ne 0 ]; then
> > > -		_fail "Fails on _mkfs_dev $* $LOOP_DEV"
> > > +		_fail "Fails on _mkfs_dev $* $loop_dev"
> > >  	fi
> > >  	. $tmp.mkfs
> > >  }
> > >  
> > >  is_dev_mounted()
> > >  {
> > > -	findmnt --source $LOOP_DEV >/dev/null
> > > +	findmnt --source $loop_dev >/dev/null
> > >  	return $?
> > >  }
> > >  
> > >  get_mount_info()
> > >  {
> > > -	findmnt --source $LOOP_DEV -o OPTIONS -n
> > > +	findmnt --source $loop_dev -o OPTIONS -n
> > >  }
> > >  
> > >  force_unmount()
> > > @@ -104,29 +92,29 @@ _do_test()
> > >  	local info
> > >  
> > >  	# mount test
> > > -	_mount $LOOP_DEV $LOOP_MNT $opts 2>>$seqres.full
> > > +	_mount $loop_dev $LOOP_MNT $opts 2>>$seqres.full
> > >  	rc=$?
> > >  	if [ $rc -eq 0 ];then
> > >  		if [ "${mounted}" = "fail" ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: expect mount to fail, but it succeeded"
> > >  			return 1
> > >  		fi
> > >  		is_dev_mounted
> > >  		if [ $? -ne 0 ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: fs not mounted even mount return 0"
> > >  			return 1
> > >  		fi
> > >  	else
> > >  		if [ "${mounted}" = "pass" ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: expect mount to succeed, but it failed"
> > >  			return 1
> > >  		fi
> > >  		is_dev_mounted
> > >  		if [ $? -eq 0 ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: fs is mounted even mount return non-zero"
> > >  			return 1
> > >  		fi
> > > @@ -142,13 +130,13 @@ _do_test()
> > >  	rc=$?
> > >  	if [ $rc -eq 0 ];then
> > >  		if [ "$found" != "true" ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: expected to find \"$key\" in mount info \"$info\""
> > >  			return 1
> > >  		fi
> > >  	else
> > >  		if [ "$found" != "false" ];then
> > > -			echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
> > > +			echo "[FAILED]: mount $loop_dev $LOOP_MNT $opts"
> > >  			echo "ERROR: did not expect to find \"$key\" in \"$info\""
> > >  			return 1
> > >  		fi
> > > diff --git a/tests/xfs/613.out b/tests/xfs/613.out
> > > index 1624617ee..2a693c53c 100644
> > > --- a/tests/xfs/613.out
> > > +++ b/tests/xfs/613.out
> > > @@ -1,6 +1,5 @@
> > >  QA output created by 613
> > >  ** create loop device
> > > -** create loop log device
> > >  ** create loop mount point
> > >  ** start xfs mount testing ...
> > >  FORMAT: -m crc=0
> > > -- 
> > > 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