From ea0b6eb8a2f9e457bbde174dad432905361be331 Mon Sep 17 00:00:00 2001 From: Dave Chinner Date: Mon, 20 Jan 2014 06:22:31 +0000 Subject: [PATCH] xfs: test scratch device mkfs features Some filesystem features are not compatible with certain tests, and so we need to do require tests to determine if they are supported. Some of these incompatibilities might be a result of optional mkfs parameters specified in MKFS_OPTIONS. In this case, we don't want scratch_mkfs_xfs stripping MKFS_OPTIONS and saying the feature is supported when the next _scratch_mkfs command in the test will result in a different mkfs command line. Hence add a "mkfs supported" function to run a non-destructive mkfs test to determine if the feature is supported by the current test's mkfs configuration. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Rich Johnston --- common/rc | 105 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 63 insertions(+), 42 deletions(-) diff --git a/common/rc b/common/rc index 68dc9a02..7a96484f 100644 --- a/common/rc +++ b/common/rc @@ -360,53 +360,73 @@ _setup_large_xfs_fs() return 0 } +_scratch_mkfs_xfs_opts() +{ + mkfs_opts=$* + + _scratch_options mkfs + + $MKFS_XFS_PROG $SCRATCH_OPTIONS $mkfs_opts $SCRATCH_DEV +} + + +_scratch_mkfs_xfs_supported() +{ + mkfs_opts=$* + + _scratch_options mkfs + + $MKFS_XFS_PROG -N $MKFS_OPTIONS $SCRATCH_OPTIONS $mkfs_opts $SCRATCH_DEV +} + _scratch_mkfs_xfs() { - # extra mkfs options can be added by tests - local extra_mkfs_options=$* + # extra mkfs options can be added by tests + local extra_mkfs_options=$* - local tmp_dir=/tmp/ + local tmp_dir=/tmp/ - _scratch_options mkfs + # save mkfs output in case conflict means we need to run again. + # only the output for the mkfs that applies should be shown + _scratch_mkfs_xfs_opts $MKFS_OPTIONS $extra_mkfs_options \ + 2>$tmp_dir.mkfserr 1>$tmp_dir.mkfsstd + local mkfs_status=$? - # save mkfs output in case conflict means we need to run again. - # only the output for the mkfs that applies should be shown - $MKFS_XFS_PROG $SCRATCH_OPTIONS $MKFS_OPTIONS $extra_mkfs_options $SCRATCH_DEV \ - 2>$tmp_dir.mkfserr 1>$tmp_dir.mkfsstd - local mkfs_status=$? - - # a mkfs failure may be caused by conflicts between - # $MKFS_OPTIONS and $extra_mkfs_options - - if [ $mkfs_status -ne 0 -a ! -z "$extra_mkfs_options" ]; then - echo "** mkfs failed with extra mkfs options added to \"$MKFS_OPTIONS\" by test $seq **" \ - >>$seqres.full - echo "** attempting to mkfs using only test $seq options: $extra_mkfs_options **" \ - >>$seqres.full - # running mkfs again. overwrite previous mkfs output files - $MKFS_XFS_PROG $SCRATCH_OPTIONS $extra_mkfs_options $SCRATCH_DEV \ - 2>$tmp_dir.mkfserr 1>$tmp_dir.mkfsstd - mkfs_status=$? - fi - if [ $mkfs_status -eq 0 -a "$LARGE_SCRATCH_DEV" = yes ]; then - # manually parse the mkfs output to get the fs size in bytes - local fs_size - fs_size=`cat $tmp_dir.mkfsstd | perl -ne ' - if (/^data\s+=\s+bsize=(\d+)\s+blocks=(\d+)/) { - my $size = $1 * $2; - print STDOUT "$size\n"; - }'` - _setup_large_xfs_fs $fs_size - mkfs_status=$? - fi + # a mkfs failure may be caused by conflicts between + # $MKFS_OPTIONS and $extra_mkfs_options + if [ $mkfs_status -ne 0 -a ! -z "$extra_mkfs_options" ]; then + ( + echo -n "** mkfs failed with extra mkfs options " + echo "added to \"$MKFS_OPTIONS\" by test $seq **" + echo -n "** attempting to mkfs using only test $seq " + echo "options: $extra_mkfs_options **" + ) >> $seqres.full + + # running mkfs again. overwrite previous mkfs output files + _scratch_mkfs_xfs_opts $extra_mkfs_options \ + 2>$tmp_dir.mkfserr 1>$tmp_dir.mkfsstd + local mkfs_status=$? + fi + + if [ $mkfs_status -eq 0 -a "$LARGE_SCRATCH_DEV" = yes ]; then + # manually parse the mkfs output to get the fs size in bytes + local fs_size + fs_size=`cat $tmp_dir.mkfsstd | perl -ne ' + if (/^data\s+=\s+bsize=(\d+)\s+blocks=(\d+)/) { + my $size = $1 * $2; + print STDOUT "$size\n"; + }'` + _setup_large_xfs_fs $fs_size + mkfs_status=$? + fi - # output stored mkfs output - cat $tmp_dir.mkfserr >&2 - cat $tmp_dir.mkfsstd - rm -f $tmp_dir.mkfserr $tmp_dir.mkfsstd + # output stored mkfs output + cat $tmp_dir.mkfserr >&2 + cat $tmp_dir.mkfsstd + rm -f $tmp_dir.mkfserr $tmp_dir.mkfsstd - return $mkfs_status + return $mkfs_status } # xfs_check script is planned to be deprecated. But, we want to @@ -1129,15 +1149,15 @@ _require_dm_flakey() # _require_projid32bit() { - _scratch_mkfs_xfs -f -i projid32bit=0 2>&1 >/dev/null \ - || _notrun "mkfs.xfs doesn't have projid32bit feature" + _scratch_mkfs_xfs_supported -i projid32bit=0 >/dev/null 2>&1 \ + || _notrun "mkfs.xfs doesn't have projid32bit feature" } # this test requires the crc feature to be available in mkfs.xfs # _require_xfs_mkfs_crc() { - _scratch_mkfs_xfs -f -m crc=1 >/dev/null 2>&1 \ + _scratch_mkfs_xfs_supported -m crc=1 >/dev/null 2>&1 \ || _notrun "mkfs.xfs doesn't have crc feature" } @@ -1145,6 +1165,7 @@ _require_xfs_mkfs_crc() # _require_xfs_crc() { + _scratch_mkfs_xfs -m crc=1 >/dev/null 2>&1 \ _scratch_mount >/dev/null 2>&1 \ || _notrun "Kernel doesn't support crc feature" umount $SCRATCH_MNT -- 2.30.2