Skip to content

Commit

Permalink
fscache: Add a function to begin an cache op from a netfslib request
Browse files Browse the repository at this point in the history
Add a function to begin an cache read or write operation from a netfslib
I/O request.  This function can then be pointed to directly by the network
filesystem's netfs_request_ops::begin_cache_operation op pointer.

Ideally, netfslib would just call into fscache directly, but that would
cause dependency cycles as fscache calls into netfslib directly.

Signed-off-by: David Howells <dhowells@redhat.com>
  • Loading branch information
dhowells committed Apr 26, 2022
1 parent 3652a0b commit 506cacd
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 42 deletions.
17 changes: 1 addition & 16 deletions fs/9p/vfs_addr.c
Expand Up @@ -89,25 +89,10 @@ static void v9fs_free_request(struct netfs_io_request *rreq)
p9_client_clunk(fid);
}

/**
* v9fs_begin_cache_operation - Begin a cache operation for a read
* @rreq: The read request
*/
static int v9fs_begin_cache_operation(struct netfs_io_request *rreq)
{
#ifdef CONFIG_9P_FSCACHE
struct fscache_cookie *cookie = v9fs_inode_cookie(V9FS_I(rreq->inode));

return fscache_begin_read_operation(&rreq->cache_resources, cookie);
#else
return -ENOBUFS;
#endif
}

const struct netfs_request_ops v9fs_req_ops = {
.init_request = v9fs_init_request,
.free_request = v9fs_free_request,
.begin_cache_operation = v9fs_begin_cache_operation,
.begin_cache_operation = fscache_begin_cache_operation,
.clamp_length = v9fs_clamp_length,
.issue_read = v9fs_issue_read,
};
Expand Down
14 changes: 1 addition & 13 deletions fs/afs/file.c
Expand Up @@ -358,18 +358,6 @@ static int afs_init_request(struct netfs_io_request *rreq, struct file *file)
return 0;
}

static int afs_begin_cache_operation(struct netfs_io_request *rreq)
{
#ifdef CONFIG_AFS_FSCACHE
struct afs_vnode *vnode = AFS_FS_I(rreq->inode);

return fscache_begin_read_operation(&rreq->cache_resources,
afs_vnode_cache(vnode));
#else
return -ENOBUFS;
#endif
}

static int afs_check_write_begin(struct file *file, loff_t pos, unsigned len,
struct folio *folio, void **_fsdata)
{
Expand All @@ -386,7 +374,7 @@ static void afs_free_request(struct netfs_io_request *rreq)
const struct netfs_request_ops afs_req_ops = {
.init_request = afs_init_request,
.free_request = afs_free_request,
.begin_cache_operation = afs_begin_cache_operation,
.begin_cache_operation = fscache_begin_cache_operation,
.check_write_begin = afs_check_write_begin,
.issue_read = afs_issue_read,
};
Expand Down
2 changes: 1 addition & 1 deletion fs/ceph/addr.c
Expand Up @@ -386,7 +386,7 @@ static void ceph_netfs_free_request(struct netfs_io_request *rreq)
const struct netfs_request_ops ceph_netfs_ops = {
.init_request = ceph_init_request,
.free_request = ceph_netfs_free_request,
.begin_cache_operation = ceph_begin_cache_operation,
.begin_cache_operation = fscache_begin_cache_operation,
.issue_read = ceph_netfs_issue_read,
.expand_readahead = ceph_netfs_expand_readahead,
.clamp_length = ceph_netfs_clamp_length,
Expand Down
12 changes: 0 additions & 12 deletions fs/ceph/cache.h
Expand Up @@ -57,13 +57,6 @@ static inline int ceph_fscache_dirty_folio(struct address_space *mapping,
return fscache_dirty_folio(mapping, folio, ceph_fscache_cookie(ci));
}

static inline int ceph_begin_cache_operation(struct netfs_io_request *rreq)
{
struct fscache_cookie *cookie = ceph_fscache_cookie(ceph_inode(rreq->inode));

return fscache_begin_read_operation(&rreq->cache_resources, cookie);
}

static inline bool ceph_is_cache_enabled(struct inode *inode)
{
return fscache_cookie_enabled(ceph_fscache_cookie(ceph_inode(inode)));
Expand Down Expand Up @@ -135,11 +128,6 @@ static inline bool ceph_is_cache_enabled(struct inode *inode)
return false;
}

static inline int ceph_begin_cache_operation(struct netfs_io_request *rreq)
{
return -ENOBUFS;
}

static inline void ceph_fscache_note_page_release(struct inode *inode)
{
}
Expand Down
41 changes: 41 additions & 0 deletions fs/fscache/io.c
Expand Up @@ -158,6 +158,47 @@ int __fscache_begin_write_operation(struct netfs_cache_resources *cres,
}
EXPORT_SYMBOL(__fscache_begin_write_operation);

/**
* fscache_begin_cache_operation - Begin a cache op for netfslib
* @rreq: The netfs request that wants to access the cache.
*
* Begin an I/O operation on behalf of the netfs helper library, read or write.
* @rreq indicates the netfs operation that wishes to access the cache.
*
* This is intended to be pointed to directly by the ->begin_cache_operation()
* netfs lib operation for the network filesystem.
*
* @cres->inval_counter is set from @cookie->inval_counter for comparison at
* the end of the operation. This allows invalidation during the operation to
* be detected by the caller.
*
* Returns:
* * 0 - Success
* * -ENOBUFS - No caching available
* * Other error code from the cache, such as -ENOMEM.
*/
int fscache_begin_cache_operation(struct netfs_io_request *rreq)
{
switch (rreq->origin) {
case NETFS_READAHEAD:
case NETFS_READPAGE:
case NETFS_READ_FOR_WRITE:
return fscache_begin_operation(&rreq->cache_resources,
netfs_i_cookie(rreq->inode),
FSCACHE_WANT_PARAMS,
fscache_access_io_read);
case NETFS_WRITEBACK:
return fscache_begin_operation(&rreq->cache_resources,
netfs_i_cookie(rreq->inode),
FSCACHE_WANT_PARAMS,
fscache_access_io_write);
case NETFS_DIO_READ:
case NETFS_DIO_WRITE:
default:
return -ENOBUFS;
}
}

/**
* fscache_dirty_folio - Mark folio dirty and pin a cache object for writeback
* @mapping: The mapping the folio belongs to.
Expand Down
6 changes: 6 additions & 0 deletions include/linux/fscache.h
Expand Up @@ -175,6 +175,12 @@ extern void __fscache_write_to_cache(struct fscache_cookie *, struct address_spa
bool);
extern void __fscache_clear_page_bits(struct address_space *, loff_t, size_t);

#if __fscache_available
extern int fscache_begin_cache_operation(struct netfs_io_request *rreq);
#else
#define fscache_begin_cache_operation NULL
#endif

/**
* fscache_acquire_volume - Register a volume as desiring caching services
* @volume_key: An identification string for the volume
Expand Down

0 comments on commit 506cacd

Please sign in to comment.