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 */
 
        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,
        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")     \