From: "Darrick J. Wong" <djwong@kernel.org>
To: zlang@redhat.com, djwong@kernel.org
Cc: Dave Chinner <dchinner@redhat.com>,
linux-xfs@vger.kernel.org, fstests@vger.kernel.org, guan@eryu.me,
david@fromorbit.com, sandeen@sandeen.net
Subject: [PATCH 2/2] xfs/270: actually test log recovery with unknown rocompat features
Date: Tue, 29 Aug 2023 16:09:59 -0700 [thread overview]
Message-ID: <169335059947.3526409.5659717618354794568.stgit@frogsfrogsfrogs> (raw)
In-Reply-To: <169335058807.3526409.15604604578540143202.stgit@frogsfrogsfrogs>
From: Darrick J. Wong <djwong@kernel.org>
Make sure that log recovery will not succeed if there are unknown
rocompat features in the superblock and the log is dirty.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
---
tests/xfs/270 | 82 ++++++++++++++++++++++++++++++++++++-----------------
tests/xfs/270.out | 2 +
2 files changed, 58 insertions(+), 26 deletions(-)
diff --git a/tests/xfs/270 b/tests/xfs/270
index 511dfe9fcd..08bfb1c4d4 100755
--- a/tests/xfs/270
+++ b/tests/xfs/270
@@ -21,41 +21,48 @@ _supported_fs xfs
_require_scratch_nocheck
# Only V5 XFS disallow rw mount/remount with unknown ro-compat features
_require_scratch_xfs_crc
-
-_scratch_mkfs_xfs >>$seqres.full 2>&1
-_scratch_mount
-echo moo > $SCRATCH_MNT/testfile
-_scratch_unmount
+_require_scratch_shutdown
# set the highest bit of features_ro_compat, use it as an unknown
# feature bit. If one day this bit become known feature, please
# change this case.
+set_bad_rocompat() {
+ ro_compat=$(_scratch_xfs_get_metadata_field "features_ro_compat" "sb 0")
+ echo $ro_compat | grep -q -E '^0x[[:xdigit:]]$'
+ if [[ $? != 0 ]]; then
+ echo "features_ro_compat has an invalid value."
+ return 1
+ fi
-ro_compat=$(_scratch_xfs_get_metadata_field "features_ro_compat" "sb 0")
-echo $ro_compat | grep -q -E '^0x[[:xdigit:]]$'
-if [[ $? != 0 ]]; then
- echo "features_ro_compat has an invalid value."
-fi
+ ro_compat=$(echo $ro_compat | \
+ awk '/^0x[[:xdigit:]]+/ {
+ printf("0x%x\n", or(strtonum($1), 0x80000000))
+ }')
-ro_compat=$(echo $ro_compat | \
- awk '/^0x[[:xdigit:]]+/ {
- printf("0x%x\n", or(strtonum($1), 0x80000000))
- }')
+ # write the new ro compat field to the superblock
+ _scratch_xfs_set_metadata_field "features_ro_compat" "$ro_compat" "sb 0" \
+ > $seqres.full 2>&1
-# write the new ro compat field to the superblock
-_scratch_xfs_set_metadata_field "features_ro_compat" "$ro_compat" "sb 0" \
- > $seqres.full 2>&1
+ # read the newly set ro compat filed for verification
+ new_ro_compat=$(_scratch_xfs_get_metadata_field "features_ro_compat" "sb 0" \
+ 2>/dev/null)
-# read the newly set ro compat filed for verification
-new_ro_compat=$(_scratch_xfs_get_metadata_field "features_ro_compat" "sb 0" \
- 2>/dev/null)
+ # verify the new ro_compat field is correct. Without xfsprogs commit
+ # f4afdcb0ad ("xfs_db: clean up the salvage read callsites in set_cur()"),
+ # we can't get new_ro_compat value.
+ if [ "$new_ro_compat" != "$ro_compat" ]; then
+ echo "Unable to set new features_ro_compat. Wanted $ro_compat, got $new_ro_compat"
+ return 1
+ fi
+ return 0
+}
-# verify the new ro_compat field is correct. Without xfsprogs commit
-# f4afdcb0ad ("xfs_db: clean up the salvage read callsites in set_cur()"),
-# we can't get new_ro_compat value.
-if [ "$new_ro_compat" != "$ro_compat" ]; then
- echo "Unable to set new features_ro_compat. Wanted $ro_compat, got $new_ro_compat"
-fi
+# Once with a clean filesystem...
+_scratch_mkfs_xfs >>$seqres.full 2>&1
+_scratch_mount
+echo moo > $SCRATCH_MNT/testfile
+_scratch_unmount
+set_bad_rocompat
# rw mount with unknown ro-compat feature should fail
echo "rw mount test"
@@ -85,6 +92,29 @@ fi
_scratch_unmount
+# And again with a dirty filesystem...
+_scratch_mkfs_xfs >>$seqres.full 2>&1
+_scratch_mount
+echo moo > $SCRATCH_MNT/testfile
+$XFS_IO_PROG -x -c 'shutdown -f' "${SCRATCH_MNT}"
+_scratch_unmount
+set_bad_rocompat
+
+# rw mount with unknown ro-compat feature should fail
+echo "rw mount test"
+_try_scratch_mount 2>>$seqres.full
+if [ $? -eq 0 ]; then
+ _fail "rw mount test failed"
+fi
+
+# ro mount should succeed even with log recovery
+echo "ro mount test"
+_try_scratch_mount -o ro 2>>$seqres.full
+if [ $? -ne 0 ]; then
+ _fail "ro mount test failed"
+fi
+cat $SCRATCH_MNT/testfile > /dev/null
+
# success, all done
status=0
exit
diff --git a/tests/xfs/270.out b/tests/xfs/270.out
index edf4c25489..a519d2f328 100644
--- a/tests/xfs/270.out
+++ b/tests/xfs/270.out
@@ -2,3 +2,5 @@ QA output created by 270
rw mount test
ro mount test
rw remount test
+rw mount test
+ro mount test
next prev parent reply other threads:[~2023-08-29 23:11 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-29 23:09 [PATCHSET v2 0/2] fstests: fix ro mounting with unknown rocompat features Darrick J. Wong
2023-08-29 23:09 ` [PATCH 1/2] xfs/270: actually test file readability Darrick J. Wong
2023-09-13 16:54 ` Zorro Lang
2023-08-29 23:09 ` Darrick J. Wong [this message]
2023-09-17 16:44 ` [PATCHSET v2 0/2] fstests: fix ro mounting with unknown rocompat features Zorro Lang
2023-09-18 15:17 ` Darrick J. Wong
2023-09-18 16:44 ` Zorro Lang
2023-09-18 18:35 ` Darrick J. Wong
2023-09-19 2:57 ` Zorro Lang
2023-09-19 3:06 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=169335059947.3526409.5659717618354794568.stgit@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=david@fromorbit.com \
--cc=dchinner@redhat.com \
--cc=fstests@vger.kernel.org \
--cc=guan@eryu.me \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@sandeen.net \
--cc=zlang@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox