fscache: Implement raw I/O interface
Provide a pair of functions to perform raw I/O on the cache. The first function allows an arbitrary asynchronous direct-IO read to be made against a cache object, though the read should be aligned and sized appropriately for the backing device: int fscache_read(struct netfs_cache_resources *cres, loff_t start_pos, struct iov_iter *iter, enum netfs_read_from_hole read_hole, netfs_io_terminated_t term_func, void *term_func_priv); The cache resources must have been previously initialised by fscache_begin_read_operation(). A read operation is sent to the backing filesystem, starting at start_pos within the file. The size of the read is specified by the iterator, as is the location of the output buffer. If there is a hole in the data it can be ignored and left to the backing filesystem to deal with (NETFS_READ_HOLE_IGNORE), a hole at the beginning can be skipped over and the buffer padded with zeros (NETFS_READ_HOLE_CLEAR) or -ENODATA can be given (NETFS_READ_HOLE_FAIL). If term_func is not NULL, the operation may be performed asynchronously. Upon completion, successful or otherwise, (*term_func)() will be called and passed term_func_priv, along with an error or the amount of data transferred. If the op is run asynchronously, fscache_read() will return -EIOCBQUEUED. The second function allows an arbitrary asynchronous direct-IO write to be made against a cache object, though the write should be aligned and sized appropriately for the backing device: int fscache_write(struct netfs_cache_resources *cres, loff_t start_pos, struct iov_iter *iter, netfs_io_terminated_t term_func, void *term_func_priv); This works in very similar way to fscache_read(), except that there's no need to deal with holes (they're just overwritten). The caller is responsible for preventing concurrent overlapping writes. 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/163819613224.215744.7877577215582621254.stgit@warthog.procyon.org.uk/ # v1 Link: https://lore.kernel.org/r/163906915386.143852.16936177636106480724.stgit@warthog.procyon.org.uk/ # v2 Link: https://lore.kernel.org/r/163967122632.1823006.7487049517698562172.stgit@warthog.procyon.org.uk/ # v3 Link: https://lore.kernel.org/r/164021521420.640689.12747258780542678309.stgit@warthog.procyon.org.uk/ # v4
This commit is contained in:
parent
3a11b3a863
commit
9af1c6c308
|
@ -429,4 +429,78 @@ int fscache_begin_read_operation(struct netfs_cache_resources *cres,
|
|||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
/**
|
||||
* fscache_read - Start a read from the cache.
|
||||
* @cres: The cache resources to use
|
||||
* @start_pos: The beginning file offset in the cache file
|
||||
* @iter: The buffer to fill - and also the length
|
||||
* @read_hole: How to handle a hole in the data.
|
||||
* @term_func: The function to call upon completion
|
||||
* @term_func_priv: The private data for @term_func
|
||||
*
|
||||
* Start a read from the cache. @cres indicates the cache object to read from
|
||||
* and must be obtained by a call to fscache_begin_operation() beforehand.
|
||||
*
|
||||
* The data is read into the iterator, @iter, and that also indicates the size
|
||||
* of the operation. @start_pos is the start position in the file, though if
|
||||
* @seek_data is set appropriately, the cache can use SEEK_DATA to find the
|
||||
* next piece of data, writing zeros for the hole into the iterator.
|
||||
*
|
||||
* Upon termination of the operation, @term_func will be called and supplied
|
||||
* with @term_func_priv plus the amount of data written, if successful, or the
|
||||
* error code otherwise.
|
||||
*
|
||||
* @read_hole indicates how a partially populated region in the cache should be
|
||||
* handled. It can be one of a number of settings:
|
||||
*
|
||||
* NETFS_READ_HOLE_IGNORE - Just try to read (may return a short read).
|
||||
*
|
||||
* NETFS_READ_HOLE_CLEAR - Seek for data, clearing the part of the buffer
|
||||
* skipped over, then do as for IGNORE.
|
||||
*
|
||||
* NETFS_READ_HOLE_FAIL - Give ENODATA if we encounter a hole.
|
||||
*/
|
||||
static inline
|
||||
int fscache_read(struct netfs_cache_resources *cres,
|
||||
loff_t start_pos,
|
||||
struct iov_iter *iter,
|
||||
enum netfs_read_from_hole read_hole,
|
||||
netfs_io_terminated_t term_func,
|
||||
void *term_func_priv)
|
||||
{
|
||||
const struct netfs_cache_ops *ops = fscache_operation_valid(cres);
|
||||
return ops->read(cres, start_pos, iter, read_hole,
|
||||
term_func, term_func_priv);
|
||||
}
|
||||
|
||||
/**
|
||||
* fscache_write - Start a write to the cache.
|
||||
* @cres: The cache resources to use
|
||||
* @start_pos: The beginning file offset in the cache file
|
||||
* @iter: The data to write - and also the length
|
||||
* @term_func: The function to call upon completion
|
||||
* @term_func_priv: The private data for @term_func
|
||||
*
|
||||
* Start a write to the cache. @cres indicates the cache object to write to and
|
||||
* must be obtained by a call to fscache_begin_operation() beforehand.
|
||||
*
|
||||
* The data to be written is obtained from the iterator, @iter, and that also
|
||||
* indicates the size of the operation. @start_pos is the start position in
|
||||
* the file.
|
||||
*
|
||||
* Upon termination of the operation, @term_func will be called and supplied
|
||||
* with @term_func_priv plus the amount of data written, if successful, or the
|
||||
* error code otherwise.
|
||||
*/
|
||||
static inline
|
||||
int fscache_write(struct netfs_cache_resources *cres,
|
||||
loff_t start_pos,
|
||||
struct iov_iter *iter,
|
||||
netfs_io_terminated_t term_func,
|
||||
void *term_func_priv)
|
||||
{
|
||||
const struct netfs_cache_ops *ops = fscache_operation_valid(cres);
|
||||
return ops->write(cres, start_pos, iter, term_func, term_func_priv);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_FSCACHE_H */
|
||||
|
|
|
@ -79,6 +79,7 @@ enum fscache_access_trace {
|
|||
fscache_access_io_not_live,
|
||||
fscache_access_io_read,
|
||||
fscache_access_io_wait,
|
||||
fscache_access_io_write,
|
||||
fscache_access_lookup_cookie,
|
||||
fscache_access_lookup_cookie_end,
|
||||
fscache_access_lookup_cookie_end_failed,
|
||||
|
@ -149,6 +150,7 @@ enum fscache_access_trace {
|
|||
EM(fscache_access_io_not_live, "END io_notl") \
|
||||
EM(fscache_access_io_read, "BEGIN io_read") \
|
||||
EM(fscache_access_io_wait, "WAIT io ") \
|
||||
EM(fscache_access_io_write, "BEGIN io_writ") \
|
||||
EM(fscache_access_lookup_cookie, "BEGIN lookup ") \
|
||||
EM(fscache_access_lookup_cookie_end, "END lookup ") \
|
||||
EM(fscache_access_lookup_cookie_end_failed,"END lookupf") \
|
||||
|
|
Loading…
Reference in New Issue