fstests: verify that xfs_growfs can operate on mounted device node
diff mbox series

Message ID 1253fd24-a0ef-26ca-6ff9-b3b7a451e78a@redhat.com
State New
Headers show
Series
  • fstests: verify that xfs_growfs can operate on mounted device node
Related show

Commit Message

Eric Sandeen Oct. 29, 2019, 5:53 p.m. UTC
The ability to use a mounted device node as the primary argument
to xfs_growfs will be added back in, because it was an undocumented
behavior that some userspace depended on.  This test exercises that
functionality.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

Comments

Eryu Guan Nov. 3, 2019, 3:24 p.m. UTC | #1
On Tue, Oct 29, 2019 at 12:53:48PM -0500, Eric Sandeen wrote:
> The ability to use a mounted device node as the primary argument
> to xfs_growfs will be added back in, because it was an undocumented
> behavior that some userspace depended on.  This test exercises that
> functionality.
> 
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
> 
> diff --git a/tests/xfs/148 b/tests/xfs/148
> new file mode 100755
> index 00000000..357ae01c
> --- /dev/null
> +++ b/tests/xfs/148
> @@ -0,0 +1,100 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2019 Red Hat, Inc.  All Rights Reserved.
> +#
> +# FS QA Test 148
> +#
> +# Test to ensure xfs_growfs command accepts device nodes if & only
> +# if they are mounted.
> +# This functionality, though undocumented, worked until xfsprogs v4.12
> +# It was added back and documented after xfsprogs v5.2

I'm testing with xfsprogs from for-next branch, which is v5.3.0-rc1
based xfs_growfs, but I still see failures like

     === xfs_growfs - check device node ===
    +xfs_growfs: /dev/loop0 is not a mounted XFS filesystem
     === xfs_growfs - check device symlink ===
    +xfs_growfs: /mnt/test/loop_symlink.21781 is not a mounted XFS filesystem
     === unmount ===

If it's already fixed, would you please list the related commits in
commit log as well?

> +#
> +# Based on xfs/289
> +#
> +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()
> +{
> +    $UMOUNT_PROG $mntdir
> +    _destroy_loop_device $loop_dev
> +    rmdir $mntdir
> +    rm -f $loop_symlink
> +    rm -f $loopfile
> +}

'mntdir', 'loop_symlink' and 'loopfile' should be defined before
_cleanup, otherwise if we exit early, e.g. due to unmet requirement,
we'll see false failures.

And should check if 'loop_dev' is defined before destroy it.

> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +# Modify as appropriate.
> +_supported_fs xfs
> +_supported_os Linux
> +_require_test
> +_require_loop
> +
> +loopfile=$TEST_DIR/fsfile
> +mntdir=$TEST_DIR/mntdir
> +loop_symlink=$TEST_DIR/loop_symlink.$$
> +
> +mkdir -p $mntdir || _fail "!!! failed to create temp mount dir"
> +
> +echo "=== mkfs.xfs ==="
> +$MKFS_XFS_PROG -d file,name=$loopfile,size=16m -f >/dev/null 2>&1
> +
> +echo "=== truncate ==="
> +$XFS_IO_PROG -fc "truncate 256m" $loopfile
> +
> +echo "=== create loop device ==="
> +loop_dev=$(_create_loop_device $loopfile)
> +
> +echo "=== create loop device symlink ==="
> +ln -s $loop_dev $loop_symlink
> +
> +echo "loop device is $loop_dev"

This should be redirected to $seqres.full, as $loop_dev could be any
loop device.

> +
> +# These unmounted operations should fail
> +
> +echo "=== xfs_growfs - unmounted device, command should be rejected ==="
> +$XFS_GROWFS_PROG $loop_dev 2>&1 | sed -e s:$loop_dev:LOOPDEV:
> +
> +echo "=== xfs_growfs - check symlinked dev, unmounted ==="
> +$XFS_GROWFS_PROG $loop_symlink 2>&1 | sed -e s:$loop_symlink:LOOPSYMLINK:
> +
> +# These mounted operations should pass
> +
> +echo "=== mount ==="
> +$MOUNT_PROG $loop_dev $mntdir || _fail "!!! failed to loopback mount"
> +
> +echo "=== xfs_growfs - check device node ==="
> +$XFS_GROWFS_PROG -D 8192 $loop_dev > /dev/null
> +
> +echo "=== xfs_growfs - check device symlink ==="
> +$XFS_GROWFS_PROG -D 12288 $loop_symlink > /dev/null
> +
> +echo "=== unmount ==="
> +$UMOUNT_PROG $mntdir || _fail "!!! failed to unmount"
> +
> +echo "=== mount device symlink ==="
> +$MOUNT_PROG $loop_symlink $mntdir || _fail "!!! failed to loopback mount"
> +
> +echo "=== xfs_growfs - check device symlink ==="
> +$XFS_GROWFS_PROG -D 16384 $loop_symlink > /dev/null
> +
> +echo "=== xfs_growfs - check device node ==="
> +$XFS_GROWFS_PROG -D 20480 $loop_dev > /dev/null
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/148.out b/tests/xfs/148.out
> new file mode 100644
> index 00000000..d8e6f02d
> --- /dev/null
> +++ b/tests/xfs/148.out
> @@ -0,0 +1,17 @@
> +QA output created by 148
> +=== mkfs.xfs ===
> +=== truncate ===
> +=== create loop device ===
> +=== create loop device symlink ===
> +loop device is /dev/loop0

So this line should be removed as well.

Thanks,
Eryu

> +=== xfs_growfs - unmounted device, command should be rejected ===
> +xfs_growfs: LOOPDEV is not a mounted XFS filesystem
> +=== xfs_growfs - check symlinked dev, unmounted ===
> +xfs_growfs: LOOPSYMLINK is not a mounted XFS filesystem
> +=== mount ===
> +=== xfs_growfs - check device node ===
> +=== xfs_growfs - check device symlink ===
> +=== unmount ===
> +=== mount device symlink ===
> +=== xfs_growfs - check device symlink ===
> +=== xfs_growfs - check device node ===
> diff --git a/tests/xfs/group b/tests/xfs/group
> index f4ebcd8c..40a61b55 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -145,6 +145,7 @@
>  145 dmapi
>  146 dmapi
>  147 dmapi
> +148 quick auto growfs
>  150 dmapi
>  151 dmapi
>  152 dmapi
>
Eric Sandeen Nov. 4, 2019, 1:49 a.m. UTC | #2
On 11/3/19 9:24 AM, Eryu Guan wrote:
> On Tue, Oct 29, 2019 at 12:53:48PM -0500, Eric Sandeen wrote:
>> The ability to use a mounted device node as the primary argument
>> to xfs_growfs will be added back in, because it was an undocumented
>> behavior that some userspace depended on.  This test exercises that
>> functionality.
>>
>> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
>> ---
>>
>> diff --git a/tests/xfs/148 b/tests/xfs/148
>> new file mode 100755
>> index 00000000..357ae01c
>> --- /dev/null
>> +++ b/tests/xfs/148
>> @@ -0,0 +1,100 @@
>> +#! /bin/bash
>> +# SPDX-License-Identifier: GPL-2.0
>> +# Copyright (c) 2019 Red Hat, Inc.  All Rights Reserved.
>> +#
>> +# FS QA Test 148
>> +#
>> +# Test to ensure xfs_growfs command accepts device nodes if & only
>> +# if they are mounted.
>> +# This functionality, though undocumented, worked until xfsprogs v4.12
>> +# It was added back and documented after xfsprogs v5.2
> 
> I'm testing with xfsprogs from for-next branch, which is v5.3.0-rc1
> based xfs_growfs, but I still see failures like
> 
>      === xfs_growfs - check device node ===
>     +xfs_growfs: /dev/loop0 is not a mounted XFS filesystem
>      === xfs_growfs - check device symlink ===
>     +xfs_growfs: /mnt/test/loop_symlink.21781 is not a mounted XFS filesystem
>      === unmount ===
> 
> If it's already fixed, would you please list the related commits in
> commit log as well?

I haven't merged the fix yet.

If you like I can resend the test when it's merged.
Eryu Guan Nov. 4, 2019, 3:29 p.m. UTC | #3
On Sun, Nov 03, 2019 at 07:49:39PM -0600, Eric Sandeen wrote:
> On 11/3/19 9:24 AM, Eryu Guan wrote:
> > On Tue, Oct 29, 2019 at 12:53:48PM -0500, Eric Sandeen wrote:
> >> The ability to use a mounted device node as the primary argument
> >> to xfs_growfs will be added back in, because it was an undocumented
> >> behavior that some userspace depended on.  This test exercises that
> >> functionality.
> >>
> >> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> >> ---
> >>
> >> diff --git a/tests/xfs/148 b/tests/xfs/148
> >> new file mode 100755
> >> index 00000000..357ae01c
> >> --- /dev/null
> >> +++ b/tests/xfs/148
> >> @@ -0,0 +1,100 @@
> >> +#! /bin/bash
> >> +# SPDX-License-Identifier: GPL-2.0
> >> +# Copyright (c) 2019 Red Hat, Inc.  All Rights Reserved.
> >> +#
> >> +# FS QA Test 148
> >> +#
> >> +# Test to ensure xfs_growfs command accepts device nodes if & only
> >> +# if they are mounted.
> >> +# This functionality, though undocumented, worked until xfsprogs v4.12
> >> +# It was added back and documented after xfsprogs v5.2
> > 
> > I'm testing with xfsprogs from for-next branch, which is v5.3.0-rc1
> > based xfs_growfs, but I still see failures like
> > 
> >      === xfs_growfs - check device node ===
> >     +xfs_growfs: /dev/loop0 is not a mounted XFS filesystem
> >      === xfs_growfs - check device symlink ===
> >     +xfs_growfs: /mnt/test/loop_symlink.21781 is not a mounted XFS filesystem
> >      === unmount ===
> > 
> > If it's already fixed, would you please list the related commits in
> > commit log as well?
> 
> I haven't merged the fix yet.

Ah, that explains. I saw "It was added back and documented after
xfsprogs v5.2", so I expected it to be PASS when testing with v5.3-rc1.

> 
> If you like I can resend the test when it's merged.
> 

Either way is fine, as long as the fix is referenced somewhere (either
in commit log or in test description, and refer to the patch summary if
it's not merged yet).

Thanks,
Eryu

Patch
diff mbox series

diff --git a/tests/xfs/148 b/tests/xfs/148
new file mode 100755
index 00000000..357ae01c
--- /dev/null
+++ b/tests/xfs/148
@@ -0,0 +1,100 @@ 
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2019 Red Hat, Inc.  All Rights Reserved.
+#
+# FS QA Test 148
+#
+# Test to ensure xfs_growfs command accepts device nodes if & only
+# if they are mounted.
+# This functionality, though undocumented, worked until xfsprogs v4.12
+# It was added back and documented after xfsprogs v5.2
+#
+# Based on xfs/289
+#
+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()
+{
+    $UMOUNT_PROG $mntdir
+    _destroy_loop_device $loop_dev
+    rmdir $mntdir
+    rm -f $loop_symlink
+    rm -f $loopfile
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs xfs
+_supported_os Linux
+_require_test
+_require_loop
+
+loopfile=$TEST_DIR/fsfile
+mntdir=$TEST_DIR/mntdir
+loop_symlink=$TEST_DIR/loop_symlink.$$
+
+mkdir -p $mntdir || _fail "!!! failed to create temp mount dir"
+
+echo "=== mkfs.xfs ==="
+$MKFS_XFS_PROG -d file,name=$loopfile,size=16m -f >/dev/null 2>&1
+
+echo "=== truncate ==="
+$XFS_IO_PROG -fc "truncate 256m" $loopfile
+
+echo "=== create loop device ==="
+loop_dev=$(_create_loop_device $loopfile)
+
+echo "=== create loop device symlink ==="
+ln -s $loop_dev $loop_symlink
+
+echo "loop device is $loop_dev"
+
+# These unmounted operations should fail
+
+echo "=== xfs_growfs - unmounted device, command should be rejected ==="
+$XFS_GROWFS_PROG $loop_dev 2>&1 | sed -e s:$loop_dev:LOOPDEV:
+
+echo "=== xfs_growfs - check symlinked dev, unmounted ==="
+$XFS_GROWFS_PROG $loop_symlink 2>&1 | sed -e s:$loop_symlink:LOOPSYMLINK:
+
+# These mounted operations should pass
+
+echo "=== mount ==="
+$MOUNT_PROG $loop_dev $mntdir || _fail "!!! failed to loopback mount"
+
+echo "=== xfs_growfs - check device node ==="
+$XFS_GROWFS_PROG -D 8192 $loop_dev > /dev/null
+
+echo "=== xfs_growfs - check device symlink ==="
+$XFS_GROWFS_PROG -D 12288 $loop_symlink > /dev/null
+
+echo "=== unmount ==="
+$UMOUNT_PROG $mntdir || _fail "!!! failed to unmount"
+
+echo "=== mount device symlink ==="
+$MOUNT_PROG $loop_symlink $mntdir || _fail "!!! failed to loopback mount"
+
+echo "=== xfs_growfs - check device symlink ==="
+$XFS_GROWFS_PROG -D 16384 $loop_symlink > /dev/null
+
+echo "=== xfs_growfs - check device node ==="
+$XFS_GROWFS_PROG -D 20480 $loop_dev > /dev/null
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/148.out b/tests/xfs/148.out
new file mode 100644
index 00000000..d8e6f02d
--- /dev/null
+++ b/tests/xfs/148.out
@@ -0,0 +1,17 @@ 
+QA output created by 148
+=== mkfs.xfs ===
+=== truncate ===
+=== create loop device ===
+=== create loop device symlink ===
+loop device is /dev/loop0
+=== xfs_growfs - unmounted device, command should be rejected ===
+xfs_growfs: LOOPDEV is not a mounted XFS filesystem
+=== xfs_growfs - check symlinked dev, unmounted ===
+xfs_growfs: LOOPSYMLINK is not a mounted XFS filesystem
+=== mount ===
+=== xfs_growfs - check device node ===
+=== xfs_growfs - check device symlink ===
+=== unmount ===
+=== mount device symlink ===
+=== xfs_growfs - check device symlink ===
+=== xfs_growfs - check device node ===
diff --git a/tests/xfs/group b/tests/xfs/group
index f4ebcd8c..40a61b55 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -145,6 +145,7 @@ 
 145 dmapi
 146 dmapi
 147 dmapi
+148 quick auto growfs
 150 dmapi
 151 dmapi
 152 dmapi