mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
netfs: Provide netfs_file_read_iter()
Provide a top-level-ish function that can be pointed to directly by ->read_iter file op. Signed-off-by: David Howells <dhowells@redhat.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> cc: linux-cachefs@redhat.com cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org
This commit is contained in:
parent
102a7e2c59
commit
80645bd4aa
@ -558,3 +558,76 @@ error:
|
||||
_leave(" = %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* netfs_buffered_read_iter - Filesystem buffered I/O read routine
|
||||
* @iocb: kernel I/O control block
|
||||
* @iter: destination for the data read
|
||||
*
|
||||
* This is the ->read_iter() routine for all filesystems that can use the page
|
||||
* cache directly.
|
||||
*
|
||||
* The IOCB_NOWAIT flag in iocb->ki_flags indicates that -EAGAIN shall be
|
||||
* returned when no data can be read without waiting for I/O requests to
|
||||
* complete; it doesn't prevent readahead.
|
||||
*
|
||||
* The IOCB_NOIO flag in iocb->ki_flags indicates that no new I/O requests
|
||||
* shall be made for the read or for readahead. When no data can be read,
|
||||
* -EAGAIN shall be returned. When readahead would be triggered, a partial,
|
||||
* possibly empty read shall be returned.
|
||||
*
|
||||
* Return:
|
||||
* * number of bytes copied, even for partial reads
|
||||
* * negative error code (or 0 if IOCB_NOIO) if nothing was read
|
||||
*/
|
||||
ssize_t netfs_buffered_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
{
|
||||
struct inode *inode = file_inode(iocb->ki_filp);
|
||||
struct netfs_inode *ictx = netfs_inode(inode);
|
||||
ssize_t ret;
|
||||
|
||||
if (WARN_ON_ONCE((iocb->ki_flags & IOCB_DIRECT) ||
|
||||
test_bit(NETFS_ICTX_UNBUFFERED, &ictx->flags)))
|
||||
return -EINVAL;
|
||||
|
||||
ret = netfs_start_io_read(inode);
|
||||
if (ret == 0) {
|
||||
ret = filemap_read(iocb, iter, 0);
|
||||
netfs_end_io_read(inode);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(netfs_buffered_read_iter);
|
||||
|
||||
/**
|
||||
* netfs_file_read_iter - Generic filesystem read routine
|
||||
* @iocb: kernel I/O control block
|
||||
* @iter: destination for the data read
|
||||
*
|
||||
* This is the ->read_iter() routine for all filesystems that can use the page
|
||||
* cache directly.
|
||||
*
|
||||
* The IOCB_NOWAIT flag in iocb->ki_flags indicates that -EAGAIN shall be
|
||||
* returned when no data can be read without waiting for I/O requests to
|
||||
* complete; it doesn't prevent readahead.
|
||||
*
|
||||
* The IOCB_NOIO flag in iocb->ki_flags indicates that no new I/O requests
|
||||
* shall be made for the read or for readahead. When no data can be read,
|
||||
* -EAGAIN shall be returned. When readahead would be triggered, a partial,
|
||||
* possibly empty read shall be returned.
|
||||
*
|
||||
* Return:
|
||||
* * number of bytes copied, even for partial reads
|
||||
* * negative error code (or 0 if IOCB_NOIO) if nothing was read
|
||||
*/
|
||||
ssize_t netfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
{
|
||||
struct netfs_inode *ictx = netfs_inode(iocb->ki_filp->f_mapping->host);
|
||||
|
||||
if ((iocb->ki_flags & IOCB_DIRECT) ||
|
||||
test_bit(NETFS_ICTX_UNBUFFERED, &ictx->flags))
|
||||
return netfs_unbuffered_read_iter(iocb, iter);
|
||||
|
||||
return netfs_buffered_read_iter(iocb, iter);
|
||||
}
|
||||
EXPORT_SYMBOL(netfs_file_read_iter);
|
||||
|
@ -378,6 +378,8 @@ struct netfs_cache_ops {
|
||||
|
||||
/* High-level read API. */
|
||||
ssize_t netfs_unbuffered_read_iter(struct kiocb *iocb, struct iov_iter *iter);
|
||||
ssize_t netfs_buffered_read_iter(struct kiocb *iocb, struct iov_iter *iter);
|
||||
ssize_t netfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter);
|
||||
|
||||
/* High-level write API */
|
||||
ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,
|
||||
|
Loading…
Reference in New Issue
Block a user