summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2011-10-19 12:17:29 -0700
committerTrond Myklebust <Trond.Myklebust@netapp.com>2011-10-19 13:58:38 -0700
commitfba730050d1246d0e6ef44e026e0b584732fec2b (patch)
tree0f82efd65d61d40e6cc994fd8e69b9db0a2e6cb1
parentfbb5a9abf0d589e9471dc93b18025b7b921d22c9 (diff)
downloadlinux-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.c7
-rw-r--r--include/linux/nfs_page.h1
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;