nfs_unlock_and_release_request(req);
        }
 
-       if (atomic_dec_and_test(&cinfo.mds->rpcs_out))
+       if (nfs_commit_end(cinfo.mds))
                nfs_direct_write_complete(dreq);
 }
 
 
                                goto out_error;
                        data->ds_commit_index = i;
                        list_add_tail(&data->list, list);
-                       atomic_inc(&cinfo->mds->rpcs_out);
                        nreq++;
                }
                mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
                data->ds_commit_index = -1;
                list_splice_init(mds_pages, &data->pages);
                list_add_tail(&data->list, &list);
-               atomic_inc(&cinfo->mds->rpcs_out);
                nreq++;
        }
 
 
        atomic_inc(&cinfo->rpcs_out);
 }
 
-static void nfs_commit_end(struct nfs_mds_commit_info *cinfo)
+bool nfs_commit_end(struct nfs_mds_commit_info *cinfo)
 {
-       if (atomic_dec_and_test(&cinfo->rpcs_out))
+       if (atomic_dec_and_test(&cinfo->rpcs_out)) {
                wake_up_var(&cinfo->rpcs_out);
+               return true;
+       }
+       return false;
 }
 
 void nfs_commitdata_release(struct nfs_commit_data *data)
        data->res.fattr   = &data->fattr;
        data->res.verf    = &data->verf;
        nfs_fattr_init(&data->fattr);
+       nfs_commit_begin(cinfo->mds);
 }
 EXPORT_SYMBOL_GPL(nfs_init_commit);
 
 
        /* Set up the argument struct */
        nfs_init_commit(data, head, NULL, cinfo);
-       atomic_inc(&cinfo->mds->rpcs_out);
        if (NFS_SERVER(inode)->nfs_client->cl_minorversion)
                task_flags = RPC_TASK_MOVEABLE;
        return nfs_initiate_commit(NFS_CLIENT(inode), data, NFS_PROTO(inode),
 
 extern int  nfs_commit_inode(struct inode *, int);
 extern struct nfs_commit_data *nfs_commitdata_alloc(bool never_fail);
 extern void nfs_commit_free(struct nfs_commit_data *data);
+bool nfs_commit_end(struct nfs_mds_commit_info *cinfo);
 
 static inline int
 nfs_have_writebacks(struct inode *inode)