From: Hans Holmberg Date: Mon, 9 Jun 2025 11:03:54 +0000 (+0000) Subject: ext4/002: make generic to support xfs X-Git-Tag: v2025.06.22~14 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=e7bc1e2427b4ccfd9a51a475b0d1b792b3586a40;p=xfstests-dev.git ext4/002: make generic to support xfs xfs supports separate log devices and as this test now passes, share it by turning it into a generic test. This should not result in a new failure for other file systems as only ext2/ext3/ext4 and xfs supports mkfs with SCRATCH_LOGDEVs. Signed-off-by: Hans Holmberg Reviewed-by: Darrick J. Wong Reviewed-by: Christoph Hellwig Signed-off-by: Zorro Lang --- diff --git a/tests/ext4/002 b/tests/ext4/002 deleted file mode 100755 index 6c1e1d92..00000000 --- a/tests/ext4/002 +++ /dev/null @@ -1,129 +0,0 @@ -#! /bin/bash -# SPDX-License-Identifier: GPL-2.0 -# Copyright (c) 2009 Christoph Hellwig. -# Copyright (c) 2020 Lukas Czerner. -# -# FS QA Test No. 002 -# -# Copied from tests generic/050 and adjusted to support testing -# read-only external journal device on ext4. -# -# Check out various mount/remount/unmount scenarious on a read-only -# logdev blockdev. -# -# This problem has been addressed with proposed kernel patch -# https://lore.kernel.org/linux-ext4/20200717090605.2612-1-lczerner@redhat.com/ -# -seqfull=$0 -. ./common/preamble -_begin_fstest shutdown mount auto quick - -# Override the default cleanup function. -_cleanup() -{ - cd / - blockdev --setrw $SCRATCH_LOGDEV - blockdev --setrw $SCRATCH_DEV -} - -# Import common functions. -. ./common/filter - -_exclude_fs ext2 - -_require_scratch_nocheck -_require_scratch_shutdown -_require_logdev -_require_local_device $SCRATCH_DEV -_require_local_device $SCRATCH_LOGDEV -_require_norecovery - -_scratch_mkfs >/dev/null 2>&1 -_require_metadata_journaling $SCRATCH_DEV - -# -# Mark the log device read-only -# -echo "setting log device read-only" -blockdev --setro $SCRATCH_LOGDEV - -# -# Mount it, and make sure we can't write to it, and we can unmount it again -# -echo "mounting with read-only log device:" -_try_scratch_mount 2>&1 | _filter_ro_mount | _filter_scratch -if [ "${PIPESTATUS[0]}" -eq 0 ]; then - echo "touching file on read-only filesystem (should fail)" - touch $SCRATCH_MNT/foo 2>&1 | _filter_scratch -fi - -echo "unmounting read-only filesystem" -_scratch_unmount 2>&1 | _filter_scratch | _filter_ending_dot - -echo "setting log device read-write" -blockdev --setrw $SCRATCH_LOGDEV - -echo "mounting with read-write log device:" -_try_scratch_mount 2>&1 | _filter_scratch - -echo "touch files" -touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9} - -echo "going down:" -_scratch_shutdown -f - -echo "unmounting shutdown filesystem:" -_scratch_unmount 2>&1 | _filter_scratch - -echo "setting log device read-only" -blockdev --setro $SCRATCH_LOGDEV - -# -# Mounting a filesystem that requires log-recovery fails even with -# -o norecovery unless the fs device is read only or it's mounted -# read only -# -echo "mounting filesystem that needs recovery with a read-only log device:" -_try_scratch_mount 2>&1 | _filter_ro_mount | _filter_scratch - -echo "unmounting read-only filesystem" -_scratch_unmount 2>&1 | _filter_scratch | _filter_ending_dot - -echo "mounting filesystem with -o norecovery with a read-only log device:" -_try_scratch_mount -o norecovery 2>&1 | _filter_ro_mount | _filter_scratch -echo "unmounting read-only filesystem" -_scratch_unmount 2>&1 | _filter_scratch | _filter_ending_dot - -# -# This is the way out if the log device really is read-only. -# Doesn't mean it's a good idea in practice, more a last resort -# data recovery hack. Either the underlying fs device needs -# to be read only as well, or we mount the file system read only -# -echo "setting fs device read-only" -blockdev --setro $SCRATCH_DEV -echo "mounting filesystem with -o norecovery with a read-only fs and log device:" -_try_scratch_mount -o norecovery 2>&1 | _filter_ro_mount | _filter_scratch -echo "unmounting read-only filesystem" -_scratch_unmount 2>&1 | _filter_scratch | _filter_ending_dot -echo "setting fs device read-write" -blockdev --setrw $SCRATCH_DEV - -echo "mounting filesystem with -o norecovery,ro with a read-only log device:" -_try_scratch_mount -o norecovery,ro 2>&1 | _filter_ro_mount | _filter_scratch -echo "unmounting read-only filesystem" -_scratch_unmount 2>&1 | _filter_scratch | _filter_ending_dot - -echo "setting log device read-write" -blockdev --setrw $SCRATCH_LOGDEV - -# -# But log recovery is performed when mount with -o ro as long as -# the underlying device is not write protected. -# -echo "mounting filesystem that needs recovery with -o ro:" -_try_scratch_mount -o ro 2>&1 | _filter_scratch - -# success, all done -echo "*** done" -status=0 diff --git a/tests/ext4/002.out b/tests/ext4/002.out deleted file mode 100644 index 579bc7e0..00000000 --- a/tests/ext4/002.out +++ /dev/null @@ -1,32 +0,0 @@ -QA output created by 002 -setting log device read-only -mounting with read-only log device: -mount: device write-protected, mounting read-only -touching file on read-only filesystem (should fail) -touch: cannot touch 'SCRATCH_MNT/foo': Read-only file system -unmounting read-only filesystem -setting log device read-write -mounting with read-write log device: -touch files -going down: -unmounting shutdown filesystem: -setting log device read-only -mounting filesystem that needs recovery with a read-only log device: -mount: device write-protected, mounting read-only -mount: cannot mount device read-only -unmounting read-only filesystem -umount: SCRATCH_DEV: not mounted -mounting filesystem with -o norecovery with a read-only log device: -mount: SCRATCH_MNT: wrong fs type, bad option, bad superblock on SCRATCH_DEV, missing codepage or helper program, or other error -unmounting read-only filesystem -umount: SCRATCH_DEV: not mounted -setting fs device read-only -mounting filesystem with -o norecovery with a read-only fs and log device: -mount: device write-protected, mounting read-only -unmounting read-only filesystem -setting fs device read-write -mounting filesystem with -o norecovery,ro with a read-only log device: -unmounting read-only filesystem -setting log device read-write -mounting filesystem that needs recovery with -o ro: -*** done diff --git a/tests/generic/766 b/tests/generic/766 new file mode 100755 index 00000000..3b6911f0 --- /dev/null +++ b/tests/generic/766 @@ -0,0 +1,138 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2009 Christoph Hellwig. +# Copyright (c) 2020 Lukas Czerner. +# +# FS QA Test No. 766 +# +# Copied from tests generic/050 and adjusted to support testing +# read-only external journal device on ext4. +# Moved to generic from ext4/002 to support xfs as well +# +# Check out various mount/remount/unmount scenarious on a read-only +# logdev blockdev. +# +# This problem has been addressed with proposed kernel patch +# https://lore.kernel.org/linux-ext4/20200717090605.2612-1-lczerner@redhat.com/ +# +seqfull=$0 +. ./common/preamble +_begin_fstest shutdown mount auto quick + +# Override the default cleanup function. +_cleanup() +{ + cd / + blockdev --setrw $SCRATCH_LOGDEV + blockdev --setrw $SCRATCH_DEV +} + +# Import common functions. +. ./common/filter + +_exclude_fs ext2 + +[ $FSTYP == "ext4" ] && \ + _fixed_by_kernel_commit 273108fa5015 \ + "ext4: handle read only external journal device" + +[ $FSTYP == "xfs" ] && \ + _fixed_by_kernel_commit bfecc4091e07 \ + "xfs: allow ro mounts if rtdev or logdev are read-only" + +_require_scratch_nocheck +_require_scratch_shutdown +_require_logdev +_require_local_device $SCRATCH_DEV +_require_local_device $SCRATCH_LOGDEV +_require_norecovery + +_scratch_mkfs >/dev/null 2>&1 +_require_metadata_journaling $SCRATCH_DEV + +# +# Mark the log device read-only +# +echo "setting log device read-only" +blockdev --setro $SCRATCH_LOGDEV + +# +# Mount it, and make sure we can't write to it, and we can unmount it again +# +echo "mounting with read-only log device:" +_try_scratch_mount 2>&1 | _filter_ro_mount | _filter_scratch +if [ "${PIPESTATUS[0]}" -eq 0 ]; then + echo "touching file on read-only filesystem (should fail)" + touch $SCRATCH_MNT/foo 2>&1 | _filter_scratch +fi + +echo "unmounting read-only filesystem" +_scratch_unmount 2>&1 | _filter_scratch | _filter_ending_dot + +echo "setting log device read-write" +blockdev --setrw $SCRATCH_LOGDEV + +echo "mounting with read-write log device:" +_try_scratch_mount 2>&1 | _filter_scratch + +echo "touch files" +touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9} + +echo "going down:" +_scratch_shutdown -f + +echo "unmounting shutdown filesystem:" +_scratch_unmount 2>&1 | _filter_scratch + +echo "setting log device read-only" +blockdev --setro $SCRATCH_LOGDEV + +# +# Mounting a filesystem that requires log-recovery fails even with +# -o norecovery unless the fs device is read only or it's mounted +# read only +# +echo "mounting filesystem that needs recovery with a read-only log device:" +_try_scratch_mount 2>&1 | _filter_ro_mount | _filter_scratch + +echo "unmounting read-only filesystem" +_scratch_unmount 2>&1 | _filter_scratch | _filter_ending_dot + +echo "mounting filesystem with -o norecovery with a read-only log device:" +_try_scratch_mount -o norecovery 2>&1 | _filter_ro_mount | _filter_scratch +echo "unmounting read-only filesystem" +_scratch_unmount 2>&1 | _filter_scratch | _filter_ending_dot + +# +# This is the way out if the log device really is read-only. +# Doesn't mean it's a good idea in practice, more a last resort +# data recovery hack. Either the underlying fs device needs +# to be read only as well, or we mount the file system read only +# +echo "setting fs device read-only" +blockdev --setro $SCRATCH_DEV +echo "mounting filesystem with -o norecovery with a read-only fs and log device:" +_try_scratch_mount -o norecovery 2>&1 | _filter_ro_mount | _filter_scratch +echo "unmounting read-only filesystem" +_scratch_unmount 2>&1 | _filter_scratch | _filter_ending_dot +echo "setting fs device read-write" +blockdev --setrw $SCRATCH_DEV + +echo "mounting filesystem with -o norecovery,ro with a read-only log device:" +_try_scratch_mount -o norecovery,ro 2>&1 | _filter_ro_mount | _filter_scratch +echo "unmounting read-only filesystem" +_scratch_unmount 2>&1 | _filter_scratch | _filter_ending_dot + +echo "setting log device read-write" +blockdev --setrw $SCRATCH_LOGDEV + +# +# But log recovery is performed when mount with -o ro as long as +# the underlying device is not write protected. +# +echo "mounting filesystem that needs recovery with -o ro:" +_try_scratch_mount -o ro 2>&1 | _filter_scratch + +# success, all done +echo "*** done" +status=0 diff --git a/tests/generic/766.out b/tests/generic/766.out new file mode 100644 index 00000000..97575175 --- /dev/null +++ b/tests/generic/766.out @@ -0,0 +1,32 @@ +QA output created by 766 +setting log device read-only +mounting with read-only log device: +mount: device write-protected, mounting read-only +touching file on read-only filesystem (should fail) +touch: cannot touch 'SCRATCH_MNT/foo': Read-only file system +unmounting read-only filesystem +setting log device read-write +mounting with read-write log device: +touch files +going down: +unmounting shutdown filesystem: +setting log device read-only +mounting filesystem that needs recovery with a read-only log device: +mount: device write-protected, mounting read-only +mount: cannot mount device read-only +unmounting read-only filesystem +umount: SCRATCH_DEV: not mounted +mounting filesystem with -o norecovery with a read-only log device: +mount: SCRATCH_MNT: wrong fs type, bad option, bad superblock on SCRATCH_DEV, missing codepage or helper program, or other error +unmounting read-only filesystem +umount: SCRATCH_DEV: not mounted +setting fs device read-only +mounting filesystem with -o norecovery with a read-only fs and log device: +mount: device write-protected, mounting read-only +unmounting read-only filesystem +setting fs device read-write +mounting filesystem with -o norecovery,ro with a read-only log device: +unmounting read-only filesystem +setting log device read-write +mounting filesystem that needs recovery with -o ro: +*** done