Skip to content

Commit 80645bd

Browse files
committed
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
1 parent 102a7e2 commit 80645bd

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

fs/netfs/buffered_read.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,3 +558,76 @@ int netfs_prefetch_for_write(struct file *file, struct folio *folio,
558558
_leave(" = %d", ret);
559559
return ret;
560560
}
561+
562+
/**
563+
* netfs_buffered_read_iter - Filesystem buffered I/O read routine
564+
* @iocb: kernel I/O control block
565+
* @iter: destination for the data read
566+
*
567+
* This is the ->read_iter() routine for all filesystems that can use the page
568+
* cache directly.
569+
*
570+
* The IOCB_NOWAIT flag in iocb->ki_flags indicates that -EAGAIN shall be
571+
* returned when no data can be read without waiting for I/O requests to
572+
* complete; it doesn't prevent readahead.
573+
*
574+
* The IOCB_NOIO flag in iocb->ki_flags indicates that no new I/O requests
575+
* shall be made for the read or for readahead. When no data can be read,
576+
* -EAGAIN shall be returned. When readahead would be triggered, a partial,
577+
* possibly empty read shall be returned.
578+
*
579+
* Return:
580+
* * number of bytes copied, even for partial reads
581+
* * negative error code (or 0 if IOCB_NOIO) if nothing was read
582+
*/
583+
ssize_t netfs_buffered_read_iter(struct kiocb *iocb, struct iov_iter *iter)
584+
{
585+
struct inode *inode = file_inode(iocb->ki_filp);
586+
struct netfs_inode *ictx = netfs_inode(inode);
587+
ssize_t ret;
588+
589+
if (WARN_ON_ONCE((iocb->ki_flags & IOCB_DIRECT) ||
590+
test_bit(NETFS_ICTX_UNBUFFERED, &ictx->flags)))
591+
return -EINVAL;
592+
593+
ret = netfs_start_io_read(inode);
594+
if (ret == 0) {
595+
ret = filemap_read(iocb, iter, 0);
596+
netfs_end_io_read(inode);
597+
}
598+
return ret;
599+
}
600+
EXPORT_SYMBOL(netfs_buffered_read_iter);
601+
602+
/**
603+
* netfs_file_read_iter - Generic filesystem read routine
604+
* @iocb: kernel I/O control block
605+
* @iter: destination for the data read
606+
*
607+
* This is the ->read_iter() routine for all filesystems that can use the page
608+
* cache directly.
609+
*
610+
* The IOCB_NOWAIT flag in iocb->ki_flags indicates that -EAGAIN shall be
611+
* returned when no data can be read without waiting for I/O requests to
612+
* complete; it doesn't prevent readahead.
613+
*
614+
* The IOCB_NOIO flag in iocb->ki_flags indicates that no new I/O requests
615+
* shall be made for the read or for readahead. When no data can be read,
616+
* -EAGAIN shall be returned. When readahead would be triggered, a partial,
617+
* possibly empty read shall be returned.
618+
*
619+
* Return:
620+
* * number of bytes copied, even for partial reads
621+
* * negative error code (or 0 if IOCB_NOIO) if nothing was read
622+
*/
623+
ssize_t netfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
624+
{
625+
struct netfs_inode *ictx = netfs_inode(iocb->ki_filp->f_mapping->host);
626+
627+
if ((iocb->ki_flags & IOCB_DIRECT) ||
628+
test_bit(NETFS_ICTX_UNBUFFERED, &ictx->flags))
629+
return netfs_unbuffered_read_iter(iocb, iter);
630+
631+
return netfs_buffered_read_iter(iocb, iter);
632+
}
633+
EXPORT_SYMBOL(netfs_file_read_iter);

include/linux/netfs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,8 @@ struct netfs_cache_ops {
378378

379379
/* High-level read API. */
380380
ssize_t netfs_unbuffered_read_iter(struct kiocb *iocb, struct iov_iter *iter);
381+
ssize_t netfs_buffered_read_iter(struct kiocb *iocb, struct iov_iter *iter);
382+
ssize_t netfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter);
381383

382384
/* High-level write API */
383385
ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,

0 commit comments

Comments
 (0)