On Wed, Aug 03, 2022 at 05:25:11PM -0700, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@xxxxxxxxxx> > > Create a _scratch_options backend for ext* so that we can inject > pathnames to external log devices into the scratch fs mount options. > This enables common/dm* to install block device filters, e.g. dm-error > for stress testing. > > Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> > v1.2: refactor _scratch_mkfs_ext4 to use _scratch_options too Self NAK, this still has broken bits... > --- > common/ext4 | 34 +++++++++++++++++++++++++++++++--- > common/rc | 3 +++ > 2 files changed, 34 insertions(+), 3 deletions(-) > > diff --git a/common/ext4 b/common/ext4 > index 287705af..8a3385af 100644 > --- a/common/ext4 > +++ b/common/ext4 > @@ -63,16 +63,24 @@ _setup_large_ext4_fs() > return 0 > } > > +_scratch_mkfs_ext4_opts() > +{ > + mkfs_opts=$* > + > + _scratch_options mkfs > + > + echo "$MKFS_EXT4_PROG -F $SCRATCH_OPTIONS $mkfs_opts" ...the -F should go in _scratch_ext4_options... > +} > + > _scratch_mkfs_ext4() > { > - local mkfs_cmd="$MKFS_EXT4_PROG -F" > + local mkfs_cmd="`_scratch_mkfs_ext4_opts`" > local mkfs_filter="grep -v -e ^Warning: -e \"^mke2fs \" | grep -v \"^$\"" > local tmp=`mktemp -u` > local mkfs_status > > [ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \ > - $mkfs_cmd -O journal_dev $MKFS_OPTIONS $SCRATCH_LOGDEV && \ > - mkfs_cmd="$mkfs_cmd -J device=$SCRATCH_LOGDEV" > + $MKFS_EXT4_PROG -F -O journal_dev $MKFS_OPTIONS $SCRATCH_LOGDEV > > _scratch_do_mkfs "$mkfs_cmd" "$mkfs_filter" $* 2>$tmp.mkfserr 1>$tmp.mkfsstd > mkfs_status=$? > @@ -154,3 +162,23 @@ _require_scratch_richacl_ext4() > || _notrun "kernel doesn't support richacl feature on $FSTYP" > _scratch_unmount > } > + > +_scratch_ext4_options() > +{ > + local type=$1 > + local log_opt="" > + > + case $type in > + mkfs) > + log_opt="-J device=$SCRATCH_LOGDEV" > + ;; > + mount) > + # As of kernel 5.19, the kernel mount option path parser only accepts > + # direct paths to block devices--the final path component cannot be a > + # symlink. > + log_opt="-o journal_path=$(realpath $SCRATCH_LOGDEV)" ...and this ought to be `realpath -q "$SCRATCH_LOGDEV"' to avoid breaking the non-external-journal case. > + ;; > + esac > + [ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \ > + SCRATCH_OPTIONS="$SCRATCH_OPTIONS ${log_opt}" Tab/space insanity here. --D > +} > diff --git a/common/rc b/common/rc > index dc1d65c3..b82bb36b 100644 > --- a/common/rc > +++ b/common/rc > @@ -178,6 +178,9 @@ _scratch_options() > "xfs") > _scratch_xfs_options "$@" > ;; > + ext2|ext3|ext4|ext4dev) > + _scratch_ext4_options "$@" > + ;; > esac > } >