|
@@ -201,12 +201,15 @@ static void nfs_set_page_writeback(struct page *page)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static void nfs_end_page_writeback(struct page *page)
|
|
|
|
|
|
+static void nfs_end_page_writeback(struct nfs_page *req)
|
|
{
|
|
{
|
|
- struct inode *inode = page_file_mapping(page)->host;
|
|
|
|
|
|
+ struct inode *inode = page_file_mapping(req->wb_page)->host;
|
|
struct nfs_server *nfss = NFS_SERVER(inode);
|
|
struct nfs_server *nfss = NFS_SERVER(inode);
|
|
|
|
|
|
- end_page_writeback(page);
|
|
|
|
|
|
+ if (!nfs_page_group_sync_on_bit(req, PG_WB_END))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ end_page_writeback(req->wb_page);
|
|
if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH)
|
|
if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH)
|
|
clear_bdi_congested(&nfss->backing_dev_info, BLK_RW_ASYNC);
|
|
clear_bdi_congested(&nfss->backing_dev_info, BLK_RW_ASYNC);
|
|
}
|
|
}
|
|
@@ -397,15 +400,20 @@ static void nfs_inode_remove_request(struct nfs_page *req)
|
|
{
|
|
{
|
|
struct inode *inode = req->wb_context->dentry->d_inode;
|
|
struct inode *inode = req->wb_context->dentry->d_inode;
|
|
struct nfs_inode *nfsi = NFS_I(inode);
|
|
struct nfs_inode *nfsi = NFS_I(inode);
|
|
|
|
+ struct nfs_page *head;
|
|
|
|
|
|
- spin_lock(&inode->i_lock);
|
|
|
|
- if (likely(!PageSwapCache(req->wb_page))) {
|
|
|
|
- set_page_private(req->wb_page, 0);
|
|
|
|
- ClearPagePrivate(req->wb_page);
|
|
|
|
- clear_bit(PG_MAPPED, &req->wb_flags);
|
|
|
|
|
|
+ if (nfs_page_group_sync_on_bit(req, PG_REMOVE)) {
|
|
|
|
+ head = req->wb_head;
|
|
|
|
+
|
|
|
|
+ spin_lock(&inode->i_lock);
|
|
|
|
+ if (likely(!PageSwapCache(head->wb_page))) {
|
|
|
|
+ set_page_private(head->wb_page, 0);
|
|
|
|
+ ClearPagePrivate(head->wb_page);
|
|
|
|
+ clear_bit(PG_MAPPED, &head->wb_flags);
|
|
|
|
+ }
|
|
|
|
+ nfsi->npages--;
|
|
|
|
+ spin_unlock(&inode->i_lock);
|
|
}
|
|
}
|
|
- nfsi->npages--;
|
|
|
|
- spin_unlock(&inode->i_lock);
|
|
|
|
nfs_release_request(req);
|
|
nfs_release_request(req);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -599,7 +607,7 @@ remove_req:
|
|
nfs_inode_remove_request(req);
|
|
nfs_inode_remove_request(req);
|
|
next:
|
|
next:
|
|
nfs_unlock_request(req);
|
|
nfs_unlock_request(req);
|
|
- nfs_end_page_writeback(req->wb_page);
|
|
|
|
|
|
+ nfs_end_page_writeback(req);
|
|
do_destroy = !test_bit(NFS_IOHDR_NEED_COMMIT, &hdr->flags);
|
|
do_destroy = !test_bit(NFS_IOHDR_NEED_COMMIT, &hdr->flags);
|
|
nfs_release_request(req);
|
|
nfs_release_request(req);
|
|
}
|
|
}
|
|
@@ -964,7 +972,7 @@ static void nfs_redirty_request(struct nfs_page *req)
|
|
{
|
|
{
|
|
nfs_mark_request_dirty(req);
|
|
nfs_mark_request_dirty(req);
|
|
nfs_unlock_request(req);
|
|
nfs_unlock_request(req);
|
|
- nfs_end_page_writeback(req->wb_page);
|
|
|
|
|
|
+ nfs_end_page_writeback(req);
|
|
nfs_release_request(req);
|
|
nfs_release_request(req);
|
|
}
|
|
}
|
|
|
|
|