diff options
author | David Howells <dhowells@redhat.com> | 2021-10-21 11:05:53 +0100 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2022-01-07 13:42:44 +0000 |
commit | 287fd611238dd4b7e32fd3a8985aa387d26c4f29 (patch) | |
tree | 3b643ab9271c8ac0583840042286355fe27b6592 /fs/cachefiles/internal.h | |
parent | 1f08c925e7a38002bde509e66f6f891468848511 (diff) | |
download | lwn-287fd611238dd4b7e32fd3a8985aa387d26c4f29.tar.gz lwn-287fd611238dd4b7e32fd3a8985aa387d26c4f29.zip |
cachefiles: Implement begin and end I/O operation
Implement the methods for beginning and ending an I/O operation.
When called to begin an I/O operation, we are guaranteed that the cookie
has reached a certain stage (we're called by fscache after it has done a
suitable wait).
If a file is available, we paste a ref over into the cache resources for
the I/O routines to use. This means that the object can be invalidated
whilst the I/O is ongoing without the need to synchronise as the file
pointer in the object is replaced, but the file pointer in the cache
resources is unaffected.
Ending the operation just requires ditching any refs we have and dropping
the access guarantee that fscache got for us on the cookie.
Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
cc: linux-cachefs@redhat.com
Link: https://lore.kernel.org/r/163819645033.215744.2199344081658268312.stgit@warthog.procyon.org.uk/ # v1
Link: https://lore.kernel.org/r/163906951916.143852.9531384743995679857.stgit@warthog.procyon.org.uk/ # v2
Link: https://lore.kernel.org/r/163967161222.1823006.4461476204800357263.stgit@warthog.procyon.org.uk/ # v3
Link: https://lore.kernel.org/r/164021559030.640689.3684291785218094142.stgit@warthog.procyon.org.uk/ # v4
Diffstat (limited to 'fs/cachefiles/internal.h')
-rw-r--r-- | fs/cachefiles/internal.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h index d7aae04edc61..d5868f5514d3 100644 --- a/fs/cachefiles/internal.h +++ b/fs/cachefiles/internal.h @@ -105,6 +105,18 @@ struct cachefiles_cache { #include <trace/events/cachefiles.h> +static inline +struct file *cachefiles_cres_file(struct netfs_cache_resources *cres) +{ + return cres->cache_priv2; +} + +static inline +struct cachefiles_object *cachefiles_cres_object(struct netfs_cache_resources *cres) +{ + return fscache_cres_cookie(cres)->cache_priv; +} + /* * note change of state for daemon */ @@ -178,6 +190,12 @@ extern void cachefiles_put_object(struct cachefiles_object *object, enum cachefiles_obj_ref_trace why); /* + * io.c + */ +extern bool cachefiles_begin_operation(struct netfs_cache_resources *cres, + enum fscache_want_state want_state); + +/* * key.c */ extern bool cachefiles_cook_key(struct cachefiles_object *object); |