I've just downloaded 1.99.7 and found that it makes
the thing that OPPOSITE to correct one!
Asynchronous NFS generate pages that are not uptodate and with error flag set.
It is not real error (request timed out, or authentication failed)
We should reread such pages to trigger synchronous NFS request.
As I see, you do not want to reread faulty page.
I agree, but remember that NFS pages should be retried TWICE,
else mmap will generate spurious SIGBUSes.
wait_on_page(page);
if (PageUptodate(page)) {
success:
return page_address(page);
}
- /* If not marked as error, try _once_ to read it again */
- if (!PageError(page)) {
+ /* If page is marked as error, try _once_ to read it again */
+ if (PageError(page)) {
inode->i_op->readpage(inode, page);
wait_on_page(page);
if (PageUptodate(page))
goto success;
}
page->count--;
failure:
return 0;
Note that generic_file_read is more sane, but it is just
because of unresolved race condition:
error = inode->i_op->readpage(inode, page);
if (!error) {
if (!PageError(page))
goto found_page;
error = -EIO;
}
If readpage made async NFS request, NFS module cleared error
flag and we will go to found_page, where we will wait for request
completion and retry if it will fail.
If async request will be completed between readpage and check for
error flag (it is possible only in theory, because current
NFS implementation requires context switch to complete asynchronous
request)
Alexey Kuznetsov