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>
This commit is contained in:
		
					parent
					
						
							
								fbb5a9abf0
							
						
					
				
			
			
				commit
				
					
						fba730050d
					
				
			
		
					 2 changed files with 3 additions and 5 deletions
				
			
		| 
						 | 
					@ -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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue