#include "cache.h"
 #include "xdr3.h"
 #include "vfs.h"
+#include "filecache.h"
 
 #define NFSDDBG_FACILITY               NFSDDBG_PROC
 
 {
        struct nfsd3_commitargs *argp = rqstp->rq_argp;
        struct nfsd3_commitres *resp = rqstp->rq_resp;
+       struct nfsd_file *nf;
 
        dprintk("nfsd: COMMIT(3)   %s %u@%Lu\n",
                                SVCFH_fmt(&argp->fh),
                                (unsigned long long) argp->offset);
 
        fh_copy(&resp->fh, &argp->fh);
-       resp->status = nfsd_commit(rqstp, &resp->fh, argp->offset,
+       resp->status = nfsd_file_acquire(rqstp, &resp->fh, NFSD_MAY_WRITE |
+                                        NFSD_MAY_NOT_BREAK_LEASE, &nf);
+       if (resp->status)
+               goto out;
+       resp->status = nfsd_commit(rqstp, &resp->fh, nf, argp->offset,
                                   argp->count, resp->verf);
+       nfsd_file_put(nf);
+out:
        return rpc_success;
 }
 
 
             union nfsd4_op_u *u)
 {
        struct nfsd4_commit *commit = &u->commit;
+       struct nfsd_file *nf;
+       __be32 status;
 
-       return nfsd_commit(rqstp, &cstate->current_fh, commit->co_offset,
+       status = nfsd_file_acquire(rqstp, &cstate->current_fh, NFSD_MAY_WRITE |
+                                  NFSD_MAY_NOT_BREAK_LEASE, &nf);
+       if (status != nfs_ok)
+               return status;
+
+       status = nfsd_commit(rqstp, &cstate->current_fh, nf, commit->co_offset,
                             commit->co_count,
                             (__be32 *)commit->co_verf.data);
+       nfsd_file_put(nf);
+       return status;
 }
 
 static __be32
 
  * nfsd_commit - Commit pending writes to stable storage
  * @rqstp: RPC request being processed
  * @fhp: NFS filehandle
+ * @nf: target file
  * @offset: raw offset from beginning of file
  * @count: raw count of bytes to sync
  * @verf: filled in with the server's current write verifier
  *   An nfsstat value in network byte order.
  */
 __be32
-nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp, u64 offset,
-           u32 count, __be32 *verf)
+nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfsd_file *nf,
+           u64 offset, u32 count, __be32 *verf)
 {
+       __be32                  err = nfs_ok;
        u64                     maxbytes;
        loff_t                  start, end;
        struct nfsd_net         *nn;
-       struct nfsd_file        *nf;
-       __be32                  err;
-
-       err = nfsd_file_acquire(rqstp, fhp,
-                       NFSD_MAY_WRITE|NFSD_MAY_NOT_BREAK_LEASE, &nf);
-       if (err)
-               goto out;
 
        /*
         * Convert the client-provided (offset, count) range to a
        } else
                nfsd_copy_write_verifier(verf, nn);
 
-       nfsd_file_put(nf);
-out:
        return err;
 }
 
 
 __be32         nfsd_create_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp,
                                struct svc_fh *resfhp, struct nfsd_attrs *iap);
 __be32         nfsd_commit(struct svc_rqst *rqst, struct svc_fh *fhp,
-                               u64 offset, u32 count, __be32 *verf);
+                               struct nfsd_file *nf, u64 offset, u32 count,
+                               __be32 *verf);
 #ifdef CONFIG_NFSD_V4
 __be32         nfsd_getxattr(struct svc_rqst *rqstp, struct svc_fh *fhp,
                            char *name, void **bufp, int *lenp);