On Wed, May 01, 2013 at 11:20:44AM -0500, Ben Myers wrote:
> Hi James,
> On Wed, May 01, 2013 at 01:39:09PM +0100, James Dingwall wrote:
> > In reference to: http://oss.sgi.com/archives/xfs/2012-05/msg00046.html
> > $ grep -r cleancache fs/xfs
> > on the 3.9 kernel source suggests that no patch was submitted to
> > enable cleancache for the XFS filesystem. Since it was suggested
> > that this could be a one liner I've had a go and my first effort is
> > inline below. While this seems to compile OK I have no experience
> > in filesystems so I would appreciate it if anyone can point out that
> > it is obviously wrong and likely to eat my data before I try booting
> > the kernel.
> > If it seems a reasonable attempt what would be the best way to check
> > that it isn't doing nasty things?
> Hrm.. Looks like there is a doc in Documentation/vm/cleancache.txt which
> includes a list of attributes the filesystem needs to have to work properly
> with cleancache.
So, those points are:
| Some points for a filesystem to consider:
| - The FS should be block-device-based (e.g. a ram-based FS such
| as tmpfs should not enable cleancache)
|- To ensure coherency/correctness, the FS must ensure that all
| file removal or truncation operations either go through VFS or
| add hooks to do the equivalent cleancache "invalidate" operations
There be dragons - do all the XFS ioctls do the right thing?
|- To ensure coherency/correctness, either inode numbers must
| be unique across the lifetime of the on-disk file OR the
| FS must provide an "encode_fh" function.
|- The FS must call the VFS superblock alloc and deactivate routines
| or add hooks to do the equivalent cleancache calls done there.
|- To maximize performance, all pages fetched from the FS should
| go through the do_mpag_readpage routine or the FS should add
| hooks to do the equivalent (cf. btrfs)
xfs uses mpage_readpages() so should be fine.
|- Currently, the FS blocksize must be the same as PAGESIZE. This
| is not an architectural restriction, but no backends currently
| support anything different.
Which means that we need hooks in the mount path to determine if
this is the case or not. I note that neither ext3/ext4 do this check
so I can't determine why this restriction is mentioned, and I'm not
sure if it has any relevance to btrfs.
IOWs, I'd like to know why this restriction exists - what does
cleancache care about how the filesystem maps blocks to the page in
the page cache - any way the filesystem does this it uses
page->private to hide this fact from the page cache....
|- A clustered FS should invoke the "shared_init_fs" cleancache
| hook to get best performance for some backends.
Not a problem.
So there's a couple of things that need to be explained and
explored, and a bunch of testing to be done....