Re: [PATCH] fstests: add support for JFFS2

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]



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@xxxxxxxxxx>
> ---
>  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
> 



[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux