CacheFiles: Don't write a full page if there's only a partial page to cache
authorDavid Howells <dhowells@redhat.com>
Thu, 19 Nov 2009 18:11:52 +0000 (18:11 +0000)
committerDavid Howells <dhowells@redhat.com>
Thu, 19 Nov 2009 18:11:52 +0000 (18:11 +0000)
commita17754fb8c28af19cd70dcbec6d5b0773b94e0c1
treed7c25b217c684153eadbac78ab9b1bbff08b75f6
parent868411be3f445a83fafbd734f3e426400138add5
CacheFiles: Don't write a full page if there's only a partial page to cache

cachefiles_write_page() writes a full page to the backing file for the last
page of the netfs file, even if the netfs file's last page is only a partial
page.

This causes the EOF on the backing file to be extended beyond the EOF of the
netfs, and thus the backing file will be truncated by cachefiles_attr_changed()
called from cachefiles_lookup_object().

So we need to limit the write we make to the backing file on that last page
such that it doesn't push the EOF too far.

Also, if a backing file that has a partial page at the end is expanded, we
discard the partial page and refetch it on the basis that we then have a hole
in the file with invalid data, and should the power go out...  A better way to
deal with this could be to record a note that the partial page contains invalid
data until the correct data is written into it.

This isn't a problem for netfs's that discard the whole backing file if the
file size changes (such as NFS).

Signed-off-by: David Howells <dhowells@redhat.com>
fs/cachefiles/interface.c
fs/cachefiles/rdwr.c
include/linux/fscache-cache.h