NFS: Don't rely on PageError in nfs_readpage_release_partial
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 19 Oct 2011 19:17:29 +0000 (12:17 -0700)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 19 Oct 2011 20:58:38 +0000 (13:58 -0700)
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>
fs/nfs/read.c
include/linux/nfs_page.h

index 09829d9..fd58e90 100644 (file)
@@ -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;
index e2791a2..ab465fe 100644 (file)
@@ -34,6 +34,7 @@ enum {
        PG_NEED_COMMIT,
        PG_NEED_RESCHED,
        PG_PNFS_COMMIT,
+       PG_PARTIAL_READ_FAILED,
 };
 
 struct nfs_inode;