diff options
Diffstat (limited to 'fs/nfs/file.c')
| -rw-r--r-- | fs/nfs/file.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 6b4a79f4ad1d..94e94bd11aae 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
| @@ -495,6 +495,35 @@ static int nfs_release_page(struct page *page, gfp_t gfp) | |||
| 495 | return nfs_fscache_release_page(page, gfp); | 495 | return nfs_fscache_release_page(page, gfp); |
| 496 | } | 496 | } |
| 497 | 497 | ||
| 498 | static void nfs_check_dirty_writeback(struct page *page, | ||
| 499 | bool *dirty, bool *writeback) | ||
| 500 | { | ||
| 501 | struct nfs_inode *nfsi; | ||
| 502 | struct address_space *mapping = page_file_mapping(page); | ||
| 503 | |||
| 504 | if (!mapping || PageSwapCache(page)) | ||
| 505 | return; | ||
| 506 | |||
| 507 | /* | ||
| 508 | * Check if an unstable page is currently being committed and | ||
| 509 | * if so, have the VM treat it as if the page is under writeback | ||
| 510 | * so it will not block due to pages that will shortly be freeable. | ||
| 511 | */ | ||
| 512 | nfsi = NFS_I(mapping->host); | ||
| 513 | if (test_bit(NFS_INO_COMMIT, &nfsi->flags)) { | ||
| 514 | *writeback = true; | ||
| 515 | return; | ||
| 516 | } | ||
| 517 | |||
| 518 | /* | ||
| 519 | * If PagePrivate() is set, then the page is not freeable and as the | ||
| 520 | * inode is not being committed, it's not going to be cleaned in the | ||
| 521 | * near future so treat it as dirty | ||
| 522 | */ | ||
| 523 | if (PagePrivate(page)) | ||
| 524 | *dirty = true; | ||
| 525 | } | ||
| 526 | |||
| 498 | /* | 527 | /* |
| 499 | * Attempt to clear the private state associated with a page when an error | 528 | * Attempt to clear the private state associated with a page when an error |
| 500 | * occurs that requires the cached contents of an inode to be written back or | 529 | * occurs that requires the cached contents of an inode to be written back or |
| @@ -542,6 +571,7 @@ const struct address_space_operations nfs_file_aops = { | |||
| 542 | .direct_IO = nfs_direct_IO, | 571 | .direct_IO = nfs_direct_IO, |
| 543 | .migratepage = nfs_migrate_page, | 572 | .migratepage = nfs_migrate_page, |
| 544 | .launder_page = nfs_launder_page, | 573 | .launder_page = nfs_launder_page, |
| 574 | .is_dirty_writeback = nfs_check_dirty_writeback, | ||
| 545 | .error_remove_page = generic_error_remove_page, | 575 | .error_remove_page = generic_error_remove_page, |
| 546 | #ifdef CONFIG_NFS_SWAP | 576 | #ifdef CONFIG_NFS_SWAP |
| 547 | .swap_activate = nfs_swap_activate, | 577 | .swap_activate = nfs_swap_activate, |
