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: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
ff778d02bf
commit
420e3646bb
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user