diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-10-19 12:17:29 -0700 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-10-19 13:58:38 -0700 |
commit | fba730050d1246d0e6ef44e026e0b584732fec2b (patch) | |
tree | 0f82efd65d61d40e6cc994fd8e69b9db0a2e6cb1 | |
parent | fbb5a9abf0d589e9471dc93b18025b7b921d22c9 (diff) | |
download | linux-fba730050d1246d0e6ef44e026e0b584732fec2b.tar.gz linux-fba730050d1246d0e6ef44e026e0b584732fec2b.tar.bz2 linux-fba730050d1246d0e6ef44e026e0b584732fec2b.zip |
NFS: Don't rely on PageError in nfs_readpage_release_partial
Don't rely on the PageError flag to tell us if one of the partial reads of
the page failed. Instead, replace that with a dedicated flag in the
struct nfs_page.
Then clean out redundant uses of the PageError flag: the VM no longer
checks it for reads.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r-- | fs/nfs/read.c | 7 | ||||
-rw-r--r-- | include/linux/nfs_page.h | 1 |
2 files changed, 3 insertions, 5 deletions
diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 09829d96d207..fd58e909842b 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c @@ -276,7 +276,6 @@ nfs_async_read_error(struct list_head *head) while (!list_empty(head)) { req = nfs_list_entry(head->next); nfs_list_remove_request(req); - SetPageError(req->wb_page); nfs_readpage_release(req); } } @@ -330,7 +329,6 @@ out_bad: list_del(&data->list); nfs_readdata_free(data); } - SetPageError(page); nfs_readpage_release(req); return -ENOMEM; } @@ -460,10 +458,10 @@ static void nfs_readpage_release_partial(void *calldata) int status = data->task.tk_status; if (status < 0) - SetPageError(page); + set_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags); if (atomic_dec_and_test(&req->wb_complete)) { - if (!PageError(page)) + if (!test_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags)) SetPageUptodate(page); nfs_readpage_release(req); } @@ -656,7 +654,6 @@ readpage_async_filler(void *data, struct page *page) return 0; out_error: error = PTR_ERR(new); - SetPageError(page); out_unlock: unlock_page(page); return error; diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h index e2791a27a901..ab465fe8c3d6 100644 --- a/include/linux/nfs_page.h +++ b/include/linux/nfs_page.h @@ -34,6 +34,7 @@ enum { PG_NEED_COMMIT, PG_NEED_RESCHED, PG_PNFS_COMMIT, + PG_PARTIAL_READ_FAILED, }; struct nfs_inode; |