mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 04:10:51 +07:00
NFS: Fix nfs_wb_page() to always exit with an error or a clean page
It is possible for nfs_wb_page() to sometimes exit with 0 return value, yet the page is left in a dirty state. For instance in the case where the server rebooted, and the COMMIT request failed, then all the previously "clean" pages which were cached by the server, but were not guaranteed to have been writted out to disk, have to be redirtied and resent to the server. The fix is to have nfs_wb_page_priority() check that the page is clean before it exits... This fixes a condition that triggers the BUG_ON(PagePrivate(page)) in nfs_create_request() when we're in the nfs_readpage() path. Also eliminate a redundant BUG_ON(!PageLocked(page)) while we're at it. It turns out that clear_page_dirty_for_io() has the exact same test. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
080a1f148d
commit
73e3302f60
@ -1493,18 +1493,19 @@ static int nfs_wb_page_priority(struct inode *inode, struct page *page,
|
||||
};
|
||||
int ret;
|
||||
|
||||
BUG_ON(!PageLocked(page));
|
||||
if (clear_page_dirty_for_io(page)) {
|
||||
ret = nfs_writepage_locked(page, &wbc);
|
||||
do {
|
||||
if (clear_page_dirty_for_io(page)) {
|
||||
ret = nfs_writepage_locked(page, &wbc);
|
||||
if (ret < 0)
|
||||
goto out_error;
|
||||
} else if (!PagePrivate(page))
|
||||
break;
|
||||
ret = nfs_sync_mapping_wait(page->mapping, &wbc, how);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
}
|
||||
if (!PagePrivate(page))
|
||||
return 0;
|
||||
ret = nfs_sync_mapping_wait(page->mapping, &wbc, how);
|
||||
if (ret >= 0)
|
||||
return 0;
|
||||
out:
|
||||
goto out_error;
|
||||
} while (PagePrivate(page));
|
||||
return 0;
|
||||
out_error:
|
||||
__mark_inode_dirty(inode, I_DIRTY_PAGES);
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user