diff options
author | David Howells <dhowells@redhat.com> | 2012-12-20 16:52:36 -0500 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2012-12-20 17:06:08 -0500 |
commit | 9dc8d9bfe4415efb61a5e9390706b8a3bffef329 (patch) | |
tree | 2534486c442b7889a761d894f3bd4dd0403608ca /fs/cachefiles/rdwr.c | |
parent | a02de9608595c8ef649ef03ae735b0b45e3d4396 (diff) |
CacheFiles: Implement invalidation
Implement invalidation for CacheFiles. This is in two parts:
(1) Provide an invalidation method (which just truncates the backing file).
(2) Abort attempts to copy anything read from the backing file whilst
invalidation is in progress.
Question: CacheFiles uses truncation in a couple of places. It has been using
notify_change() rather than sys_truncate() or something similar. This means
it bypasses a bunch of checks and suchlike that it possibly should be making
(security, file locking, lease breaking, vfsmount write). Should it be using
vfs_truncate() as added by a preceding patch or should it use notify_write()
and assume that anyone poking around in the cache files on disk gets
everything they deserve?
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/cachefiles/rdwr.c')
-rw-r--r-- | fs/cachefiles/rdwr.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/cachefiles/rdwr.c b/fs/cachefiles/rdwr.c index 93a0815e0498..2c994885520a 100644 --- a/fs/cachefiles/rdwr.c +++ b/fs/cachefiles/rdwr.c | |||
@@ -174,7 +174,10 @@ static void cachefiles_read_copier(struct fscache_operation *_op) | |||
174 | _debug("- copy {%lu}", monitor->back_page->index); | 174 | _debug("- copy {%lu}", monitor->back_page->index); |
175 | 175 | ||
176 | recheck: | 176 | recheck: |
177 | if (PageUptodate(monitor->back_page)) { | 177 | if (test_bit(FSCACHE_COOKIE_INVALIDATING, |
178 | &object->fscache.cookie->flags)) { | ||
179 | error = -ESTALE; | ||
180 | } else if (PageUptodate(monitor->back_page)) { | ||
178 | copy_highpage(monitor->netfs_page, monitor->back_page); | 181 | copy_highpage(monitor->netfs_page, monitor->back_page); |
179 | fscache_mark_page_cached(monitor->op, | 182 | fscache_mark_page_cached(monitor->op, |
180 | monitor->netfs_page); | 183 | monitor->netfs_page); |