NFS: Fix asynchronous read error handling
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 14 Nov 2006 21:12:23 +0000 (16:12 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 6 Dec 2006 15:46:27 +0000 (10:46 -0500)
commit0b67130149b006628389ff3e8f46be9957af98aa
treed91191f883fad795a99396ba18d740ebc3594ca8
parent46b9f8e1484352f09f229107ba2a758fe386d7f7
NFS: Fix asynchronous read error handling

We must always call ->read_done() before we truncate the page data, or
decide to flag an error. The reasons are that
in NFSv2, ->read_done() is where the eof flag gets set.
in NFSv3/v4 ->read_done() handles EJUKEBOX-type errors, and
  v4 state recovery.

However, we need to mark the pages as uptodate before we deal with short
read errors, since we may need to modify the nfs_read_data arguments.

We therefore split the current nfs_readpage_result() into two parts:
nfs_readpage_result(), which calls ->read_done() etc, and
nfs_readpage_retry(), which subsequently handles short reads.

Note: Removing the code that retries in case of a short read also fixes a
bug in nfs_direct_read_result(), which used to return a corrupted number of
bytes.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/read.c