Browse Source

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>
Trond Myklebust 13 years ago
parent
commit
fba730050d
2 changed files with 3 additions and 5 deletions
  1. 2 5
      fs/nfs/read.c
  2. 1 0
      include/linux/nfs_page.h

+ 2 - 5
fs/nfs/read.c

@@ -276,7 +276,6 @@ nfs_async_read_error(struct list_head *head)
 	while (!list_empty(head)) {
 	while (!list_empty(head)) {
 		req = nfs_list_entry(head->next);
 		req = nfs_list_entry(head->next);
 		nfs_list_remove_request(req);
 		nfs_list_remove_request(req);
-		SetPageError(req->wb_page);
 		nfs_readpage_release(req);
 		nfs_readpage_release(req);
 	}
 	}
 }
 }
@@ -330,7 +329,6 @@ out_bad:
 		list_del(&data->list);
 		list_del(&data->list);
 		nfs_readdata_free(data);
 		nfs_readdata_free(data);
 	}
 	}
-	SetPageError(page);
 	nfs_readpage_release(req);
 	nfs_readpage_release(req);
 	return -ENOMEM;
 	return -ENOMEM;
 }
 }
@@ -460,10 +458,10 @@ static void nfs_readpage_release_partial(void *calldata)
 	int status = data->task.tk_status;
 	int status = data->task.tk_status;
 
 
 	if (status < 0)
 	if (status < 0)
-		SetPageError(page);
+		set_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags);
 
 
 	if (atomic_dec_and_test(&req->wb_complete)) {
 	if (atomic_dec_and_test(&req->wb_complete)) {
-		if (!PageError(page))
+		if (!test_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags))
 			SetPageUptodate(page);
 			SetPageUptodate(page);
 		nfs_readpage_release(req);
 		nfs_readpage_release(req);
 	}
 	}
@@ -656,7 +654,6 @@ readpage_async_filler(void *data, struct page *page)
 	return 0;
 	return 0;
 out_error:
 out_error:
 	error = PTR_ERR(new);
 	error = PTR_ERR(new);
-	SetPageError(page);
 out_unlock:
 out_unlock:
 	unlock_page(page);
 	unlock_page(page);
 	return error;
 	return error;

+ 1 - 0
include/linux/nfs_page.h

@@ -34,6 +34,7 @@ enum {
 	PG_NEED_COMMIT,
 	PG_NEED_COMMIT,
 	PG_NEED_RESCHED,
 	PG_NEED_RESCHED,
 	PG_PNFS_COMMIT,
 	PG_PNFS_COMMIT,
+	PG_PARTIAL_READ_FAILED,
 };
 };
 
 
 struct nfs_inode;
 struct nfs_inode;