]> git.apps.os.sepia.ceph.com Git - xfstests-dev.git/commitdiff
fstests: add module reloading helpers
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 27 Oct 2017 20:23:08 +0000 (13:23 -0700)
committerEryu Guan <eguan@redhat.com>
Fri, 3 Nov 2017 11:04:49 +0000 (19:04 +0800)
Add some helper functions to require that we can reload a given
module, and add a helper to actually do that.  Refactor the existing
users to use the generics.

We need to hoist completely the behaviors of the old btrfs module
helper because we need to confirm before starting the test that we
actually can remove the module.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eryu Guan <eguan@redhat.com>
Signed-off-by: Eryu Guan <eguan@redhat.com>
common/btrfs
common/module [new file with mode: 0644]
common/overlay
common/rc
tests/btrfs/124
tests/btrfs/125

index fd762ef27d1319dcc40f76bf709674f144c8afb9..c09206c6f29240b27fc2af40341dab018122057f 100644 (file)
@@ -349,18 +349,6 @@ _btrfs_qgroup_units()
        $BTRFS_UTIL_PROG qgroup show --help 2>&1 | grep -q -- --raw && echo "--raw"
 }
 
-_require_btrfs_loadable()
-{
-       modprobe -r btrfs || _notrun "btrfs unloadable"
-       modprobe btrfs || _notrun "Can't load btrfs"
-}
-
-_reload_btrfs_ko()
-{
-       modprobe -r btrfs || _fail "btrfs unload failed"
-       modprobe btrfs || _fail "btrfs load failed"
-}
-
 _btrfs_compression_algos()
 {
        echo zlib
diff --git a/common/module b/common/module
new file mode 100644 (file)
index 0000000..ebaf290
--- /dev/null
@@ -0,0 +1,99 @@
+##/bin/bash
+
+# Routines for messing around with loadable kernel modules
+#
+#-----------------------------------------------------------------------
+#  Copyright (c) 2017 Oracle.  All Rights Reserved.
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+#  USA
+#-----------------------------------------------------------------------
+
+# Return the module name for this fs.
+_module_for_fs()
+{
+       echo "${FSTYP}"
+}
+
+# Reload a particular module.  This module MUST NOT be the module that
+# underlies the filesystem.
+_reload_module()
+{
+       local module="$1"
+
+       modprobe -r "${module}" || _fail "${module} unload failed"
+       modprobe "${module}" || _fail "${module} load failed"
+}
+
+# Reload the filesystem module.
+_reload_fs_module()
+{
+       local module="$1"
+
+       # Unload test fs, try to reload module, remount
+       local had_testfs=""
+       local had_scratchfs=""
+       _check_mounted_on TEST_DEV $TEST_DEV TEST_DIR $TEST_DIR && had_testfs="true"
+       _check_mounted_on SCRATCH_DEV $SCRATCH_DEV SCRATCH_MNT $SCRATCH_MNT && had_scratchfs="true"
+       test -n "${had_testfs}" && _test_unmount
+       test -n "${had_scratchfs}" && _scratch_unmount
+       _reload_module "${module}"
+       test -n "${had_scratchfs}" && _scratch_mount 2> /dev/null
+       test -n "${had_testfs}" && _test_mount 2> /dev/null
+}
+
+# Check that we have a module that can be loaded.  This module MUST NOT
+# be the module that underlies the filesystem.
+_require_loadable_module()
+{
+       local module="$1"
+
+       modinfo "${module}" > /dev/null 2>&1 || _notrun "${module}: must be a module."
+       modprobe -r "${module}" || _notrun "Require ${module} to be unloadable"
+       modprobe "${module}" || _notrun "${module} load failed"
+}
+
+# Check that the module for FSTYP can be loaded.
+_require_loadable_fs_module()
+{
+       local module="$1"
+
+       modinfo "${module}" > /dev/null 2>&1 || _notrun "${module}: must be a module."
+
+       # Unload test fs, try to reload module, remount
+       local had_testfs=""
+       local had_scratchfs=""
+       _check_mounted_on TEST_DEV $TEST_DEV TEST_DIR $TEST_DIR && had_testfs="true"
+       _check_mounted_on SCRATCH_DEV $SCRATCH_DEV SCRATCH_MNT $SCRATCH_MNT && had_scratchfs="true"
+       test -n "${had_testfs}" && _test_unmount
+       test -n "${had_scratchfs}" && _scratch_unmount
+       local unload_ok=""
+       local load_ok=""
+       modprobe -r "${module}" || unload_ok=0
+       modprobe "${module}" || load_ok=0
+       test -n "${had_scratchfs}" && _scratch_mount 2> /dev/null
+       test -n "${had_testfs}" && _test_mount 2> /dev/null
+       test -z "${unload_ok}" || _notrun "Require module ${module} to be unloadable"
+       test -z "${load_ok}" || _notrun "${module} load failed"
+}
+
+# Print the value of a filesystem module parameter
+# at /sys/module/$FSTYP/parameters/$PARAM
+#
+# Usage example (FSTYP=overlay):
+#   _get_fs_module_param index
+_get_fs_module_param()
+{
+       cat /sys/module/${FSTYP}/parameters/${1} 2>/dev/null
+}
index 79097bab1a9e2227d070edb99d2b6904c277748a..1da4ab1b67f724264e4d675fdb9c6b21a218b8a9 100644 (file)
@@ -1,6 +1,7 @@
 #
 # overlayfs specific common functions.
 #
+. ./common/module
 
 # helper function to do the actual overlayfs mount operation
 _overlay_mount_dirs()
index a2999a2f6b2a2cd938b5c8acfc84bd0779678ed5..9e8fcdb6941201b18bbe1b12ad9bae134d316a46 100644 (file)
--- a/common/rc
+++ b/common/rc
@@ -3540,16 +3540,6 @@ _get_fs_sysfs_attr()
        cat /sys/fs/${FSTYP}/${dname}/${attr}
 }
 
-# Print the value of a filesystem module parameter
-# at /sys/module/$FSTYP/parameters/$PARAM
-#
-# Usage example (FSTYP=overlay):
-#   _get_fs_module_param index
-_get_fs_module_param()
-{
-       cat /sys/module/${FSTYP}/parameters/${1} 2>/dev/null
-}
-
 # Generic test for specific filesystem feature.
 # Currently only implemented to test overlayfs features.
 _require_scratch_feature()
@@ -3566,7 +3556,6 @@ _require_scratch_feature()
        esac
 }
 
-
 init_rc
 
 ################################################################################
index 720609492e41457d23701bc214e0536fbc4f541a..a6486270a972d51b164e5ceb9a3b4230368019a0 100755 (executable)
@@ -55,6 +55,7 @@ _cleanup()
 # get standard environment, filters and checks
 . ./common/rc
 . ./common/filter
+. ./common/module
 
 # remove previous $seqres.full before test
 rm -f $seqres.full
@@ -64,10 +65,8 @@ rm -f $seqres.full
 _supported_fs btrfs
 _supported_os Linux
 _require_scratch_dev_pool 2
-
-# the mounted test dir prevent btrfs unload, we need to unmount
 _test_unmount
-_require_btrfs_loadable
+_require_loadable_fs_module "btrfs"
 
 _scratch_dev_pool_get 2
 
@@ -102,7 +101,7 @@ echo "clean btrfs ko" >> $seqres.full
 _scratch_unmount
 
 # un-scan the btrfs devices
-_reload_btrfs_ko
+_reload_fs_module "btrfs"
 
 echo >> $seqres.full
 echo "-----Write degraded mount fill upto $max_fs_sz bytes-----" >> $seqres.full
@@ -141,7 +140,7 @@ echo
 echo "Mount degraded with the other dev"
 _scratch_unmount
 # un-scan the btrfs devices
-_reload_btrfs_ko
+_reload_fs_module "btrfs"
 _mount -o degraded $dev2 $SCRATCH_MNT >>$seqres.full 2>&1
 _run_btrfs_util_prog filesystem show
 checkpoint3=`md5sum $SCRATCH_MNT/tf2`
index 91aa8d8c3f4d0f3bad85aa6de01a0737b5d833fb..19961a172e164cb788bfcf270ac11882fceacc6b 100755 (executable)
@@ -54,6 +54,7 @@ _cleanup()
 # get standard environment, filters and checks
 . ./common/rc
 . ./common/filter
+. ./common/module
 
 # remove previous $seqres.full before test
 rm -f $seqres.full
@@ -63,10 +64,8 @@ rm -f $seqres.full
 _supported_fs btrfs
 _supported_os Linux
 _require_scratch_dev_pool 3
-
-# we need btrfs to unload, need test dir unmounted
 _test_unmount
-_require_btrfs_loadable
+_require_loadable_fs_module "btrfs"
 
 _scratch_dev_pool_get 3
 
@@ -118,7 +117,7 @@ echo "unmount" >> $seqres.full
 _scratch_unmount
 echo "clean btrfs ko" >> $seqres.full
 # un-scan the btrfs devices
-_reload_btrfs_ko
+_reload_fs_module "btrfs"
 _mount -o degraded,device=$dev2 $dev1 $SCRATCH_MNT >>$seqres.full 2>&1
 dd if=/dev/zero of="$SCRATCH_MNT"/tf2 bs=$bs count=$count \
                                        >>$seqres.full 2>&1
@@ -154,7 +153,7 @@ echo "Mount degraded but with other dev"
 
 _scratch_unmount
 # un-scan the btrfs devices
-_reload_btrfs_ko
+_reload_fs_module "btrfs"
 
 _mount -o degraded,device=${dev2} $dev3 $SCRATCH_MNT >>$seqres.full 2>&1