From: Milosz Tanski <[email protected]>

Allow generic_file_buffered_read to bail out early instead of waiting for
the page lock or reading a page if IOCB_NOWAIT is specified.

Signed-off-by: Milosz Tanski <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Reviewed-by: Jeff Moyer <[email protected]>
Acked-by: Sage Weil <[email protected]>
---
 mm/filemap.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/mm/filemap.c b/mm/filemap.c
index 3df0a57cd48e..d021931c8e74 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1843,6 +1843,8 @@ static ssize_t generic_file_buffered_read(struct kiocb 
*iocb,
 
                page = find_get_page(mapping, index);
                if (!page) {
+                       if (iocb->ki_flags & IOCB_NOWAIT)
+                               goto would_block;
                        page_cache_sync_readahead(mapping,
                                        ra, filp,
                                        index, last_index - index);
@@ -1948,6 +1950,11 @@ static ssize_t generic_file_buffered_read(struct kiocb 
*iocb,
                continue;
 
 page_not_up_to_date:
+               if (iocb->ki_flags & IOCB_NOWAIT) {
+                       put_page(page);
+                       goto would_block;
+               }
+
                /* Get exclusive access to the page ... */
                error = lock_page_killable(page);
                if (unlikely(error))
@@ -1967,6 +1974,12 @@ static ssize_t generic_file_buffered_read(struct kiocb 
*iocb,
                        goto page_ok;
                }
 
+               if (iocb->ki_flags & IOCB_NOWAIT) {
+                       unlock_page(page);
+                       put_page(page);
+                       goto would_block;
+               }
+
 readpage:
                /*
                 * A previous I/O error may have been due to temporary
@@ -2037,6 +2050,8 @@ static ssize_t generic_file_buffered_read(struct kiocb 
*iocb,
                goto readpage;
        }
 
+would_block:
+       error = -EAGAIN;
 out:
        ra->prev_pos = prev_index;
        ra->prev_pos <<= PAGE_SHIFT;
-- 
2.11.0

Reply via email to