This is a variant of fscache_wait_for_operation() except that it's exported for users of FsCache, and thus cookie->lock is held when checking cookie's state. Exporting fscache_begin_operation() directly is not acceptable as it would introduce dependency of <trace/events/fscache.h> for users of FsCache. Signed-off-by: Jingbo Xu <jefflexu@xxxxxxxxxxxxxxxxx> --- fs/fscache/io.c | 9 +++++++++ include/linux/fscache.h | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/fs/fscache/io.c b/fs/fscache/io.c index 0d2b8dec8f82..6ccc5aadf151 100644 --- a/fs/fscache/io.c +++ b/fs/fscache/io.c @@ -158,6 +158,15 @@ int __fscache_begin_write_operation(struct netfs_cache_resources *cres, } EXPORT_SYMBOL(__fscache_begin_write_operation); +int __fscache_begin_wait_operation(struct netfs_cache_resources *cres, + struct fscache_cookie *cookie, + enum fscache_want_state want_state) +{ + return fscache_begin_operation(cres, cookie, want_state, + fscache_access_io_wait); +} +EXPORT_SYMBOL(__fscache_begin_wait_operation); + /** * fscache_dirty_folio - Mark folio dirty and pin a cache object for writeback * @mapping: The mapping the folio belongs to. diff --git a/include/linux/fscache.h b/include/linux/fscache.h index 8e312c8323a8..708cf8db7f46 100644 --- a/include/linux/fscache.h +++ b/include/linux/fscache.h @@ -171,6 +171,8 @@ extern void __fscache_resize_cookie(struct fscache_cookie *, loff_t); extern void __fscache_invalidate(struct fscache_cookie *, const void *, loff_t, unsigned int); extern int __fscache_begin_read_operation(struct netfs_cache_resources *, struct fscache_cookie *); extern int __fscache_begin_write_operation(struct netfs_cache_resources *, struct fscache_cookie *); +extern int __fscache_begin_wait_operation(struct netfs_cache_resources *, struct fscache_cookie *, + enum fscache_want_state want_state); extern void __fscache_write_to_cache(struct fscache_cookie *, struct address_space *, loff_t, size_t, loff_t, netfs_io_terminated_t, void *, @@ -543,6 +545,26 @@ int fscache_begin_write_operation(struct netfs_cache_resources *cres, return -ENOBUFS; } +/** + * fscache_begin_wait_operation - Wait for an object become accessible + * @cres: The cache resources for the operation being performed + * @cookie: The cookie representing the cache object + * + * Returns: + * * 0 - Success + * * -ENOBUFS - No caching available + * * Other error code from the cache, such as -ENOMEM. + */ +static inline +int fscache_begin_wait_operation(struct netfs_cache_resources *cres, + struct fscache_cookie *cookie, + enum fscache_want_state want_state) +{ + if (fscache_cookie_enabled(cookie)) + return __fscache_begin_wait_operation(cres, cookie, want_state); + return -ENOBUFS; +} + /** * fscache_write - Start a write to the cache. * @cres: The cache resources to use -- 2.19.1.6.gb485710b -- Linux-cachefs mailing list Linux-cachefs@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/linux-cachefs