Re: [PATCH v2] btrfs: a new test case to verify mount behavior with background remounting

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]





在 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










[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux