Noisefs: A predictable noise producing fs for testing things

Add a configurable, predictable noise-producing filesystem for testing stuff,
particularly cache coherency handling in NFS and FS-Cache.

It's based somewhat on ramfs, so you mount an empty fs and populate it:

	mount -t noisefs none /mnt
	touch /mnt/{a,b}
	mkdir /mnt/{c,d}
	touch /mnt/c/{e,f}

The size of files can be set, e.g.:

	echo hello >/mnt/a
	echo hello >>/mnt/a
	truncate -s 4096 /mnt/a

However, no data is actually stored, and the filesystem is not persistent.
Data can be read, but it's generated by a pattern generator, and is available
up to the EOF point.

The data pattern is generated in BE words of four bytes, consisting of the sum
of the filesystem key, inode number, inode data version number and the word
number within the file (file offset / 4).  This should make it easy to check
quickly whether the data is correct.


=============
CONFIGURATION
=============

 (1) A file's i_version number can be given a timeout.  This means that once
     an i_version is viewed (by getattr), it is only good for that many more
     seconds.  After that it will be incremented and the timeout begun again:

	setfattr -n iversion_timo -v 4 /mnt/a

     The file's i_version number is also incremented any time there's a write
     or a truncation operation performed on the file.


 (2) A file can be made to inject an arbitrary error (EIO by default) when
     i_version reaches or exceeds a certain number:

	setfattr -n inject_error_at -v 4 /mnt/a
	setfattr -n error_to_inject -v 28 /mnt/a

     So the above would inject ENOSPC when i_version >= 4.

 (3) A 32-bit filesystem ID key can be set during mounting:

	mount -t noisefs none /mnt -o fs_key=1234

     Note that when exporting this filesystem through NFS, an FSID should be
     set as the mount does not have real device numbers of its own.

Signed-off-by: David Howells <dhowells@redhat.com>
9 files changed