fs: support IOCB_NOWAIT in generic_file_buffered_read
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>
This commit is contained in:
Родитель
47c27bc469
Коммит
3239d83484
|
@ -1939,6 +1939,8 @@ find_page:
|
||||||
|
|
||||||
page = find_get_page(mapping, index);
|
page = find_get_page(mapping, index);
|
||||||
if (!page) {
|
if (!page) {
|
||||||
|
if (iocb->ki_flags & IOCB_NOWAIT)
|
||||||
|
goto would_block;
|
||||||
page_cache_sync_readahead(mapping,
|
page_cache_sync_readahead(mapping,
|
||||||
ra, filp,
|
ra, filp,
|
||||||
index, last_index - index);
|
index, last_index - index);
|
||||||
|
@ -1952,6 +1954,11 @@ find_page:
|
||||||
index, last_index - index);
|
index, last_index - index);
|
||||||
}
|
}
|
||||||
if (!PageUptodate(page)) {
|
if (!PageUptodate(page)) {
|
||||||
|
if (iocb->ki_flags & IOCB_NOWAIT) {
|
||||||
|
put_page(page);
|
||||||
|
goto would_block;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See comment in do_read_cache_page on why
|
* See comment in do_read_cache_page on why
|
||||||
* wait_on_page_locked is used to avoid unnecessarily
|
* wait_on_page_locked is used to avoid unnecessarily
|
||||||
|
@ -2133,6 +2140,8 @@ no_cached_page:
|
||||||
goto readpage;
|
goto readpage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
would_block:
|
||||||
|
error = -EAGAIN;
|
||||||
out:
|
out:
|
||||||
ra->prev_pos = prev_index;
|
ra->prev_pos = prev_index;
|
||||||
ra->prev_pos <<= PAGE_SHIFT;
|
ra->prev_pos <<= PAGE_SHIFT;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче