Hopefully this will help limit the number of unstable pages to be synced at one time, more timely return of the commit request and reduce dirty throttle fluctuations. CC: Trond Myklebust <Trond.Myklebust@xxxxxxxxxx> Signed-off-by: Wu Fengguang <fengguang.wu@xxxxxxxxx> --- fs/nfs/write.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) --- linux-next.orig/fs/nfs/write.c 2010-12-08 22:54:08.000000000 +0800 +++ linux-next/fs/nfs/write.c 2010-12-08 22:54:13.000000000 +0800 @@ -1333,7 +1333,7 @@ static void nfs_commitdata_release(void */ static int nfs_commit_rpcsetup(struct list_head *head, struct nfs_write_data *data, - int how) + int how, pgoff_t offset, pgoff_t count) { struct nfs_page *first = nfs_list_entry(head->next); struct inode *inode = first->wb_context->path.dentry->d_inode; @@ -1365,8 +1365,8 @@ static int nfs_commit_rpcsetup(struct li data->args.fh = NFS_FH(data->inode); /* Note: we always request a commit of the entire inode */ - data->args.offset = 0; - data->args.count = 0; + data->args.offset = offset; + data->args.count = count; data->args.context = get_nfs_open_context(first->wb_context); data->res.count = 0; data->res.fattr = &data->fattr; @@ -1389,7 +1389,8 @@ static int nfs_commit_rpcsetup(struct li * Commit dirty pages */ static int -nfs_commit_list(struct inode *inode, struct list_head *head, int how) +nfs_commit_list(struct inode *inode, struct list_head *head, int how, + pgoff_t offset, pgoff_t count) { struct nfs_write_data *data; struct nfs_page *req; @@ -1400,7 +1401,7 @@ nfs_commit_list(struct inode *inode, str goto out_bad; /* Set up the argument struct */ - return nfs_commit_rpcsetup(head, data, how); + return nfs_commit_rpcsetup(head, data, how, offset, count); out_bad: while (!list_empty(head)) { req = nfs_list_entry(head->next); @@ -1485,6 +1486,8 @@ static const struct rpc_call_ops nfs_com int nfs_commit_inode(struct inode *inode, int how) { LIST_HEAD(head); + pgoff_t first_index; + pgoff_t last_index; int sync = how & FLUSH_SYNC; int res = 0; @@ -1494,9 +1497,14 @@ int nfs_commit_inode(struct inode *inode nfs_commit_wait(NFS_SERVER(inode)); spin_lock(&inode->i_lock); res = nfs_scan_commit(inode, &head, 0, 0); + if (res) { + first_index = nfs_list_entry(head.next)->wb_index; + last_index = nfs_list_entry(head.prev)->wb_index; + } spin_unlock(&inode->i_lock); if (res) { - int error = nfs_commit_list(inode, &head, how); + int error = nfs_commit_list(inode, &head, how, first_index, + last_index - first_index + 1); if (error < 0) return error; if (sync) -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html