在 2024/11/1 23:25, Zorro Lang 写道:
[...]
+_cleanup()
+{
+ cd /
rm -r -f $tmp.*
The test doesn't utilize any temporary file AFAIK.
+ kill "$remount_pid" "$mount_pid" &> /dev/null
With below "unset" (see below), we can:
[ -n "$mount_pid" ] && kill $mount_pid
[ -n "$remount_pid" ] && kill $remount_pid
If both pids unset, kill will do nothing but shows its usage.
In that case since we re-direct both stderr and stdout, it will not
cause anything wrong.
+ wait &> /dev/null
Just curious, what can cause "wait" command print something?
"wait" can output errors for invalid options or the pid is not a child one.
But without any option it doesn't seem to output any error message.
+ $UMOUNT_PROG "$subv1_mount" &> /dev/null
+ $UMOUNT_PROG "$subv2_mount" &> /dev/null
+ rm -rf -- "$subv1_mount" &> /dev/null
+ rm -rf -- "$subv2_mount" &> /dev/null
rm "-f" prints nothing, so
rm -rf -- "$subv1_mount" "$subv2_mount"
Nope. it can output error like -EBUSY if any of the mount point is still
being mounted.
Thus to be extra safe I prefer to do all the redirection in the cleanup
function.
As I have hit problems inside the cleanup function too many times,
mostly because the previous version is lacking the signal handling for
each workload.
+}
+
+# For the extra mount points
+_require_test
+_require_scratch
+
+_scratch_mkfs >> $seqres.full 2>&1
+_scratch_mount
+$BTRFS_UTIL_PROG subvolume create $SCRATCH_MNT/subvol1 >> $seqres.full
+$BTRFS_UTIL_PROG subvolume create $SCRATCH_MNT/subvol2 >> $seqres.full
Hmm... I wondering what'll happen, if remove these two lines then run this test
on other filesystems :)
Not sure about other filesystems, but do other filesystems allows
different RO/RW flags for the same fs?
+_scratch_unmount
+
+subv1_mount="$TEST_DIR/subvol1_mount"
+subv2_mount="$TEST_DIR/subvol2_mount"
Better to try to remove them at first. We can't make sure these names never
be existed in $TEST_DIR.
+mkdir -p "$subv1_mount"
+mkdir -p "$subv2_mount"
+_mount "$SCRATCH_DEV" "$subv1_mount" -o subvol=subvol1
+
+# Subv1 remount workload, mount the subv1 and switching it between
+# RO and RW.
+remount_workload()
+{
+ trap "wait; exit" SIGTERM
+ while true; do
+ _mount -o remount,ro "$subv1_mount"
+ _mount -o remount,rw "$subv1_mount"
+ done
+}
+
+remount_workload &
+remount_pid=$!
+
+# Subv2 rw mount workload
+# For unpatched kernel, this will fail with -EBUSY.
+#
+# To maintain the per-subvolume RO/RW mount, if the existing btrfs is
+# mounted RO, unpatched btrfs will retry with its RO flag reverted,
+# then reconfigure the fs to RW.
+#
+# But such retry has no super block lock hold, thus if another remount
+# process has already remounted the fs RW, the attempt will fail and
+# return -EBUSY.
+#
+# Patched kernel will allow the superblock and mount point RO flags
+# to differ, and then hold the s_umount to reconfigure the super block
+# to RW, preventing any possible race.
+mount_workload()
+{
+ trap "wait; exit" SIGTERM
+ while true; do
+ _mount "$SCRATCH_DEV" "$subv2_mount"
+ $UMOUNT_PROG "$subv2_mount"
+ done
+}
+
+mount_workload &
+mount_pid=$!
+
+sleep $(( 10 * $TIME_FACTOR ))
+
+kill "$remount_pid" "$mount_pid"
+wait
unset remount_pid mount_pid
to avoid later kill (in _cleanup) kill other processes.
IIRC the child pid won't be reused until the parent process exits.
+
+# subv1 is always mounted, thus the umount should not fail.
+$UMOUNT_PROG "$subv1_mount"
+$UMOUNT_PROG "$subv2_mount" &> /dev/null
+
+rm -rf -- "$subv1_mount" "$subv2_mount"
Do this in _cleanup (as above), so this line can be removed if it's not a
necessary test step of this case.
This is an extra safety check, to make sure the unmount is properly done.
And that's why here we do not re-direct the output, unlike cleanup.
As I have already hit cases where the rm returned EBUSY error due to
races with the children processes not handling signal correctly.
Thanks,
Qu
Others look good to me.
Thanks,
Zorro
+
+
+echo "Silence is golden"
+
+# success, all done
+status=0
+exit
diff --git a/tests/btrfs/325.out b/tests/btrfs/325.out
new file mode 100644
index 00000000..cf13795c
--- /dev/null
+++ b/tests/btrfs/325.out
@@ -0,0 +1,2 @@
+QA output created by 325
+Silence is golden
--
2.46.0