diff mbox

common: rework _require_ext4_mkfs_feature

Message ID 20171112133621.2474-1-tytso@mit.edu (mailing list archive)
State New, archived
Headers show

Commit Message

Theodore Ts'o Nov. 12, 2017, 1:36 p.m. UTC
In all of the places where we need check to see if mkfs.ext4 can
support a set of file system features, we also should be checking to
see if the kernel can support those file system features.  So rename
_require_ext4_mkfs_feature to _require_ext4_feature, and actually
format the file system in $SCRATCH.  To avoid running mkfs twice in
most tests, we will teach the tests to assume that
_require_ext4_feature actually leaves $SCRATCH formatted with a file
system with those features.

Also remove a completely unneeded _require_ext4_mkfs_feature "64bit"
from ext4/306.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
---

This is a replacement for "ext4/026: skip test if kernel does not
support the ea_inode feature"

 common/rc      | 28 ++++++++++------------------
 tests/ext4/003 |  3 +--
 tests/ext4/025 |  3 +--
 tests/ext4/026 |  3 +--
 tests/ext4/306 |  1 -
 5 files changed, 13 insertions(+), 25 deletions(-)

Comments

Eryu Guan Nov. 14, 2017, 11:43 a.m. UTC | #1
On Sun, Nov 12, 2017 at 08:36:21AM -0500, Theodore Ts'o wrote:
> In all of the places where we need check to see if mkfs.ext4 can
> support a set of file system features, we also should be checking to
> see if the kernel can support those file system features.  So rename
> _require_ext4_mkfs_feature to _require_ext4_feature, and actually
> format the file system in $SCRATCH.  To avoid running mkfs twice in
> most tests, we will teach the tests to assume that
> _require_ext4_feature actually leaves $SCRATCH formatted with a file
> system with those features.

Hmm, I don't think this the correct usage of _require rules. We use
_require rule to check if the requirements have been met, but don't
count on it to do any actual work. And we could always create a small
filesystem (say 512m) if we want to reduce the mkfs time in the _require
rule.

> 
> Also remove a completely unneeded _require_ext4_mkfs_feature "64bit"
> from ext4/306.
> 
> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
> ---
> 
> This is a replacement for "ext4/026: skip test if kernel does not
> support the ea_inode feature"
> 
>  common/rc      | 28 ++++++++++------------------
>  tests/ext4/003 |  3 +--
>  tests/ext4/025 |  3 +--
>  tests/ext4/026 |  3 +--
>  tests/ext4/306 |  1 -
>  5 files changed, 13 insertions(+), 25 deletions(-)
> 
> diff --git a/common/rc b/common/rc
> index da6213a0..3febf16f 100644
> --- a/common/rc
> +++ b/common/rc
> @@ -1899,31 +1899,23 @@ _require_scratch_ext4_crc()
>  	_scratch_unmount
>  }
>  
> -# Check the specified feature whether it is available in mkfs.ext4 or not.
> -_require_ext4_mkfs_feature()
> +# Check whether the specified feature whether it is supported by
> +# mkfs.ext4 and the kernel.
> +_require_ext4_feature()

How about naming it as _require_scratch_ext4_feature? So it indicates
that we assume $SCRATCH_DEV is present here and acts as a reminder to
_require_scratch first.

>  {
> -	local feature=$1
> -	local testfile=/tmp/$$.ext4_mkfs
> +	local feature="$1"
> +	local sz="$2"

Assign sz=512m unconditionally?

>  
>  	if [ -z "$feature" ]; then
> -                echo "Usage: _require_ext4_mkfs_feature feature"
> +                echo "Usage: _require_ext4_feature feature"
>                  exit 1
>          fi
>  
> -	touch $testfile
> -	local result=$($MKFS_EXT4_PROG -F -O $feature -n $testfile 512m 2>&1)
> -	rm -f $testfile
> -	echo $result | grep -q "Invalid filesystem option" && \
> -		_notrun "mkfs.ext4 doesn't support $feature feature"
> -}
> -
> -# this test requires the ext4 kernel support bigalloc feature
> -#
> -_require_ext4_bigalloc()
> -{
> -	$MKFS_EXT4_PROG -F -O bigalloc $SCRATCH_DEV 512m >/dev/null 2>&1
> +	$MKFS_EXT4_PROG -F $MKFS_OPTIONS -O "$feature" \
> +	    $SCRATCH_DEV $sz >>$seqres.full 2>&1 \
> +		|| _notrun "mkfs.ext4 doesn't support $feature feature"
>  	_scratch_mount >/dev/null 2>&1 \
> -	   || _notrun "Ext4 kernel doesn't support bigalloc feature"
> +		|| _notrun "Kernel doesn't support the ext4 feature: $feature"
>  	_scratch_unmount
>  }
>  
> diff --git a/tests/ext4/003 b/tests/ext4/003
> index 9be40178..2498632f 100755
> --- a/tests/ext4/003
> +++ b/tests/ext4/003
> @@ -38,8 +38,7 @@ _supported_fs ext4
>  _supported_os Linux
>  
>  _require_scratch
> -_require_ext4_mkfs_feature "bigalloc"
> -_require_ext4_bigalloc
> +_require_ext4_feature "bigalloc" "512m"
>  
>  rm -f $seqres.full
>  
> diff --git a/tests/ext4/025 b/tests/ext4/025
> index 49ecb462..013c1940 100755
> --- a/tests/ext4/025
> +++ b/tests/ext4/025
> @@ -48,10 +48,9 @@ _supported_fs ext4
>  _supported_os Linux
>  _require_scratch_nocheck
>  _require_command "$DEBUGFS_PROG" debugfs
> -_require_ext4_mkfs_feature "bigalloc,meta_bg,^resize_inode"
> +_require_ext4_feature "bigalloc,meta_bg,^resize_inode"
>  
>  echo "Create ext4 fs and modify first_meta_bg's value"
> -_scratch_mkfs "-O bigalloc,meta_bg,^resize_inode" >> $seqres.full 2>&1
>  
>  # set a big enough first_meta_bg to trigger buffer overrun
>  # 842150400 is from original fuzzed ext4 image in bug report
> diff --git a/tests/ext4/026 b/tests/ext4/026
> index 94a737ce..828b9b89 100755
> --- a/tests/ext4/026
> +++ b/tests/ext4/026
> @@ -50,9 +50,8 @@ _supported_fs ext4
>  _supported_os Linux
>  _require_scratch
>  _require_attrs
> -_require_ext4_mkfs_feature ea_inode
> +_require_ext4_feature "ea_inode"
>  
> -_scratch_mkfs_ext4 -O ea_inode >/dev/null 2>&1
>  _scratch_mount
>  
>  # Sets an extended attribute on a file.
> diff --git a/tests/ext4/306 b/tests/ext4/306
> index be765e6a..fa3b782d 100755
> --- a/tests/ext4/306
> +++ b/tests/ext4/306
> @@ -44,7 +44,6 @@ _supported_fs ext4
>  _supported_os Linux
>  
>  _require_scratch
> -_require_ext4_mkfs_feature "64bit"

This is actually for old distros that mkfs.ext4 doesn't support 64bit
feature, e.g. RHEL6. I think it's still meanful for now.

Thanks,
Eryu

>  
>  rm -f $seqres.full
>  
> -- 
> 2.11.0.rc0.7.gbe5a750
> 
> --
> To unsubscribe from this list: send the line "unsubscribe fstests" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Theodore Ts'o Nov. 14, 2017, 11:38 p.m. UTC | #2
On Tue, Nov 14, 2017 at 07:43:15PM +0800, Eryu Guan wrote:
> Hmm, I don't think this the correct usage of _require rules. We use
> _require rule to check if the requirements have been met, but don't
> count on it to do any actual work. And we could always create a small
> filesystem (say 512m) if we want to reduce the mkfs time in the _require
> rule.

I'm trying to avoid duplicating work; in most of the cases where we
call _require_ext4_feature, we immediately create a file system with
the given features.

My original version of the patch to modify an ext4 test simply open
coded the check for the failure and then ran "_notrun".  Which was
criticized because the reviewers thought that it should be factored
out into common code.  That's fine, but if we have to call mke2fs
twice, that would be sad....

> How about naming it as _require_scratch_ext4_feature? So it indicates
> that we assume $SCRATCH_DEV is present here and acts as a reminder to
> _require_scratch first.

Sure.  How about simply including _require_scratch into the function?

> 
> >  {
> > -	local feature=$1
> > -	local testfile=/tmp/$$.ext4_mkfs
> > +	local feature="$1"
> > +	local sz="$2"
> 
> Assign sz=512m unconditionally?

In half of the cases we actually want to format the file system to
take up the whole disk.  So if sz is not specified, we end up omitting
the size parameter to mke2fs, which is by design.

> > +++ b/tests/ext4/306
> > @@ -44,7 +44,6 @@ _supported_fs ext4
> >  _supported_os Linux
> >  
> >  _require_scratch
> > -_require_ext4_mkfs_feature "64bit"
> 
> This is actually for old distros that mkfs.ext4 doesn't support 64bit
> feature, e.g. RHEL6. I think it's still meanful for now.

The funny thing is that ext4/306 is actually formatting the file
system *without* 64-bit feature.  So the _require_ext4_mkfs_feature is
really trying to make sure that this mke2fs doesn't fail:

$MKFS_EXT4_PROG -F -O ^extents,^64bit $SCRATCH_DEV 512m

So what we can probably do is this:

features="^extents"
if grep -q 64bit /etc/mke2fs.conf ; then
    features="^extents,^64bit"
fi
$MKFS_EXT4_PROG -F -O $features $SCRATCH_DEV 512m

						- Ted
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Dave Chinner Nov. 15, 2017, 12:56 a.m. UTC | #3
On Tue, Nov 14, 2017 at 07:43:15PM +0800, Eryu Guan wrote:
> On Sun, Nov 12, 2017 at 08:36:21AM -0500, Theodore Ts'o wrote:
> > In all of the places where we need check to see if mkfs.ext4 can
> > support a set of file system features, we also should be checking to
> > see if the kernel can support those file system features.  So rename
> > _require_ext4_mkfs_feature to _require_ext4_feature, and actually
> > format the file system in $SCRATCH.  To avoid running mkfs twice in
> > most tests, we will teach the tests to assume that
> > _require_ext4_feature actually leaves $SCRATCH formatted with a file
> > system with those features.
> 
> Hmm, I don't think this the correct usage of _require rules. We use
> _require rule to check if the requirements have been met, but don't
> count on it to do any actual work. And we could always create a small
> filesystem (say 512m) if we want to reduce the mkfs time in the _require
> rule.

Implement, like in mkfs.xfs, the "-N" flag (a.k.a "--dry-run").
It does option parsing and geometry calculations, outputs the config
that would be made, then exits before doing any actual IO. Hence we
can check mkfs feature support on XFS, and only take the time to
make a filesystem if we need to check that kernel support exists.

Cheers,

Dave.
Theodore Ts'o Nov. 15, 2017, 2:57 a.m. UTC | #4
On Wed, Nov 15, 2017 at 11:56:55AM +1100, Dave Chinner wrote:
> Implement, like in mkfs.xfs, the "-N" flag (a.k.a "--dry-run").
> It does option parsing and geometry calculations, outputs the config
> that would be made, then exits before doing any actual IO. Hence we
> can check mkfs feature support on XFS, and only take the time to
> make a filesystem if we need to check that kernel support exists.

mke2fs has a -n option, but that's not what I'm trying to address.

Now that we want to *mount* the file system to check to see if the
kernel can support the file system feature, we can no longer use the
-n option.  And since the tests all need to create the file system
*anyway*, it seemed rather pointless to create it once, then do the
trial mount, and then creating the file system a second time.

      	     	      	       	   	       - Ted
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/common/rc b/common/rc
index da6213a0..3febf16f 100644
--- a/common/rc
+++ b/common/rc
@@ -1899,31 +1899,23 @@  _require_scratch_ext4_crc()
 	_scratch_unmount
 }
 
-# Check the specified feature whether it is available in mkfs.ext4 or not.
-_require_ext4_mkfs_feature()
+# Check whether the specified feature whether it is supported by
+# mkfs.ext4 and the kernel.
+_require_ext4_feature()
 {
-	local feature=$1
-	local testfile=/tmp/$$.ext4_mkfs
+	local feature="$1"
+	local sz="$2"
 
 	if [ -z "$feature" ]; then
-                echo "Usage: _require_ext4_mkfs_feature feature"
+                echo "Usage: _require_ext4_feature feature"
                 exit 1
         fi
 
-	touch $testfile
-	local result=$($MKFS_EXT4_PROG -F -O $feature -n $testfile 512m 2>&1)
-	rm -f $testfile
-	echo $result | grep -q "Invalid filesystem option" && \
-		_notrun "mkfs.ext4 doesn't support $feature feature"
-}
-
-# this test requires the ext4 kernel support bigalloc feature
-#
-_require_ext4_bigalloc()
-{
-	$MKFS_EXT4_PROG -F -O bigalloc $SCRATCH_DEV 512m >/dev/null 2>&1
+	$MKFS_EXT4_PROG -F $MKFS_OPTIONS -O "$feature" \
+	    $SCRATCH_DEV $sz >>$seqres.full 2>&1 \
+		|| _notrun "mkfs.ext4 doesn't support $feature feature"
 	_scratch_mount >/dev/null 2>&1 \
-	   || _notrun "Ext4 kernel doesn't support bigalloc feature"
+		|| _notrun "Kernel doesn't support the ext4 feature: $feature"
 	_scratch_unmount
 }
 
diff --git a/tests/ext4/003 b/tests/ext4/003
index 9be40178..2498632f 100755
--- a/tests/ext4/003
+++ b/tests/ext4/003
@@ -38,8 +38,7 @@  _supported_fs ext4
 _supported_os Linux
 
 _require_scratch
-_require_ext4_mkfs_feature "bigalloc"
-_require_ext4_bigalloc
+_require_ext4_feature "bigalloc" "512m"
 
 rm -f $seqres.full
 
diff --git a/tests/ext4/025 b/tests/ext4/025
index 49ecb462..013c1940 100755
--- a/tests/ext4/025
+++ b/tests/ext4/025
@@ -48,10 +48,9 @@  _supported_fs ext4
 _supported_os Linux
 _require_scratch_nocheck
 _require_command "$DEBUGFS_PROG" debugfs
-_require_ext4_mkfs_feature "bigalloc,meta_bg,^resize_inode"
+_require_ext4_feature "bigalloc,meta_bg,^resize_inode"
 
 echo "Create ext4 fs and modify first_meta_bg's value"
-_scratch_mkfs "-O bigalloc,meta_bg,^resize_inode" >> $seqres.full 2>&1
 
 # set a big enough first_meta_bg to trigger buffer overrun
 # 842150400 is from original fuzzed ext4 image in bug report
diff --git a/tests/ext4/026 b/tests/ext4/026
index 94a737ce..828b9b89 100755
--- a/tests/ext4/026
+++ b/tests/ext4/026
@@ -50,9 +50,8 @@  _supported_fs ext4
 _supported_os Linux
 _require_scratch
 _require_attrs
-_require_ext4_mkfs_feature ea_inode
+_require_ext4_feature "ea_inode"
 
-_scratch_mkfs_ext4 -O ea_inode >/dev/null 2>&1
 _scratch_mount
 
 # Sets an extended attribute on a file.
diff --git a/tests/ext4/306 b/tests/ext4/306
index be765e6a..fa3b782d 100755
--- a/tests/ext4/306
+++ b/tests/ext4/306
@@ -44,7 +44,6 @@  _supported_fs ext4
 _supported_os Linux
 
 _require_scratch
-_require_ext4_mkfs_feature "64bit"
 
 rm -f $seqres.full