From: Suparna Bhattacharya Filesystem aio read Converts the wait for page to become uptodate (wait for page lock) after readahead/readpage (in do_generic_mapping_read) to a retry exit. filemap.c | 21 ++++++++++++++++++--- 1 files changed, 18 insertions(+), 3 deletions(-) --- aio/mm/filemap.c 2004-06-17 15:39:49.866081192 -0700 +++ aio-fs_read/mm/filemap.c 2004-06-17 15:34:14.042134192 -0700 @@ -771,7 +771,12 @@ page_ok: page_not_up_to_date: /* Get exclusive access to the page ... */ - lock_page(page); + + if (lock_page_wq(page, current->io_wait)) { + pr_debug("queued lock page \n"); + error = -EIOCBRETRY; + goto sync_error; + } /* Did it get unhashed before we got the lock? */ if (!page->mapping) { @@ -793,13 +798,23 @@ readpage: if (!error) { if (PageUptodate(page)) goto page_ok; - wait_on_page_locked(page); + if (wait_on_page_locked_wq(page, current->io_wait)) { + pr_debug("queued wait_on_page \n"); + error = -EIOCBRETRY; + goto sync_error; + } + if (PageUptodate(page)) goto page_ok; error = -EIO; } - /* UHHUH! A synchronous read error occurred. Report it */ +sync_error: + /* We don't have uptodate data in the page yet */ + /* Could be due to an error or because we need to + * retry when we get an async i/o notification. + * Report the reason. + */ desc->error = error; page_cache_release(page); break;