fstests: add support for JFFS2
diff mbox series

Message ID 20190104085309.89520-1-houtao1@huawei.com
State New
Headers show
Series
  • fstests: add support for JFFS2
Related show

Commit Message

Hou Tao Jan. 4, 2019, 8:53 a.m. UTC
Mainly based on support for UBIFS, and there are two differences
between them.

The major difference is the definitions of TEST_DEV and SCRATCH_DEV
in local.config.

For UBIFS, TEST_DEV is something like /dev/ubi0_0. It's an UBI volume
and mount program will handle it correctly. For JFFS2, we can use
/dev/mtdblockX or mtdX, but can not use /dev/mtdX because mount program
will complain it is a character device and refuse to mount it.

If /dev/mtdblockX is used, test cases for blkdev will be runnable for
jffs2, but that will go against our intention because JFFS2 is a filesystem
used for MTD character device and is not a block filesystem. So we choose
to use mtdX as TEST_DEV & SCRATCH_DEV and take care of that during fs
check/mount/umount.

The minor difference is the procedures of making file-system: JFFS2 is
formatted by flash_erase instead of ubiupdatevol which is usedfor UBIFS.

Serveral bugs have already been spotted by it, especially the one found
by generic/097.

Signed-off-by: Hou Tao <houtao1@huawei.com>
---
 check         |  2 ++
 common/config | 13 +++++++++++++
 common/jffs2  | 23 +++++++++++++++++++++++
 common/rc     | 45 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 83 insertions(+)
 create mode 100644 common/jffs2

Comments

Eryu Guan Jan. 16, 2019, 12:09 p.m. UTC | #1
On Fri, Jan 04, 2019 at 04:53:09PM +0800, Hou Tao wrote:
> Mainly based on support for UBIFS, and there are two differences
> between them.

(Sorry for the late reivew..)

> 
> The major difference is the definitions of TEST_DEV and SCRATCH_DEV
> in local.config.
> 
> For UBIFS, TEST_DEV is something like /dev/ubi0_0. It's an UBI volume
> and mount program will handle it correctly. For JFFS2, we can use
> /dev/mtdblockX or mtdX, but can not use /dev/mtdX because mount program
> will complain it is a character device and refuse to mount it.
> 
> If /dev/mtdblockX is used, test cases for blkdev will be runnable for
> jffs2, but that will go against our intention because JFFS2 is a filesystem

I'm not familiar with jffs2, could you please give more details on this?
What problems have you seen when using /dev/mtdblockX as
TEST|SCRATCH_DEV? All the tests that have _require_block_device run for
jffs2 but they shouldn't?

If that's the case, I'd suggest to update the _require_block_device rule
to filter out jffs2 explicitly, so we don't have to special-case jffs2's
config.

> used for MTD character device and is not a block filesystem. So we choose
> to use mtdX as TEST_DEV & SCRATCH_DEV and take care of that during fs
> check/mount/umount.
> 
> The minor difference is the procedures of making file-system: JFFS2 is
> formatted by flash_erase instead of ubiupdatevol which is usedfor UBIFS.
> 
> Serveral bugs have already been spotted by it, especially the one found
> by generic/097.
> 
> Signed-off-by: Hou Tao <houtao1@huawei.com>
> ---
>  check         |  2 ++
>  common/config | 13 +++++++++++++
>  common/jffs2  | 23 +++++++++++++++++++++++
>  common/rc     | 45 +++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 83 insertions(+)
>  create mode 100644 common/jffs2
> 
> diff --git a/check b/check
> index e4d76737..6beef483 100755
> --- a/check
> +++ b/check
> @@ -60,6 +60,7 @@ check options
>      -pvfs2          test PVFS2
>      -tmpfs              test TMPFS
>      -ubifs              test ubifs
> +    -jffs2              test jffs2
>      -l			line mode diff
>      -udiff		show unified diff (default)
>      -n			show me, do not run tests
> @@ -264,6 +265,7 @@ while [ $# -gt 0 ]; do
>  	-pvfs2)		FSTYP=pvfs2 ;;
>  	-tmpfs)		FSTYP=tmpfs ;;
>  	-ubifs)		FSTYP=ubifs ;;
> +	-jffs2)		FSTYP=jffs2 ;;
>  
>  	-g)	group=$2 ; shift ;
>  		GROUP_LIST="$GROUP_LIST ${group//,/ }"
> diff --git a/common/config b/common/config
> index fb664cf0..f9e932f1 100644
> --- a/common/config
> +++ b/common/config
> @@ -190,6 +190,7 @@ export MAN_PROG="$(type -P man)"
>  export NFS4_SETFACL_PROG="$(type -P nfs4_setfacl)"
>  export NFS4_GETFACL_PROG="$(type -P nfs4_getfacl)"
>  export UBIUPDATEVOL_PROG="$(type -P ubiupdatevol)"
> +export FLASH_ERASE_PROG="$(type -P flash_erase)"
>  export THIN_CHECK_PROG="$(type -P thin_check)"
>  export PYTHON2_PROG="$(type -P python2)"
>  export SQLITE3_PROG="$(type -P sqlite3)"
> @@ -320,6 +321,9 @@ _mount_opts()
>  	ubifs)
>  		export MOUNT_OPTIONS=$UBIFS_MOUNT_OPTIONS
>  		;;
> +	jffs2)
> +		export MOUNT_OPTIONS=$JFFS2_MOUNT_OPTIONS
> +		;;
>  	*)
>  		;;
>  	esac
> @@ -472,6 +476,15 @@ _check_device()
>  			_fatal "common/config: $name ($dev) is not a directory for overlay"
>  		fi
>  		;;
> +	jffs2)
> +		if ! grep -q "${dev}:" /proc/mtd &>/dev/null ; then
> +			_fatal "common/config: $name ($dev) is not a MTD device"
> +		fi
> +		dev=/dev/$dev
> +		if [ ! -c $dev ]; then
> +			_fatal "common/config: $name ($dev) is not a character device"
> +		fi
> +		;;
>  	ubifs)
>  		if [ ! -c "$dev" ]; then
>  			_fatal "common/config: $name ($dev) is not a character device"
> diff --git a/common/jffs2 b/common/jffs2
> new file mode 100644
> index 00000000..20611195
> --- /dev/null
> +++ b/common/jffs2
> @@ -0,0 +1,23 @@
> +_jffs2_scratch_mount()
> +{
> +	_scratch_options mount
> +	_mount -t $FSTYP `_common_dev_mount_options $*` $SCRATCH_OPTIONS \
> +		$SCRATCH_DEV $SCRATCH_MNT
> +}
> +
> +_jffs2_test_mount()
> +{
> +	_test_options mount
> +	_mount -t $FSTYP $TEST_OPTIONS $TEST_FS_MOUNT_OPTS \
> +		$SELINUX_MOUNT_OPTIONS $* $TEST_DEV $TEST_DIR
> +}

It seems that above helpers don't do anything special than the default
behavior in _test|scratch_mount() functions, they have the same commands
and options. Did I miss anything?

> +
> +_jffs2_scratch_unmount()
> +{
> +	$UMOUNT_PROG $SCRATCH_MNT
> +}
> +
> +_jffs2_test_unmount()
> +{
> +	$UMOUNT_PROG $TEST_DIR
> +}

We could just open-code $UMOUNT_PROG $TEST_DIR ($SCRATCH_MNT) in
_test|scratch_unmount(), then we could get rid of common/jffs2 file.

Thanks,
Eryu

> diff --git a/common/rc b/common/rc
> index b8ed1776..887f35ea 100644
> --- a/common/rc
> +++ b/common/rc
> @@ -158,6 +158,10 @@ case "$FSTYP" in
>      ubifs)
>  	[ "$UBIUPDATEVOL_PROG" = "" ] && _fatal "ubiupdatevol not found"
>  	;;
> +	jffs2)
> +	[ "$FLASH_ERASE_PROG" = "" ] && _fatal "flash_erase not found"
> +	. ./common/jffs2
> +	;;
>  esac
>  
>  if [ ! -z "$REPORT_LIST" ]; then
> @@ -327,6 +331,9 @@ _try_scratch_mount()
>  	if [ "$FSTYP" == "overlay" ]; then
>  		_overlay_scratch_mount $*
>  		return $?
> +	elif [ "$FSTYP" == "jffs2" ]; then
> +		_jffs2_scratch_mount $*
> +		return $?
>  	fi
>  	_mount -t $FSTYP `_scratch_mount_options $*`
>  }
> @@ -346,6 +353,9 @@ _scratch_unmount()
>  	btrfs)
>  		$UMOUNT_PROG $SCRATCH_MNT
>  		;;
> +	jffs2)
> +		_jffs2_scratch_unmount
> +		;;
>  	*)
>  		$UMOUNT_PROG $SCRATCH_DEV
>  		;;
> @@ -398,6 +408,9 @@ _test_mount()
>      if [ "$FSTYP" == "overlay" ]; then
>          _overlay_test_mount $*
>          return $?
> +    elif [ "$FSTYP" == "jffs2" ]; then
> +        _jffs2_test_mount $*
> +        return $?
>      fi
>      _test_options mount
>      _mount -t $FSTYP $TEST_OPTIONS $TEST_FS_MOUNT_OPTS $SELINUX_MOUNT_OPTIONS $* $TEST_DEV $TEST_DIR
> @@ -407,6 +420,8 @@ _test_unmount()
>  {
>  	if [ "$FSTYP" == "overlay" ]; then
>  		_overlay_test_unmount
> +	elif [ "$FSTYP" == "jffs2" ]; then
> +		_jffs2_test_unmount
>  	else
>  		$UMOUNT_PROG $TEST_DEV
>  	fi
> @@ -709,6 +724,12 @@ _scratch_mkfs()
>  		$UBIUPDATEVOL_PROG ${SCRATCH_DEV} -t
>  		return 0
>  		;;
> +	jffs2)
> +		# erase the whole MTD device for jffs2
> +		# it will be reformatted automatically on next mount
> +		$FLASH_ERASE_PROG -j -q /dev/${SCRATCH_DEV} 0 0
> +		return $?
> +		;;
>  	ext4)
>  		_scratch_mkfs_ext4 $*
>  		return $?
> @@ -1505,6 +1526,15 @@ _require_scratch_nocheck()
>  		    _notrun "this test requires a valid \$SCRATCH_MNT and unique $SCRATCH_DEV"
>  		fi
>  		;;
> +	jffs2)
> +		# jffs2 needs a MTD device
> +		if [ ! -c "/dev/$SCRATCH_DEV" ]; then
> +			_notrun "this test requires a valid MTD device for \$SCRATCH_DEV"
> +		fi
> +		if [ ! -d "$SCRATCH_MNT" ]; then
> +			_notrun "this test requires a valid \$SCRATCH_MNT"
> +		fi
> +		;;
>  	ubifs)
>  		# ubifs needs an UBI volume. This will be a char device, not a block device.
>  		if [ ! -c "$SCRATCH_DEV" ]; then
> @@ -1626,6 +1656,15 @@ _require_test()
>  		    _notrun "this test requires a valid \$TEST_DIR and unique $TEST_DEV"
>  		fi
>  		;;
> +	jffs2)
> +		# jffs2 needs a MTD device
> +		if [ ! -c /dev/"$TEST_DEV" ]; then
> +			_notrun "this test requires a valid MTD device for \$TEST_DEV"
> +		fi
> +		if [ ! -d "$TEST_DIR" ]; then
> +			_notrun "this test requires a valid \$TEST_DIR"
> +		fi
> +		;;
>  	ubifs)
>  		# ubifs needs an UBI volume. This will be a char device, not a block device.
>  		if [ ! -c "$TEST_DEV" ]; then
> @@ -2624,6 +2663,9 @@ _check_test_fs()
>      ubifs)
>  	# there is no fsck program for ubifs yet
>  	;;
> +	jffs2)
> +	# there is no fsck program for jffs2
> +	;;
>      *)
>  	_check_generic_filesystem $TEST_DEV
>  	;;
> @@ -2679,6 +2721,9 @@ _check_scratch_fs()
>      ubifs)
>  	# there is no fsck program for ubifs yet
>  	;;
> +    jffs2)
> +	# there is no fsck program for jffs2
> +	;;
>      *)
>  	_check_generic_filesystem $device
>  	;;
> -- 
> 2.16.2.dirty
>

Patch
diff mbox series

diff --git a/check b/check
index e4d76737..6beef483 100755
--- a/check
+++ b/check
@@ -60,6 +60,7 @@  check options
     -pvfs2          test PVFS2
     -tmpfs              test TMPFS
     -ubifs              test ubifs
+    -jffs2              test jffs2
     -l			line mode diff
     -udiff		show unified diff (default)
     -n			show me, do not run tests
@@ -264,6 +265,7 @@  while [ $# -gt 0 ]; do
 	-pvfs2)		FSTYP=pvfs2 ;;
 	-tmpfs)		FSTYP=tmpfs ;;
 	-ubifs)		FSTYP=ubifs ;;
+	-jffs2)		FSTYP=jffs2 ;;
 
 	-g)	group=$2 ; shift ;
 		GROUP_LIST="$GROUP_LIST ${group//,/ }"
diff --git a/common/config b/common/config
index fb664cf0..f9e932f1 100644
--- a/common/config
+++ b/common/config
@@ -190,6 +190,7 @@  export MAN_PROG="$(type -P man)"
 export NFS4_SETFACL_PROG="$(type -P nfs4_setfacl)"
 export NFS4_GETFACL_PROG="$(type -P nfs4_getfacl)"
 export UBIUPDATEVOL_PROG="$(type -P ubiupdatevol)"
+export FLASH_ERASE_PROG="$(type -P flash_erase)"
 export THIN_CHECK_PROG="$(type -P thin_check)"
 export PYTHON2_PROG="$(type -P python2)"
 export SQLITE3_PROG="$(type -P sqlite3)"
@@ -320,6 +321,9 @@  _mount_opts()
 	ubifs)
 		export MOUNT_OPTIONS=$UBIFS_MOUNT_OPTIONS
 		;;
+	jffs2)
+		export MOUNT_OPTIONS=$JFFS2_MOUNT_OPTIONS
+		;;
 	*)
 		;;
 	esac
@@ -472,6 +476,15 @@  _check_device()
 			_fatal "common/config: $name ($dev) is not a directory for overlay"
 		fi
 		;;
+	jffs2)
+		if ! grep -q "${dev}:" /proc/mtd &>/dev/null ; then
+			_fatal "common/config: $name ($dev) is not a MTD device"
+		fi
+		dev=/dev/$dev
+		if [ ! -c $dev ]; then
+			_fatal "common/config: $name ($dev) is not a character device"
+		fi
+		;;
 	ubifs)
 		if [ ! -c "$dev" ]; then
 			_fatal "common/config: $name ($dev) is not a character device"
diff --git a/common/jffs2 b/common/jffs2
new file mode 100644
index 00000000..20611195
--- /dev/null
+++ b/common/jffs2
@@ -0,0 +1,23 @@ 
+_jffs2_scratch_mount()
+{
+	_scratch_options mount
+	_mount -t $FSTYP `_common_dev_mount_options $*` $SCRATCH_OPTIONS \
+		$SCRATCH_DEV $SCRATCH_MNT
+}
+
+_jffs2_test_mount()
+{
+	_test_options mount
+	_mount -t $FSTYP $TEST_OPTIONS $TEST_FS_MOUNT_OPTS \
+		$SELINUX_MOUNT_OPTIONS $* $TEST_DEV $TEST_DIR
+}
+
+_jffs2_scratch_unmount()
+{
+	$UMOUNT_PROG $SCRATCH_MNT
+}
+
+_jffs2_test_unmount()
+{
+	$UMOUNT_PROG $TEST_DIR
+}
diff --git a/common/rc b/common/rc
index b8ed1776..887f35ea 100644
--- a/common/rc
+++ b/common/rc
@@ -158,6 +158,10 @@  case "$FSTYP" in
     ubifs)
 	[ "$UBIUPDATEVOL_PROG" = "" ] && _fatal "ubiupdatevol not found"
 	;;
+	jffs2)
+	[ "$FLASH_ERASE_PROG" = "" ] && _fatal "flash_erase not found"
+	. ./common/jffs2
+	;;
 esac
 
 if [ ! -z "$REPORT_LIST" ]; then
@@ -327,6 +331,9 @@  _try_scratch_mount()
 	if [ "$FSTYP" == "overlay" ]; then
 		_overlay_scratch_mount $*
 		return $?
+	elif [ "$FSTYP" == "jffs2" ]; then
+		_jffs2_scratch_mount $*
+		return $?
 	fi
 	_mount -t $FSTYP `_scratch_mount_options $*`
 }
@@ -346,6 +353,9 @@  _scratch_unmount()
 	btrfs)
 		$UMOUNT_PROG $SCRATCH_MNT
 		;;
+	jffs2)
+		_jffs2_scratch_unmount
+		;;
 	*)
 		$UMOUNT_PROG $SCRATCH_DEV
 		;;
@@ -398,6 +408,9 @@  _test_mount()
     if [ "$FSTYP" == "overlay" ]; then
         _overlay_test_mount $*
         return $?
+    elif [ "$FSTYP" == "jffs2" ]; then
+        _jffs2_test_mount $*
+        return $?
     fi
     _test_options mount
     _mount -t $FSTYP $TEST_OPTIONS $TEST_FS_MOUNT_OPTS $SELINUX_MOUNT_OPTIONS $* $TEST_DEV $TEST_DIR
@@ -407,6 +420,8 @@  _test_unmount()
 {
 	if [ "$FSTYP" == "overlay" ]; then
 		_overlay_test_unmount
+	elif [ "$FSTYP" == "jffs2" ]; then
+		_jffs2_test_unmount
 	else
 		$UMOUNT_PROG $TEST_DEV
 	fi
@@ -709,6 +724,12 @@  _scratch_mkfs()
 		$UBIUPDATEVOL_PROG ${SCRATCH_DEV} -t
 		return 0
 		;;
+	jffs2)
+		# erase the whole MTD device for jffs2
+		# it will be reformatted automatically on next mount
+		$FLASH_ERASE_PROG -j -q /dev/${SCRATCH_DEV} 0 0
+		return $?
+		;;
 	ext4)
 		_scratch_mkfs_ext4 $*
 		return $?
@@ -1505,6 +1526,15 @@  _require_scratch_nocheck()
 		    _notrun "this test requires a valid \$SCRATCH_MNT and unique $SCRATCH_DEV"
 		fi
 		;;
+	jffs2)
+		# jffs2 needs a MTD device
+		if [ ! -c "/dev/$SCRATCH_DEV" ]; then
+			_notrun "this test requires a valid MTD device for \$SCRATCH_DEV"
+		fi
+		if [ ! -d "$SCRATCH_MNT" ]; then
+			_notrun "this test requires a valid \$SCRATCH_MNT"
+		fi
+		;;
 	ubifs)
 		# ubifs needs an UBI volume. This will be a char device, not a block device.
 		if [ ! -c "$SCRATCH_DEV" ]; then
@@ -1626,6 +1656,15 @@  _require_test()
 		    _notrun "this test requires a valid \$TEST_DIR and unique $TEST_DEV"
 		fi
 		;;
+	jffs2)
+		# jffs2 needs a MTD device
+		if [ ! -c /dev/"$TEST_DEV" ]; then
+			_notrun "this test requires a valid MTD device for \$TEST_DEV"
+		fi
+		if [ ! -d "$TEST_DIR" ]; then
+			_notrun "this test requires a valid \$TEST_DIR"
+		fi
+		;;
 	ubifs)
 		# ubifs needs an UBI volume. This will be a char device, not a block device.
 		if [ ! -c "$TEST_DEV" ]; then
@@ -2624,6 +2663,9 @@  _check_test_fs()
     ubifs)
 	# there is no fsck program for ubifs yet
 	;;
+	jffs2)
+	# there is no fsck program for jffs2
+	;;
     *)
 	_check_generic_filesystem $TEST_DEV
 	;;
@@ -2679,6 +2721,9 @@  _check_scratch_fs()
     ubifs)
 	# there is no fsck program for ubifs yet
 	;;
+    jffs2)
+	# there is no fsck program for jffs2
+	;;
     *)
 	_check_generic_filesystem $device
 	;;