]> git-server-git.apps.pok.os.sepia.ceph.com Git - xfstests-dev.git/commitdiff
dmerror: support external log and realtime devices
authorDarrick J. Wong <djwong@kernel.org>
Tue, 9 Aug 2022 21:01:06 +0000 (14:01 -0700)
committerZorro Lang <zlang@kernel.org>
Sat, 20 Aug 2022 14:09:00 +0000 (22:09 +0800)
Upgrade the dmerror code to coordinate making external scratch log and
scratch realtime devices error out along with the scratch device.  Note
that unlike SCRATCH_DEV, we save the old rt/log devices in a separate
variable and overwrite SCRATCH_{RT,LOG}DEV so that all the helper
functions continue to work properly.

This is very similar to what we did for dm-flakey a while back.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Zorro Lang <zlang@redhat.com>
Signed-off-by: Zorro Lang <zlang@kernel.org>
common/dmerror
tests/generic/441
tests/generic/487

index 01a4c8b5e52d3cd4469bfd911504577a7dd25c5a..0934d220343b22c3b9af3e2a4c065543217a6e89 100644 (file)
@@ -4,25 +4,88 @@
 #
 # common functions for setting up and tearing down a dmerror device
 
-_dmerror_setup()
+_dmerror_setup_vars()
 {
-       local dm_backing_dev=$SCRATCH_DEV
+       local backing_dev="$1"
+       local tag="$2"
+       local target="$3"
 
-       local blk_dev_size=`blockdev --getsz $dm_backing_dev`
+       test -z "$target" && target=error
+       local blk_dev_size=$(blockdev --getsz "$backing_dev")
 
-       export DMERROR_DEV='/dev/mapper/error-test'
+       eval export "DMLINEAR_${tag}TABLE=\"0 $blk_dev_size linear $backing_dev 0\""
+       eval export "DMERROR_${tag}TABLE=\"0 $blk_dev_size $target $backing_dev 0\""
+}
 
-       export DMLINEAR_TABLE="0 $blk_dev_size linear $dm_backing_dev 0"
+_dmerror_setup()
+{
+       local rt_target=
+       local log_target=
+
+       for arg in "$@"; do
+               case "${arg}" in
+               no_rt)          rt_target=linear;;
+               no_log)         log_target=linear;;
+               *)              echo "${arg}: Unknown _dmerror_setup arg.";;
+               esac
+       done
+
+       # Scratch device
+       export DMERROR_DEV='/dev/mapper/error-test'
+       _dmerror_setup_vars $SCRATCH_DEV
+
+       # Realtime device.  We reassign SCRATCH_RTDEV so that all the scratch
+       # helpers continue to work unmodified.
+       if [ -n "$SCRATCH_RTDEV" ]; then
+               if [ -z "$NON_ERROR_RTDEV" ]; then
+                       # Set up the device switch
+                       local dm_backing_dev=$SCRATCH_RTDEV
+                       export NON_ERROR_RTDEV="$SCRATCH_RTDEV"
+                       SCRATCH_RTDEV='/dev/mapper/error-rttest'
+               else
+                       # Already set up; recreate tables
+                       local dm_backing_dev="$NON_ERROR_RTDEV"
+               fi
+
+               _dmerror_setup_vars $dm_backing_dev RT $rt_target
+       fi
 
-       export DMERROR_TABLE="0 $blk_dev_size error $dm_backing_dev 0"
+       # External log device.  We reassign SCRATCH_LOGDEV so that all the
+       # scratch helpers continue to work unmodified.
+       if [ -n "$SCRATCH_LOGDEV" ]; then
+               if [ -z "$NON_ERROR_LOGDEV" ]; then
+                       # Set up the device switch
+                       local dm_backing_dev=$SCRATCH_LOGDEV
+                       export NON_ERROR_LOGDEV="$SCRATCH_LOGDEV"
+                       SCRATCH_LOGDEV='/dev/mapper/error-logtest'
+               else
+                       # Already set up; recreate tables
+                       local dm_backing_dev="$NON_ERROR_LOGDEV"
+               fi
+
+               _dmerror_setup_vars $dm_backing_dev LOG $log_target
+       fi
 }
 
 _dmerror_init()
 {
-       _dmerror_setup
+       _dmerror_setup "$@"
+
        _dmsetup_remove error-test
        _dmsetup_create error-test --table "$DMLINEAR_TABLE" || \
                _fatal "failed to create dm linear device"
+
+       if [ -n "$NON_ERROR_RTDEV" ]; then
+               _dmsetup_remove error-rttest
+               _dmsetup_create error-rttest --table "$DMLINEAR_RTTABLE" || \
+                       _fatal "failed to create dm linear rt device"
+       fi
+
+       if [ -n "$NON_ERROR_LOGDEV" ]; then
+               _dmsetup_remove error-logtest
+               _dmsetup_create error-logtest --table "$DMLINEAR_LOGTABLE" || \
+                       _fatal "failed to create dm linear log device"
+       fi
 }
 
 _dmerror_mount()
@@ -39,11 +102,27 @@ _dmerror_unmount()
 
 _dmerror_cleanup()
 {
+       test -n "$NON_ERROR_LOGDEV" && $DMSETUP_PROG resume error-logtest &>/dev/null
+       test -n "$NON_ERROR_RTDEV" && $DMSETUP_PROG resume error-rttest &>/dev/null
        $DMSETUP_PROG resume error-test > /dev/null 2>&1
+
        $UMOUNT_PROG $SCRATCH_MNT > /dev/null 2>&1
+
+       test -n "$NON_ERROR_LOGDEV" && _dmsetup_remove error-logtest
+       test -n "$NON_ERROR_RTDEV" && _dmsetup_remove error-rttest
        _dmsetup_remove error-test
 
        unset DMERROR_DEV DMLINEAR_TABLE DMERROR_TABLE
+
+       if [ -n "$NON_ERROR_LOGDEV" ]; then
+               SCRATCH_LOGDEV="$NON_ERROR_LOGDEV"
+               unset NON_ERROR_LOGDEV DMLINEAR_LOGTABLE DMERROR_LOGTABLE
+       fi
+
+       if [ -n "$NON_ERROR_RTDEV" ]; then
+               SCRATCH_RTDEV="$NON_ERROR_RTDEV"
+               unset NON_ERROR_RTDEV DMLINEAR_RTTABLE DMERROR_RTTABLE
+       fi
 }
 
 _dmerror_load_error_table()
@@ -59,12 +138,47 @@ _dmerror_load_error_table()
                suspend_opt="$*"
        fi
 
+       # Suspend the scratch device before the log and realtime devices so
+       # that the kernel can freeze and flush the filesystem if the caller
+       # wanted a freeze.
        $DMSETUP_PROG suspend $suspend_opt error-test
        [ $? -ne 0 ] && _fail  "dmsetup suspend failed"
 
+       if [ -n "$NON_ERROR_RTDEV" ]; then
+               $DMSETUP_PROG suspend $suspend_opt error-rttest
+               [ $? -ne 0 ] && _fail "failed to suspend error-rttest"
+       fi
+
+       if [ -n "$NON_ERROR_LOGDEV" ]; then
+               $DMSETUP_PROG suspend $suspend_opt error-logtest
+               [ $? -ne 0 ] && _fail "failed to suspend error-logtest"
+       fi
+
+       # Load new table
        $DMSETUP_PROG load error-test --table "$DMERROR_TABLE"
        load_res=$?
 
+       if [ -n "$NON_ERROR_RTDEV" ]; then
+               $DMSETUP_PROG load error-rttest --table "$DMERROR_RTTABLE"
+               [ $? -ne 0 ] && _fail "failed to load error table into error-rttest"
+       fi
+
+       if [ -n "$NON_ERROR_LOGDEV" ]; then
+               $DMSETUP_PROG load error-logtest --table "$DMERROR_LOGTABLE"
+               [ $? -ne 0 ] && _fail "failed to load error table into error-logtest"
+       fi
+
+       # Resume devices in the opposite order that we suspended them.
+       if [ -n "$NON_ERROR_LOGDEV" ]; then
+               $DMSETUP_PROG resume error-logtest
+               [ $? -ne 0 ] && _fail  "failed to resume error-logtest"
+       fi
+
+       if [ -n "$NON_ERROR_RTDEV" ]; then
+               $DMSETUP_PROG resume error-rttest
+               [ $? -ne 0 ] && _fail  "failed to resume error-rttest"
+       fi
+
        $DMSETUP_PROG resume error-test
        resume_res=$?
 
@@ -85,12 +199,47 @@ _dmerror_load_working_table()
                suspend_opt="$*"
        fi
 
+       # Suspend the scratch device before the log and realtime devices so
+       # that the kernel can freeze and flush the filesystem if the caller
+       # wanted a freeze.
        $DMSETUP_PROG suspend $suspend_opt error-test
        [ $? -ne 0 ] && _fail  "dmsetup suspend failed"
 
+       if [ -n "$NON_ERROR_RTDEV" ]; then
+               $DMSETUP_PROG suspend $suspend_opt error-rttest
+               [ $? -ne 0 ] && _fail "failed to suspend error-rttest"
+       fi
+
+       if [ -n "$NON_ERROR_LOGDEV" ]; then
+               $DMSETUP_PROG suspend $suspend_opt error-logtest
+               [ $? -ne 0 ] && _fail "failed to suspend error-logtest"
+       fi
+
+       # Load new table
        $DMSETUP_PROG load error-test --table "$DMLINEAR_TABLE"
        load_res=$?
 
+       if [ -n "$NON_ERROR_RTDEV" ]; then
+               $DMSETUP_PROG load error-rttest --table "$DMLINEAR_RTTABLE"
+               [ $? -ne 0 ] && _fail "failed to load working table into error-rttest"
+       fi
+
+       if [ -n "$NON_ERROR_LOGDEV" ]; then
+               $DMSETUP_PROG load error-logtest --table "$DMLINEAR_LOGTABLE"
+               [ $? -ne 0 ] && _fail "failed to load working table into error-logtest"
+       fi
+
+       # Resume devices in the opposite order that we suspended them.
+       if [ -n "$NON_ERROR_LOGDEV" ]; then
+               $DMSETUP_PROG resume error-logtest
+               [ $? -ne 0 ] && _fail  "failed to resume error-logtest"
+       fi
+
+       if [ -n "$NON_ERROR_RTDEV" ]; then
+               $DMSETUP_PROG resume error-rttest
+               [ $? -ne 0 ] && _fail  "failed to resume error-rttest"
+       fi
+
        $DMSETUP_PROG resume error-test
        resume_res=$?
 
index 0ec751daf72429f1b930294f59e0390a9001c529..85f29a3a8a747d5ca8f03e94d6a47b74b1f5100f 100755 (executable)
@@ -52,7 +52,7 @@ unset SCRATCH_RTDEV
 
 echo "Format and mount"
 _scratch_mkfs > $seqres.full 2>&1
-_dmerror_init
+_dmerror_init no_log
 _dmerror_mount
 
 _require_fs_space $SCRATCH_MNT 65536
index fda8828df1a31b8b1d4b0936407ec1f29be5069f..3c9b223325d6f5148022fa935cebe98b8579c2dd 100755 (executable)
@@ -45,7 +45,7 @@ unset SCRATCH_RTDEV
 
 echo "Format and mount"
 _scratch_mkfs > $seqres.full 2>&1
-_dmerror_init
+_dmerror_init no_log
 _dmerror_mount
 
 datalen=65536