[PATCH] Add UBIFS support

Dave Chinner david at fromorbit.com
Tue Sep 16 21:47:23 PDT 2014


On Tue, Sep 16, 2014 at 03:50:50PM +0200, Richard Weinberger wrote:
> Am 15.09.2014 23:52, schrieb Dave Chinner:
> > On Mon, Sep 15, 2014 at 11:11:20AM +0200, Richard Weinberger wrote:
> >> UBIFS needs some extra care, the device node is of type character and
> >> it has no fsck tool.
> > 
> > Not being familiar with UBIFS, the explaination is rather brief and
> > doesn't explain anything to me. Can you document how where supposed
> > to treat a filesystem that doesn't exist on a block device for all
> > the tests that assume that the local fileystem is on a block device?
> > e.g. how do all the generic tests that use loopback devices work?
> > What about dm-flakey?
> 
> UBIFS is a filesystem designed for MTD devices.
> It works on top of UBI which is kind of a LVM for NAND and NOR flashes.
> On Linux MTD devices are represented as character devices, this is why
> the UBI device nodes are of type character.

Ok, so that needs to be in the commit message, and a comment
where we validate the device config on startup.  ;)

> For more details please see:
> http://www.linux-mtd.infradead.org/doc/ubi.html
> http://www.linux-mtd.infradead.org/doc/ubifs.html
> 
> Of course UBIFS will not work on top of loop or dm-flakey.
> AFAIK the generic tests don't use them anyway.

Generic tests do use dm-flakey:

$ git grep _require_dm_flakey tests/generic
tests/generic/311:_require_dm_flakey
tests/generic/321:_require_dm_flakey
tests/generic/322:_require_dm_flakey
tests/generic/325:_require_dm_flakey
$

There's no reason why generic tests can't use the loop device,
either. Indeed, 10 days ago we added an abstraction to allow generic
tests to easily use the loop device (i.e. added _mkfs_dev).

> I'd like to have UBIFS tested with xfstests because xfstests has a very
> good set of generic fs tests.

Understood - all I'm trying to do is work out what exactly what the
impact of TEST_DEV/SCRATCH_DEV not being block devices on a local
filesystem. Network filesystems are sufficiently different that this
isn't an issue, but char vs block local devices is a little more
subtle.

> Currently UBIFS fails 20 out of 76 generic tests.

Hmmm - there's ~140 generic tests in the auto group - I would have
expected a lot more of them to run than 76....

> At least one issue is real. As soon I have the time I'll
> inspect all other failures in detail.

... and what I'm particularly interested in is how many of those
are a result of tests assumes that they are running on a block or
network device.

> >> diff --git a/check b/check
> >> index 42a1ac2..57ec612 100755
> >> --- a/check
> >> +++ b/check
> >> @@ -70,6 +70,7 @@ check options
> >>      -nfs                test NFS
> >>      -cifs               test CIFS
> >>      -tmpfs              test TMPFS
> >> +    -ubifs              test UBIFS
> >>      -l			line mode diff
> >>      -udiff		show unified diff (default)
> >>      -n			show me, do not run tests
> > 
> > I'd like to avoid adding command line switches for random filesystem
> > types if at all possible. I'd much prefer that it be derived from
> > the current TEST_DEV if at all possible. Can you probe for UBIFS
> > similar to using blkid for local filesystems?
> 
> I fear blkid does not detect UBIFS, but we can match it from the device node name.
> UBIFS can only work on top of an UBI volume. UBI volumes have names like /dev/ubiX_Y.
> Where X is the UBI image number and Y the volume number.

Ok, so that probing can be done fairly easily. Right at the end of
common/config there's a blkid command run to grab the FSTYP value
from the $TEST_DEV. If returns a null, then we can check for it
being a UBI volume and set FSTYP automatically.

> >> diff --git a/common/config b/common/config
> >> index fc21b37..af082ea 100644
> >> --- a/common/config
> >> +++ b/common/config
> >> @@ -430,7 +430,7 @@ get_next_config() {
> >>  		exit 1
> >>  	fi
> >>  
> >> -	echo $TEST_DEV | grep -qE ":|//" > /dev/null 2>&1
> >> +	echo $TEST_DEV | grep -qE ":|//|ubi" > /dev/null 2>&1
> >>  	if [ ! -b "$TEST_DEV" -a "$?" != "0" ]; then
> >>  		echo "common/config: Error: \$TEST_DEV ($TEST_DEV) is not a block device or a network filesystem"
> >>  		exit 1
> > 
> > Needs a comment explaining what format we are searching for there?
> 
> See above. I match the string "ubi" in /dev/ubiX_Y.

Ok, I can see the match, but you're not validating that it is a char
device once you have a match, and so that will accept anything with
"/ubi" in it....

> >> @@ -453,7 +453,7 @@ get_next_config() {
> >>  		export SCRATCH_DEV_NOT_SET=true
> >>  	fi
> >>  
> >> -	echo $SCRATCH_DEV | grep -qE ":|//" > /dev/null 2>&1
> >> +	echo $SCRATCH_DEV | grep -qE ":|//|ubi" > /dev/null 2>&1
> >>  	if [ ! -z "$SCRATCH_DEV" -a ! -b "$SCRATCH_DEV" -a "$?" != "0" ]; then
> >>  		echo "common/config: Error: \$SCRATCH_DEV ($SCRATCH_DEV) is not a block device or a network filesystem"
> >>  		exit 1
> >> diff --git a/common/rc b/common/rc
> >> index b8f711a..064b987 100644
> >> --- a/common/rc
> >> +++ b/common/rc
> >> @@ -1034,6 +1034,12 @@ _require_scratch_nocheck()
> >>  		    _notrun "this test requires a valid \$SCRATCH_MNT and unique $SCRATCH_DEV"
> >>  		fi
> >>  		;;
> >> +	ubifs)
> >> +		if [ -z "$SCRATCH_DEV" -o ! -c "$SCRATCH_DEV" -o ! -d "$SCRATCH_MNT" ];
> >> +		then
> >> +		    _notrun "this test requires a valid \$SCRATCH_MNT and unique $SCRATCH_DEV"
> >> +		fi
> >> +		;;

Hmmm, now I see you check for char device here - it shouldn't be
necessary as we shouldn't even have got to this statement if the
SCRATCH_DEV is not a char device. i.e. validate it when pulling in
the config, then it can simply be assumed valid everywhere else if
it is set.

Cheers,

Dave.
-- 
Dave Chinner
david at fromorbit.com



More information about the linux-mtd mailing list