• David Howells's avatar
    fscache: Implement raw I/O interface · 9af1c6c3
    David Howells authored
    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: default avatarDavid Howells <dhowells@redhat.com>
    Reviewed-by: default avatarJeff 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
    9af1c6c3
fscache.h 11.9 KB