fs: support IOCB_NOWAIT in generic_file_buffered_read
authorMilosz Tanski <milosz@adfin.com>
Tue, 29 Aug 2017 14:13:19 +0000 (16:13 +0200)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 4 Sep 2017 23:04:22 +0000 (19:04 -0400)
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 <milosz@adfin.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
Acked-by: Sage Weil <sage@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
mm/filemap.c

index b7c0396690206b949fceabcf38b34153d0a87d25..92d4e0a6c0123c6ab6c7b5c0f952c6998e7b2064 100644 (file)
@@ -1939,6 +1939,8 @@ find_page:
 
                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);
@@ -1952,6 +1954,11 @@ find_page:
                                        index, last_index - index);
                }
                if (!PageUptodate(page)) {
+                       if (iocb->ki_flags & IOCB_NOWAIT) {
+                               put_page(page);
+                               goto would_block;
+                       }
+
                        /*
                         * See comment in do_read_cache_page on why
                         * wait_on_page_locked is used to avoid unnecessarily
@@ -2133,6 +2140,8 @@ no_cached_page:
                goto readpage;
        }
 
+would_block:
+       error = -EAGAIN;
 out:
        ra->prev_pos = prev_index;
        ra->prev_pos <<= PAGE_SHIFT;