Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+3 -5
+2 -5
fs/nfs/read.c
··· 276 276 while (!list_empty(head)) { 277 277 req = nfs_list_entry(head->next); 278 278 nfs_list_remove_request(req); 279 - SetPageError(req->wb_page); 280 279 nfs_readpage_release(req); 281 280 } 282 281 } ··· 329 330 list_del(&data->list); 330 331 nfs_readdata_free(data); 331 332 } 332 - SetPageError(page); 333 333 nfs_readpage_release(req); 334 334 return -ENOMEM; 335 335 } ··· 458 460 int status = data->task.tk_status; 459 461 460 462 if (status < 0) 461 - SetPageError(page); 463 + set_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags); 462 464 463 465 if (atomic_dec_and_test(&req->wb_complete)) { 464 - if (!PageError(page)) 466 + if (!test_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags)) 465 467 SetPageUptodate(page); 466 468 nfs_readpage_release(req); 467 469 } ··· 654 656 return 0; 655 657 out_error: 656 658 error = PTR_ERR(new); 657 - SetPageError(page); 658 659 out_unlock: 659 660 unlock_page(page); 660 661 return error;
+1
include/linux/nfs_page.h
··· 34 34 PG_NEED_COMMIT, 35 35 PG_NEED_RESCHED, 36 36 PG_PNFS_COMMIT, 37 + PG_PARTIAL_READ_FAILED, 37 38 }; 38 39 39 40 struct nfs_inode;