From: "Darrick J. Wong" <djwong@kernel.org>
To: Zorro Lang <zlang@redhat.com>
Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org,
tytso@mit.edu, leah.rumancik@gmail.com
Subject: Re: [PATCH 2/2] dmerror: support external log and realtime devices
Date: Sun, 31 Jul 2022 09:48:19 -0700 [thread overview]
Message-ID: <YuayU5+5XfgUTnIV@magnolia> (raw)
In-Reply-To: <20220730101834.6nscxoc2u3wfy7nq@zlang-mailbox>
On Sat, Jul 30, 2022 at 06:18:34PM +0800, Zorro Lang wrote:
> On Tue, Jul 26, 2022 at 12:48:42PM -0700, Darrick J. Wong wrote:
> > From: Darrick J. Wong <djwong@kernel.org>
> >
> > 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>
> > ---
>
> Hi Darrick,
>
> I'll merge the patch 1/2 this week, but this 2/2 looks like bring in new
> failures on ext4 with local.config as [0], for example[1], which is passed[2]
> without this patch. It's fine on Btrfs and xfs for me.
>
> Thanks,
> Zorro
>
> [0]
> export TEST_DEV=/dev/sda5
> export TEST_DIR=/mnt/test
> export SCRATCH_DEV=/dev/sda3
> export SCRATCH_MNT=/mnt/scratch
> export USE_EXTERNAL=yes
> export SCRATCH_LOGDEV=/dev/loop0
>
> [1]
> generic/338 4s ... - output mismatch (see /root/git/xfstests/results//logdev/generic/338.out.bad)
> --- tests/generic/338.out 2022-04-29 23:07:23.330499055 +0800
> +++ /root/git/xfstests/results//logdev/generic/338.out.bad 2022-07-30 18:01:41.900765965 +0800
> @@ -1,2 +1,4 @@
> QA output created by 338
> Silence is golden
> +mount: /mnt/scratch: wrong fs type, bad option, bad superblock on /dev/mapper/error-test, missing codepage or helper program, or other error.
> + dmesg(1) may have more information after failed mount system call.
Hmm, any chance you could post the dmesg that goes with this?
--D
> ...
> (Run 'diff -u /root/git/xfstests/tests/generic/338.out /root/git/xfstests/results//logdev/generic/338.out.bad' to see the entire diff)
> generic/441 5s ... - output mismatch (see /root/git/xfstests/results//logdev/generic/441.out.bad)
> --- tests/generic/441.out 2022-04-29 23:07:23.406499916 +0800
> +++ /root/git/xfstests/results//logdev/generic/441.out.bad 2022-07-30 18:01:46.829822438 +0800
> @@ -1,3 +1,6 @@
> QA output created by 441
> Format and mount
> -Test passed!
> +mount: /mnt/scratch: wrong fs type, bad option, bad superblock on /dev/mapper/error-test, missing codepage or helper program, or other error.
> + dmesg(1) may have more information after failed mount system call.
> +Success on second fsync on fd[0]!
> +umount: /mnt/scratch: not mounted.
> ...
> (Run 'diff -u /root/git/xfstests/tests/generic/441.out /root/git/xfstests/results//logdev/generic/441.out.bad' to see the entire diff)
>
> [2]
> generic/338 4s ... 5s
> generic/441 5s ... 5s
> generic/442 3s ... 3s
>
>
> > common/dmerror | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++--
> > tests/generic/441 | 2 -
> > tests/generic/487 | 2 -
> > 3 files changed, 156 insertions(+), 7 deletions(-)
> >
> >
> > diff --git a/common/dmerror b/common/dmerror
> > index 01a4c8b5..85ef9a16 100644
> > --- a/common/dmerror
> > +++ b/common/dmerror
> > @@ -4,25 +4,88 @@
> > #
> > # common functions for setting up and tearing down a dmerror device
> >
> > +_dmerror_setup_vars()
> > +{
> > + local backing_dev="$1"
> > + local tag="$2"
> > + local target="$3"
> > +
> > + test -z "$target" && target=error
> > + local blk_dev_size=$(blockdev --getsz "$backing_dev")
> > +
> > + 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\""
> > +}
> > +
> > _dmerror_setup()
> > {
> > - local dm_backing_dev=$SCRATCH_DEV
> > + local rt_target=
> > + local linear_target=
> >
> > - local blk_dev_size=`blockdev --getsz $dm_backing_dev`
> > + 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
> >
> > - export DMLINEAR_TABLE="0 $blk_dev_size linear $dm_backing_dev 0"
> > + # 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
> >
> > - export DMERROR_TABLE="0 $blk_dev_size error $dm_backing_dev 0"
> > + _dmerror_setup_vars $dm_backing_dev RT $rt_target
> > + fi
> > +
> > + # 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=$?
> >
> > diff --git a/tests/generic/441 b/tests/generic/441
> > index 0ec751da..85f29a3a 100755
> > --- a/tests/generic/441
> > +++ b/tests/generic/441
> > @@ -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
> > diff --git a/tests/generic/487 b/tests/generic/487
> > index fda8828d..3c9b2233 100755
> > --- a/tests/generic/487
> > +++ b/tests/generic/487
> > @@ -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
> >
>
next prev parent reply other threads:[~2022-07-31 16:48 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-26 19:48 [PATCHSET 0/2] dmerror: support external log and rt devices Darrick J. Wong
2022-07-26 19:48 ` [PATCH 1/2] common/rc: wait for udev before creating dm targets Darrick J. Wong
2022-07-28 17:52 ` Zorro Lang
2022-07-28 18:41 ` Christoph Hellwig
2022-08-08 5:32 ` Naohiro Aota
2022-07-26 19:48 ` [PATCH 2/2] dmerror: support external log and realtime devices Darrick J. Wong
2022-07-28 18:16 ` Zorro Lang
2022-07-30 10:18 ` Zorro Lang
2022-07-31 16:48 ` Darrick J. Wong [this message]
2022-07-31 18:10 ` Zorro Lang
2022-08-01 14:46 ` Zorro Lang
2022-08-01 21:10 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YuayU5+5XfgUTnIV@magnolia \
--to=djwong@kernel.org \
--cc=fstests@vger.kernel.org \
--cc=leah.rumancik@gmail.com \
--cc=linux-xfs@vger.kernel.org \
--cc=tytso@mit.edu \
--cc=zlang@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox