Commit 420e3646 authored by Trond Myklebust's avatar Trond Myklebust

NFS: Reduce the number of unnecessary COMMIT calls

If the caller is doing a non-blocking flush, and there are still writebacks
pending on the wire, we can usually defer the COMMIT call until those
writes are done.

Also ensure that we honour the wbc->nonblocking flag.
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent ff778d02
...@@ -1415,12 +1415,30 @@ static int nfs_commit_inode(struct inode *inode, int how) ...@@ -1415,12 +1415,30 @@ static int nfs_commit_inode(struct inode *inode, int how)
static int nfs_commit_unstable_pages(struct inode *inode, struct writeback_control *wbc) static int nfs_commit_unstable_pages(struct inode *inode, struct writeback_control *wbc)
{ {
int ret; struct nfs_inode *nfsi = NFS_I(inode);
int flags = FLUSH_SYNC;
int ret = 0;
ret = nfs_commit_inode(inode, /* Don't commit yet if this is a non-blocking flush and there are
wbc->sync_mode == WB_SYNC_ALL ? FLUSH_SYNC : 0); * lots of outstanding writes for this mapping.
if (ret >= 0) */
if (wbc->sync_mode == WB_SYNC_NONE &&
nfsi->ncommit <= (nfsi->npages >> 1))
goto out_mark_dirty;
if (wbc->nonblocking)
flags = 0;
ret = nfs_commit_inode(inode, flags);
if (ret >= 0) {
if (wbc->sync_mode == WB_SYNC_NONE) {
if (ret < wbc->nr_to_write)
wbc->nr_to_write -= ret;
else
wbc->nr_to_write = 0;
}
return 0; return 0;
}
out_mark_dirty:
__mark_inode_dirty(inode, I_DIRTY_DATASYNC); __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment