]> git-server-git.apps.pok.os.sepia.ceph.com Git - xfstests-dev.git/commitdiff
xfs: test health monitoring code
authorDarrick J. Wong <djwong@kernel.org>
Tue, 10 Mar 2026 03:50:23 +0000 (20:50 -0700)
committerZorro Lang <zlang@kernel.org>
Tue, 17 Mar 2026 03:31:43 +0000 (11:31 +0800)
Add some functionality tests for the new health monitoring code.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Zorro Lang <zlang@redhat.com>
Signed-off-by: Zorro Lang <zlang@kernel.org>
common/module
tests/xfs/654 [new file with mode: 0755]
tests/xfs/654.out [new file with mode: 0644]

index 697d76ba718bbcdbdd5007d3d7c819076bcdc6dc..c0529b65ad6e2b0b194c9d604f4957837771dafe 100644 (file)
@@ -225,3 +225,14 @@ _optional_reload_fs_module()
                _test_loadable_fs_module "$@" 2>&1 | \
                sed -e '/patient module removal/d'
 }
+
+_require_module_refcount()
+{
+       local refcount_file="/sys/module/$1/refcnt"
+       test -e "$refcount_file" || _notrun "cannot find $1 module refcount"
+}
+
+_module_refcount()
+{
+       cat "/sys/module/$1/refcnt"
+}
diff --git a/tests/xfs/654 b/tests/xfs/654
new file mode 100755 (executable)
index 0000000..012f31a
--- /dev/null
@@ -0,0 +1,60 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2024-2026 Oracle.  All Rights Reserved.
+#
+# FS QA Test No. 654
+#
+# Make sure that healthmon handles module refcount correctly.
+#
+. ./common/preamble
+_begin_fstest auto selfhealing quick
+
+. ./common/filter
+. ./common/module
+
+_cleanup()
+{
+       test -n "$healer_pid" && kill $healer_pid &>/dev/null
+       wait
+       cd /
+       rm -r -f $tmp.*
+}
+
+_require_test
+_require_xfs_io_command healthmon
+_require_module_refcount xfs
+
+# Capture mod refcount without the test fs mounted
+_test_unmount
+init_refcount="$(_module_refcount xfs)"
+
+# Capture mod refcount with the test fs mounted
+_test_mount
+nomon_mount_refcount="$(_module_refcount xfs)"
+
+# Capture mod refcount with test fs mounted and the healthmon fd open.
+# Pause the xfs_io process so that it doesn't actually respond to events.
+$XFS_IO_PROG -c 'healthmon -c -v' $TEST_DIR >> $seqres.full &
+healer_pid=$!
+sleep 0.5
+kill -STOP $healer_pid
+mon_mount_refcount="$(_module_refcount xfs)"
+
+# Capture mod refcount with only the healthmon fd open.
+_test_unmount
+mon_nomount_refcount="$(_module_refcount xfs)"
+
+# Capture mod refcount after continuing healthmon (which should exit due to the
+# unmount) and killing it.
+kill -CONT $healer_pid
+kill $healer_pid
+wait
+unset healer_pid
+nomon_nomount_refcount="$(_module_refcount xfs)"
+
+_within_tolerance "mount refcount" "$nomon_mount_refcount" "$((init_refcount + 1))" 0 -v
+_within_tolerance "mount + healthmon refcount" "$mon_mount_refcount" "$((init_refcount + 2))" 0 -v
+_within_tolerance "healthmon refcount" "$mon_nomount_refcount" "$((init_refcount + 1))" 0 -v
+_within_tolerance "end refcount" "$nomon_nomount_refcount" "$init_refcount" 0 -v
+
+_exit 0
diff --git a/tests/xfs/654.out b/tests/xfs/654.out
new file mode 100644 (file)
index 0000000..344d56b
--- /dev/null
@@ -0,0 +1,5 @@
+QA output created by 654
+mount refcount is in range
+mount + healthmon refcount is in range
+healthmon refcount is in range
+end refcount is in range