diff mbox

fstests: test platform_check_ismounted do its work

Message ID 1473840129-19203-1-git-send-email-zlang@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Zorro Lang Sept. 14, 2016, 8:02 a.m. UTC
There's a bug, the ustat() sysetm call is not implemented on someone
arch, but xfsprogs uses this to detect whether a filesystem is
mounted in platform_check_ismounted() function.

If ustat() is not implemented, platform_check_ismounted() return
"isn't mounted" if a filesystem is mounted, that's a big problem, it
will cause corruption.

Signed-off-by: Zorro Lang <zlang@redhat.com>
---
 tests/xfs/284     | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/284.out |   8 ++++
 tests/xfs/group   |   1 +
 3 files changed, 122 insertions(+)
 create mode 100755 tests/xfs/284
 create mode 100644 tests/xfs/284.out

Comments

Eryu Guan Sept. 14, 2016, 9:24 a.m. UTC | #1
On Wed, Sep 14, 2016 at 04:02:09PM +0800, Zorro Lang wrote:
> There's a bug, the ustat() sysetm call is not implemented on someone
> arch, but xfsprogs uses this to detect whether a filesystem is
> mounted in platform_check_ismounted() function.
> 
> If ustat() is not implemented, platform_check_ismounted() return
> "isn't mounted" if a filesystem is mounted, that's a big problem, it
> will cause corruption.
> 
> Signed-off-by: Zorro Lang <zlang@redhat.com>
> ---
>  tests/xfs/284     | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/284.out |   8 ++++
>  tests/xfs/group   |   1 +
>  3 files changed, 122 insertions(+)
>  create mode 100755 tests/xfs/284
>  create mode 100644 tests/xfs/284.out
> 
> diff --git a/tests/xfs/284 b/tests/xfs/284
> new file mode 100755
> index 0000000..53fbcb1
> --- /dev/null
> +++ b/tests/xfs/284
> @@ -0,0 +1,113 @@
> +#! /bin/bash
> +# FS QA Test 284
> +#
> +# Make sure platform_check_ismounted() do its work. A bug cause
> +# platform_check_ismounted return "isn't mounted" status, even if
> +# the filesystem is mounted. That maybe cause corruption, so must
> +# make sure this function always do its work.
> +#
> +#-----------------------------------------------------------------------
> +# Copyright (c) 2016 Red Hat.  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 /
> +	rm -f $tmp.*
> +	rm -f $METADUMP_FILE 2>/dev/null
> +	rm -f $COPY_FILE 2>/dev/null
> +}
> +
> +# 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
> +_supported_fs xfs
> +_supported_os Linux
> +_require_test
> +_require_scratch
> +
> +function filter_mounted()
> +{
> +	grep "mounted" | _filter_scratch | head -1
> +}
> +
> +METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> +COPY_FILE="${TEST_DIR}/${seq}_copyfile"
> +
> +# Test dump a mounted device
> +_scratch_mount
> +_scratch_metadump $METADUMP_FILE 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test dump a mounted device [Failed]"

I don't think these status checks are needed, because if these
metadump/copy/repair/mkfs commands proceed on mounted fs, the golden
image will be broken.

> +_scratch_unmount
> +
> +# Test restore a mounted device

"restore to a mounted device"

> +_scratch_metadump $METADUMP_FILE
> +_scratch_mount
> +xfs_mdrestore $METADUMP_FILE $SCRATCH_DEV 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test restore a mounted device [Failed]"
> +_scratch_unmount
> +
> +# Test xfs_copy to a mounted device
> +# If source is mounted, xfs_copy will print a warning, but still
> +# keep on copying. If target is mounted, xfs_copy will failed.
> +$XFS_COPY_PROG $SCRATCH_DEV $COPY_FILE >/dev/null
> +_scratch_mount
> +$XFS_COPY_PROG $COPY_FILE $SCRATCH_DEV 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test xfs_copy to a mounted device [Failed]"
> +_scratch_unmount
> +
> +# Test xfs_db a mounted device without readonly (-r) option
> +_scratch_mount
> +$XFS_DB_PROG -c sb $SCRATCH_DEV 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] &&
> +	echo "Test xfs_db a mounted device(without -r option) [Failed]"
> +_scratch_unmount
> +
> +# Test mkfs.xfs a mounted device
> +# Generally mkfs will report device is mounted, but if it can't find
> +# device is mounted, it'll report device busy.
> +_scratch_mount
> +_scratch_mkfs 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test mkfs.xfs a mounted device [Failed]"
> +_scratch_unmount
> +
> +# Test xfs_repair (with/without modify flag) a mounted device
> +_scratch_mount
> +_scratch_xfs_repair -n 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] &&
> +	echo "Test xfs_repair -n a mounted devie [Failed]"
> +_scratch_xfs_repair 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test xfs_repair a mounted devie [Failed]"
> +_scratch_unmount
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/284.out b/tests/xfs/284.out
> new file mode 100644
> index 0000000..302d75e
> --- /dev/null
> +++ b/tests/xfs/284.out
> @@ -0,0 +1,8 @@
> +QA output created by 284
> +xfs_metadump: SCRATCH_DEV contains a mounted and writable filesystem
> +xfs_mdrestore: a filesystem is mounted on target device "SCRATCH_DEV", cannot restore to a mounted filesystem.
> +xfs_copy:  a filesystem is mounted on target device "SCRATCH_DEV".
> +xfs_db: SCRATCH_DEV contains a mounted filesystem
> +mkfs.xfs: SCRATCH_DEV contains a mounted filesystem
> +xfs_repair: SCRATCH_DEV contains a mounted and writable filesystem
> +xfs_repair: SCRATCH_DEV contains a mounted filesystem
> diff --git a/tests/xfs/group b/tests/xfs/group
> index baa0ff6..0ac4bd5 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -281,6 +281,7 @@
>  281 dump ioctl auto quick
>  282 dump ioctl auto quick
>  283 dump ioctl auto quick
> +284 auto quick mount

I'm not sure if this belongs to 'mount' group, it does test against
mounted device, not actually test mount.

But perhaps we can add 'dump' 'copy' 'mkfs' 'db' 'repair' groups?

Thanks,
Eryu

>  287 auto dump quota quick
>  290 auto rw prealloc quick ioctl zero
>  291 auto repair
> -- 
> 2.7.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe fstests" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Zorro Lang Sept. 14, 2016, 1:14 p.m. UTC | #2
On Wed, Sep 14, 2016 at 05:24:00PM +0800, Eryu Guan wrote:
> On Wed, Sep 14, 2016 at 04:02:09PM +0800, Zorro Lang wrote:
> > There's a bug, the ustat() sysetm call is not implemented on someone
> > arch, but xfsprogs uses this to detect whether a filesystem is
> > mounted in platform_check_ismounted() function.
> > 
> > If ustat() is not implemented, platform_check_ismounted() return
> > "isn't mounted" if a filesystem is mounted, that's a big problem, it
> > will cause corruption.
> > 
> > Signed-off-by: Zorro Lang <zlang@redhat.com>
> > ---
> >  tests/xfs/284     | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  tests/xfs/284.out |   8 ++++
> >  tests/xfs/group   |   1 +
> >  3 files changed, 122 insertions(+)
> >  create mode 100755 tests/xfs/284
> >  create mode 100644 tests/xfs/284.out
> > 
> > diff --git a/tests/xfs/284 b/tests/xfs/284
> > new file mode 100755
> > index 0000000..53fbcb1
> > --- /dev/null
> > +++ b/tests/xfs/284
> > @@ -0,0 +1,113 @@
> > +#! /bin/bash
> > +# FS QA Test 284
> > +#
> > +# Make sure platform_check_ismounted() do its work. A bug cause
> > +# platform_check_ismounted return "isn't mounted" status, even if
> > +# the filesystem is mounted. That maybe cause corruption, so must
> > +# make sure this function always do its work.
> > +#
> > +#-----------------------------------------------------------------------
> > +# Copyright (c) 2016 Red Hat.  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 /
> > +	rm -f $tmp.*
> > +	rm -f $METADUMP_FILE 2>/dev/null
> > +	rm -f $COPY_FILE 2>/dev/null
> > +}
> > +
> > +# 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
> > +_supported_fs xfs
> > +_supported_os Linux
> > +_require_test
> > +_require_scratch
> > +
> > +function filter_mounted()
> > +{
> > +	grep "mounted" | _filter_scratch | head -1
> > +}
> > +
> > +METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> > +COPY_FILE="${TEST_DIR}/${seq}_copyfile"
> > +
> > +# Test dump a mounted device
> > +_scratch_mount
> > +_scratch_metadump $METADUMP_FILE 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test dump a mounted device [Failed]"
> 
> I don't think these status checks are needed, because if these
> metadump/copy/repair/mkfs commands proceed on mounted fs, the golden
> image will be broken.

Originally I want to check the return status, and print the output to
$seq.full. Because the output can prove platform_check_ismounted() finds
the fs is mounted, the return value can prove these operations didn't break
a mounted fs and return pass. (Maybe it do_log() some messages, but
forgot to exit non-zero :-P. OK, maybe I thought too much:)

Then I found some operations still can return non-zero even if
platform_check_ismounted() return a wrong value (e.g: mkfs.xfs). So
I decided to check the output with the return value together.

So if it's OK to check both of output and return, I hope to retain them.
Or I hope to check return value, and print the output to $seq.full.

> 
> > +_scratch_unmount
> > +
> > +# Test restore a mounted device
> 
> "restore to a mounted device"

Sure.

> 
> > +_scratch_metadump $METADUMP_FILE
> > +_scratch_mount
> > +xfs_mdrestore $METADUMP_FILE $SCRATCH_DEV 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test restore a mounted device [Failed]"
> > +_scratch_unmount
> > +
> > +# Test xfs_copy to a mounted device
> > +# If source is mounted, xfs_copy will print a warning, but still
> > +# keep on copying. If target is mounted, xfs_copy will failed.
> > +$XFS_COPY_PROG $SCRATCH_DEV $COPY_FILE >/dev/null
> > +_scratch_mount
> > +$XFS_COPY_PROG $COPY_FILE $SCRATCH_DEV 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test xfs_copy to a mounted device [Failed]"
> > +_scratch_unmount
> > +
> > +# Test xfs_db a mounted device without readonly (-r) option
> > +_scratch_mount
> > +$XFS_DB_PROG -c sb $SCRATCH_DEV 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] &&
> > +	echo "Test xfs_db a mounted device(without -r option) [Failed]"
> > +_scratch_unmount
> > +
> > +# Test mkfs.xfs a mounted device
> > +# Generally mkfs will report device is mounted, but if it can't find
> > +# device is mounted, it'll report device busy.
> > +_scratch_mount
> > +_scratch_mkfs 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test mkfs.xfs a mounted device [Failed]"
> > +_scratch_unmount
> > +
> > +# Test xfs_repair (with/without modify flag) a mounted device
> > +_scratch_mount
> > +_scratch_xfs_repair -n 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] &&
> > +	echo "Test xfs_repair -n a mounted devie [Failed]"
> > +_scratch_xfs_repair 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test xfs_repair a mounted devie [Failed]"
> > +_scratch_unmount
> > +
> > +# success, all done
> > +status=0
> > +exit
> > diff --git a/tests/xfs/284.out b/tests/xfs/284.out
> > new file mode 100644
> > index 0000000..302d75e
> > --- /dev/null
> > +++ b/tests/xfs/284.out
> > @@ -0,0 +1,8 @@
> > +QA output created by 284
> > +xfs_metadump: SCRATCH_DEV contains a mounted and writable filesystem
> > +xfs_mdrestore: a filesystem is mounted on target device "SCRATCH_DEV", cannot restore to a mounted filesystem.
> > +xfs_copy:  a filesystem is mounted on target device "SCRATCH_DEV".
> > +xfs_db: SCRATCH_DEV contains a mounted filesystem
> > +mkfs.xfs: SCRATCH_DEV contains a mounted filesystem
> > +xfs_repair: SCRATCH_DEV contains a mounted and writable filesystem
> > +xfs_repair: SCRATCH_DEV contains a mounted filesystem
> > diff --git a/tests/xfs/group b/tests/xfs/group
> > index baa0ff6..0ac4bd5 100644
> > --- a/tests/xfs/group
> > +++ b/tests/xfs/group
> > @@ -281,6 +281,7 @@
> >  281 dump ioctl auto quick
> >  282 dump ioctl auto quick
> >  283 dump ioctl auto quick
> > +284 auto quick mount
> 
> I'm not sure if this belongs to 'mount' group, it does test against
> mounted device, not actually test mount.
> 
> But perhaps we can add 'dump' 'copy' 'mkfs' 'db' 'repair' groups?

Hmm... sure, add them is ok for me:)

> 
> Thanks,
> Eryu
> 
> >  287 auto dump quota quick
> >  290 auto rw prealloc quick ioctl zero
> >  291 auto repair
> > -- 
> > 2.7.4
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe fstests" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eric Sandeen Sept. 14, 2016, 2:13 p.m. UTC | #3
On 9/14/16 3:02 AM, Zorro Lang wrote:
> There's a bug, the ustat() sysetm call is not implemented on someone
> arch, but xfsprogs uses this to detect whether a filesystem is
> mounted in platform_check_ismounted() function.
> 
> If ustat() is not implemented, platform_check_ismounted() return
> "isn't mounted" if a filesystem is mounted, that's a big problem, it
> will cause corruption.
> 
> Signed-off-by: Zorro Lang <zlang@redhat.com>
> ---
>  tests/xfs/284     | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/284.out |   8 ++++
>  tests/xfs/group   |   1 +
>  3 files changed, 122 insertions(+)
>  create mode 100755 tests/xfs/284
>  create mode 100644 tests/xfs/284.out
> 
> diff --git a/tests/xfs/284 b/tests/xfs/284
> new file mode 100755
> index 0000000..53fbcb1
> --- /dev/null
> +++ b/tests/xfs/284
> @@ -0,0 +1,113 @@
> +#! /bin/bash
> +# FS QA Test 284
> +#
> +# Make sure platform_check_ismounted() do its work. A bug cause
> +# platform_check_ismounted return "isn't mounted" status, even if
> +# the filesystem is mounted. That maybe cause corruption, so must
> +# make sure this function always do its work.
> +#
> +#-----------------------------------------------------------------------
> +# Copyright (c) 2016 Red Hat.  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 /
> +	rm -f $tmp.*
> +	rm -f $METADUMP_FILE 2>/dev/null
> +	rm -f $COPY_FILE 2>/dev/null
> +}
> +
> +# 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
> +_supported_fs xfs
> +_supported_os Linux
> +_require_test
> +_require_scratch
> +
> +function filter_mounted()
> +{
> +	grep "mounted" | _filter_scratch | head -1
> +}
> +
> +METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> +COPY_FILE="${TEST_DIR}/${seq}_copyfile"
> +
> +# Test dump a mounted device

comments bout what this should do, what is expected, and why might
be good, i.e.:

# xfs_metadump should refuse to dump a mounted device.

(I find bash test scripts to be very hard to debug years after they
are written; IMHO the more comments, the better) :)

> +_scratch_mount
> +_scratch_metadump $METADUMP_FILE 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test dump a mounted device [Failed]"
> +_scratch_unmount
> +
> +# Test restore a mounted device

# Test restore to a mounted device
# xfs_mdrestore should refuse to restore to a mounted device.

It might be more clear to move the _scratch_unmount above to just before
the metadump, so it's very clear whether we're working on a mounted
or unmounted device, i.e. move it here:

  +_scratch_unmount
> +_scratch_metadump $METADUMP_FILE
> +_scratch_mount
> +xfs_mdrestore $METADUMP_FILE $SCRATCH_DEV 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test restore a mounted device [Failed]"
> +_scratch_unmount
> +
> +# Test xfs_copy to a mounted device
> +# If source is mounted, xfs_copy will print a warning, but still
> +# keep on copying. If target is mounted, xfs_copy will failed.

"xfs_copy should fail."

Same thing, maybe move the unmount:

  +_scratch_unmount
> +$XFS_COPY_PROG $SCRATCH_DEV $COPY_FILE >/dev/null
> +_scratch_mount
> +$XFS_COPY_PROG $COPY_FILE $SCRATCH_DEV 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test xfs_copy to a mounted device [Failed]"
> +_scratch_unmount
> +
> +# Test xfs_db a mounted device without readonly (-r) option

"should fail."

having the explicit _mount below seems good to me, it makes it clear.

> +_scratch_mount
> +$XFS_DB_PROG -c sb $SCRATCH_DEV 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] &&
> +	echo "Test xfs_db a mounted device(without -r option) [Failed]"
> +_scratch_unmount
> +
> +# Test mkfs.xfs a mounted device
> +# Generally mkfs will report device is mounted, but if it can't find
> +# device is mounted, it'll report device busy.
> +_scratch_mount
> +_scratch_mkfs 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test mkfs.xfs a mounted device [Failed]"
> +_scratch_unmount
> +
> +# Test xfs_repair (with/without modify flag) a mounted device

Again, maybe comments about what we really expect to see here?

> +_scratch_mount
> +_scratch_xfs_repair -n 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] &&
> +	echo "Test xfs_repair -n a mounted devie [Failed]"

s/devie/device/

> +_scratch_xfs_repair 2>&1 | filter_mounted
> +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test xfs_repair a mounted devie [Failed]"

s/devie/device/

Testing the "-d dangerous" option of repair would also be good.

-Eric

> +_scratch_unmount
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/284.out b/tests/xfs/284.out
> new file mode 100644
> index 0000000..302d75e
> --- /dev/null
> +++ b/tests/xfs/284.out
> @@ -0,0 +1,8 @@
> +QA output created by 284
> +xfs_metadump: SCRATCH_DEV contains a mounted and writable filesystem
> +xfs_mdrestore: a filesystem is mounted on target device "SCRATCH_DEV", cannot restore to a mounted filesystem.
> +xfs_copy:  a filesystem is mounted on target device "SCRATCH_DEV".
> +xfs_db: SCRATCH_DEV contains a mounted filesystem
> +mkfs.xfs: SCRATCH_DEV contains a mounted filesystem
> +xfs_repair: SCRATCH_DEV contains a mounted and writable filesystem
> +xfs_repair: SCRATCH_DEV contains a mounted filesystem
> diff --git a/tests/xfs/group b/tests/xfs/group
> index baa0ff6..0ac4bd5 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -281,6 +281,7 @@
>  281 dump ioctl auto quick
>  282 dump ioctl auto quick
>  283 dump ioctl auto quick
> +284 auto quick mount
>  287 auto dump quota quick
>  290 auto rw prealloc quick ioctl zero
>  291 auto repair
> 
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Zorro Lang Sept. 14, 2016, 3:11 p.m. UTC | #4
On Wed, Sep 14, 2016 at 09:13:32AM -0500, Eric Sandeen wrote:
> On 9/14/16 3:02 AM, Zorro Lang wrote:
> > There's a bug, the ustat() sysetm call is not implemented on someone
> > arch, but xfsprogs uses this to detect whether a filesystem is
> > mounted in platform_check_ismounted() function.
> > 
> > If ustat() is not implemented, platform_check_ismounted() return
> > "isn't mounted" if a filesystem is mounted, that's a big problem, it
> > will cause corruption.
> > 
> > Signed-off-by: Zorro Lang <zlang@redhat.com>
> > ---
> >  tests/xfs/284     | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  tests/xfs/284.out |   8 ++++
> >  tests/xfs/group   |   1 +
> >  3 files changed, 122 insertions(+)
> >  create mode 100755 tests/xfs/284
> >  create mode 100644 tests/xfs/284.out
> > 
> > diff --git a/tests/xfs/284 b/tests/xfs/284
> > new file mode 100755
> > index 0000000..53fbcb1
> > --- /dev/null
> > +++ b/tests/xfs/284
> > @@ -0,0 +1,113 @@
> > +#! /bin/bash
> > +# FS QA Test 284
> > +#
> > +# Make sure platform_check_ismounted() do its work. A bug cause
> > +# platform_check_ismounted return "isn't mounted" status, even if
> > +# the filesystem is mounted. That maybe cause corruption, so must
> > +# make sure this function always do its work.
> > +#
> > +#-----------------------------------------------------------------------
> > +# Copyright (c) 2016 Red Hat.  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 /
> > +	rm -f $tmp.*
> > +	rm -f $METADUMP_FILE 2>/dev/null
> > +	rm -f $COPY_FILE 2>/dev/null
> > +}
> > +
> > +# 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
> > +_supported_fs xfs
> > +_supported_os Linux
> > +_require_test
> > +_require_scratch
> > +
> > +function filter_mounted()
> > +{
> > +	grep "mounted" | _filter_scratch | head -1
> > +}
> > +
> > +METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> > +COPY_FILE="${TEST_DIR}/${seq}_copyfile"
> > +
> > +# Test dump a mounted device
> 
> comments bout what this should do, what is expected, and why might
> be good, i.e.:
> 
> # xfs_metadump should refuse to dump a mounted device.

Sure, I'll write more comments for every sub-tests.

> 
> (I find bash test scripts to be very hard to debug years after they
> are written; IMHO the more comments, the better) :)
> 
> > +_scratch_mount
> > +_scratch_metadump $METADUMP_FILE 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test dump a mounted device [Failed]"
> > +_scratch_unmount
> > +
> > +# Test restore a mounted device
> 
> # Test restore to a mounted device
> # xfs_mdrestore should refuse to restore to a mounted device.
> 
> It might be more clear to move the _scratch_unmount above to just before
> the metadump, so it's very clear whether we're working on a mounted
> or unmounted device, i.e. move it here:
> 
>   +_scratch_unmount

I just tried to make sure before every single sub-tests begin, the SCRATCH_DEV
is always unmounted by default, what do you think about that?

> > +_scratch_metadump $METADUMP_FILE
> > +_scratch_mount
> > +xfs_mdrestore $METADUMP_FILE $SCRATCH_DEV 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test restore a mounted device [Failed]"
> > +_scratch_unmount
> > +
> > +# Test xfs_copy to a mounted device
> > +# If source is mounted, xfs_copy will print a warning, but still
> > +# keep on copying. If target is mounted, xfs_copy will failed.
> 
> "xfs_copy should fail."
> 
> Same thing, maybe move the unmount:
> 
>   +_scratch_unmount
> > +$XFS_COPY_PROG $SCRATCH_DEV $COPY_FILE >/dev/null
> > +_scratch_mount
> > +$XFS_COPY_PROG $COPY_FILE $SCRATCH_DEV 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test xfs_copy to a mounted device [Failed]"
> > +_scratch_unmount
> > +
> > +# Test xfs_db a mounted device without readonly (-r) option
> 
> "should fail."
> 
> having the explicit _mount below seems good to me, it makes it clear.
> 
> > +_scratch_mount
> > +$XFS_DB_PROG -c sb $SCRATCH_DEV 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] &&
> > +	echo "Test xfs_db a mounted device(without -r option) [Failed]"
> > +_scratch_unmount
> > +
> > +# Test mkfs.xfs a mounted device
> > +# Generally mkfs will report device is mounted, but if it can't find
> > +# device is mounted, it'll report device busy.
> > +_scratch_mount
> > +_scratch_mkfs 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test mkfs.xfs a mounted device [Failed]"
> > +_scratch_unmount
> > +
> > +# Test xfs_repair (with/without modify flag) a mounted device
> 
> Again, maybe comments about what we really expect to see here?
> 
> > +_scratch_mount
> > +_scratch_xfs_repair -n 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] &&
> > +	echo "Test xfs_repair -n a mounted devie [Failed]"
> 
> s/devie/device/
> 
> > +_scratch_xfs_repair 2>&1 | filter_mounted
> > +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test xfs_repair a mounted devie [Failed]"
> 
> s/devie/device/
> 
> Testing the "-d dangerous" option of repair would also be good.

Hmm... I think this's used to test platform_check_iswritable(). I'm planning
to write another case to test platform_check_iswritable (I'm thinking about
how to write that:)

Thanks,
Zorro

> 
> -Eric
> 
> > +_scratch_unmount
> > +
> > +# success, all done
> > +status=0
> > +exit
> > diff --git a/tests/xfs/284.out b/tests/xfs/284.out
> > new file mode 100644
> > index 0000000..302d75e
> > --- /dev/null
> > +++ b/tests/xfs/284.out
> > @@ -0,0 +1,8 @@
> > +QA output created by 284
> > +xfs_metadump: SCRATCH_DEV contains a mounted and writable filesystem
> > +xfs_mdrestore: a filesystem is mounted on target device "SCRATCH_DEV", cannot restore to a mounted filesystem.
> > +xfs_copy:  a filesystem is mounted on target device "SCRATCH_DEV".
> > +xfs_db: SCRATCH_DEV contains a mounted filesystem
> > +mkfs.xfs: SCRATCH_DEV contains a mounted filesystem
> > +xfs_repair: SCRATCH_DEV contains a mounted and writable filesystem
> > +xfs_repair: SCRATCH_DEV contains a mounted filesystem
> > diff --git a/tests/xfs/group b/tests/xfs/group
> > index baa0ff6..0ac4bd5 100644
> > --- a/tests/xfs/group
> > +++ b/tests/xfs/group
> > @@ -281,6 +281,7 @@
> >  281 dump ioctl auto quick
> >  282 dump ioctl auto quick
> >  283 dump ioctl auto quick
> > +284 auto quick mount
> >  287 auto dump quota quick
> >  290 auto rw prealloc quick ioctl zero
> >  291 auto repair
> > 
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eric Sandeen Sept. 14, 2016, 3:15 p.m. UTC | #5
On 9/14/16 10:11 AM, Zorro Lang wrote:
> On Wed, Sep 14, 2016 at 09:13:32AM -0500, Eric Sandeen wrote:
>> On 9/14/16 3:02 AM, Zorro Lang wrote:
>>> There's a bug, the ustat() sysetm call is not implemented on someone
>>> arch, but xfsprogs uses this to detect whether a filesystem is
>>> mounted in platform_check_ismounted() function.
>>>
>>> If ustat() is not implemented, platform_check_ismounted() return
>>> "isn't mounted" if a filesystem is mounted, that's a big problem, it
>>> will cause corruption.
>>>
>>> Signed-off-by: Zorro Lang <zlang@redhat.com>
>>> ---
>>>  tests/xfs/284     | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>  tests/xfs/284.out |   8 ++++
>>>  tests/xfs/group   |   1 +
>>>  3 files changed, 122 insertions(+)
>>>  create mode 100755 tests/xfs/284
>>>  create mode 100644 tests/xfs/284.out
>>>
>>> diff --git a/tests/xfs/284 b/tests/xfs/284
>>> new file mode 100755
>>> index 0000000..53fbcb1
>>> --- /dev/null
>>> +++ b/tests/xfs/284
>>> @@ -0,0 +1,113 @@
>>> +#! /bin/bash
>>> +# FS QA Test 284
>>> +#
>>> +# Make sure platform_check_ismounted() do its work. A bug cause
>>> +# platform_check_ismounted return "isn't mounted" status, even if
>>> +# the filesystem is mounted. That maybe cause corruption, so must
>>> +# make sure this function always do its work.
>>> +#
>>> +#-----------------------------------------------------------------------
>>> +# Copyright (c) 2016 Red Hat.  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 /
>>> +	rm -f $tmp.*
>>> +	rm -f $METADUMP_FILE 2>/dev/null
>>> +	rm -f $COPY_FILE 2>/dev/null
>>> +}
>>> +
>>> +# 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
>>> +_supported_fs xfs
>>> +_supported_os Linux
>>> +_require_test
>>> +_require_scratch
>>> +
>>> +function filter_mounted()
>>> +{
>>> +	grep "mounted" | _filter_scratch | head -1
>>> +}
>>> +
>>> +METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
>>> +COPY_FILE="${TEST_DIR}/${seq}_copyfile"
>>> +
>>> +# Test dump a mounted device
>>
>> comments bout what this should do, what is expected, and why might
>> be good, i.e.:
>>
>> # xfs_metadump should refuse to dump a mounted device.
> 
> Sure, I'll write more comments for every sub-tests.
> 
>>
>> (I find bash test scripts to be very hard to debug years after they
>> are written; IMHO the more comments, the better) :)
>>
>>> +_scratch_mount
>>> +_scratch_metadump $METADUMP_FILE 2>&1 | filter_mounted
>>> +[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test dump a mounted device [Failed]"
>>> +_scratch_unmount
>>> +
>>> +# Test restore a mounted device
>>
>> # Test restore to a mounted device
>> # xfs_mdrestore should refuse to restore to a mounted device.
>>
>> It might be more clear to move the _scratch_unmount above to just before
>> the metadump, so it's very clear whether we're working on a mounted
>> or unmounted device, i.e. move it here:
>>
>>   +_scratch_unmount
> 
> I just tried to make sure before every single sub-tests begin, the SCRATCH_DEV
> is always unmounted by default, what do you think about that?

ok, either way I guess.
 

...

>> Testing the "-d dangerous" option of repair would also be good.
> 
> Hmm... I think this's used to test platform_check_iswritable(). I'm planning
> to write another case to test platform_check_iswritable (I'm thinking about
> how to write that:)

Oh, right.  Ok.

-Eric


--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/tests/xfs/284 b/tests/xfs/284
new file mode 100755
index 0000000..53fbcb1
--- /dev/null
+++ b/tests/xfs/284
@@ -0,0 +1,113 @@ 
+#! /bin/bash
+# FS QA Test 284
+#
+# Make sure platform_check_ismounted() do its work. A bug cause
+# platform_check_ismounted return "isn't mounted" status, even if
+# the filesystem is mounted. That maybe cause corruption, so must
+# make sure this function always do its work.
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2016 Red Hat.  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 /
+	rm -f $tmp.*
+	rm -f $METADUMP_FILE 2>/dev/null
+	rm -f $COPY_FILE 2>/dev/null
+}
+
+# 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
+_supported_fs xfs
+_supported_os Linux
+_require_test
+_require_scratch
+
+function filter_mounted()
+{
+	grep "mounted" | _filter_scratch | head -1
+}
+
+METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
+COPY_FILE="${TEST_DIR}/${seq}_copyfile"
+
+# Test dump a mounted device
+_scratch_mount
+_scratch_metadump $METADUMP_FILE 2>&1 | filter_mounted
+[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test dump a mounted device [Failed]"
+_scratch_unmount
+
+# Test restore a mounted device
+_scratch_metadump $METADUMP_FILE
+_scratch_mount
+xfs_mdrestore $METADUMP_FILE $SCRATCH_DEV 2>&1 | filter_mounted
+[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test restore a mounted device [Failed]"
+_scratch_unmount
+
+# Test xfs_copy to a mounted device
+# If source is mounted, xfs_copy will print a warning, but still
+# keep on copying. If target is mounted, xfs_copy will failed.
+$XFS_COPY_PROG $SCRATCH_DEV $COPY_FILE >/dev/null
+_scratch_mount
+$XFS_COPY_PROG $COPY_FILE $SCRATCH_DEV 2>&1 | filter_mounted
+[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test xfs_copy to a mounted device [Failed]"
+_scratch_unmount
+
+# Test xfs_db a mounted device without readonly (-r) option
+_scratch_mount
+$XFS_DB_PROG -c sb $SCRATCH_DEV 2>&1 | filter_mounted
+[ ${PIPESTATUS[0]} -eq 0 ] &&
+	echo "Test xfs_db a mounted device(without -r option) [Failed]"
+_scratch_unmount
+
+# Test mkfs.xfs a mounted device
+# Generally mkfs will report device is mounted, but if it can't find
+# device is mounted, it'll report device busy.
+_scratch_mount
+_scratch_mkfs 2>&1 | filter_mounted
+[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test mkfs.xfs a mounted device [Failed]"
+_scratch_unmount
+
+# Test xfs_repair (with/without modify flag) a mounted device
+_scratch_mount
+_scratch_xfs_repair -n 2>&1 | filter_mounted
+[ ${PIPESTATUS[0]} -eq 0 ] &&
+	echo "Test xfs_repair -n a mounted devie [Failed]"
+_scratch_xfs_repair 2>&1 | filter_mounted
+[ ${PIPESTATUS[0]} -eq 0 ] && echo "Test xfs_repair a mounted devie [Failed]"
+_scratch_unmount
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/284.out b/tests/xfs/284.out
new file mode 100644
index 0000000..302d75e
--- /dev/null
+++ b/tests/xfs/284.out
@@ -0,0 +1,8 @@ 
+QA output created by 284
+xfs_metadump: SCRATCH_DEV contains a mounted and writable filesystem
+xfs_mdrestore: a filesystem is mounted on target device "SCRATCH_DEV", cannot restore to a mounted filesystem.
+xfs_copy:  a filesystem is mounted on target device "SCRATCH_DEV".
+xfs_db: SCRATCH_DEV contains a mounted filesystem
+mkfs.xfs: SCRATCH_DEV contains a mounted filesystem
+xfs_repair: SCRATCH_DEV contains a mounted and writable filesystem
+xfs_repair: SCRATCH_DEV contains a mounted filesystem
diff --git a/tests/xfs/group b/tests/xfs/group
index baa0ff6..0ac4bd5 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -281,6 +281,7 @@ 
 281 dump ioctl auto quick
 282 dump ioctl auto quick
 283 dump ioctl auto quick
+284 auto quick mount
 287 auto dump quota quick
 290 auto rw prealloc quick ioctl zero
 291 auto repair