nfsd: Allow nfsd_vfs_write() to take the nfsd_file as an argument
authorTrond Myklebust <trondmy@gmail.com>
Mon, 6 Jan 2020 18:40:29 +0000 (13:40 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 22 Jan 2020 21:25:40 +0000 (16:25 -0500)
Needed in order to fix stable writes.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4proc.c
fs/nfsd/vfs.c
fs/nfsd/vfs.h

index 1e14b3e..a2baf53 100644 (file)
@@ -1021,7 +1021,7 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                                      &write->wr_head, write->wr_buflen);
        WARN_ON_ONCE(nvecs > ARRAY_SIZE(rqstp->rq_vec));
 
-       status = nfsd_vfs_write(rqstp, &cstate->current_fh, nf->nf_file,
+       status = nfsd_vfs_write(rqstp, &cstate->current_fh, nf,
                                write->wr_offset, rqstp->rq_vec, nvecs, &cnt,
                                write->wr_how_written);
        nfsd_file_put(nf);
index 3aeffb2..e1ffefa 100644 (file)
@@ -947,10 +947,11 @@ static int wait_for_concurrent_writes(struct file *file)
 }
 
 __be32
-nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
+nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfsd_file *nf,
                                loff_t offset, struct kvec *vec, int vlen,
                                unsigned long *cnt, int stable)
 {
+       struct file             *file = nf->nf_file;
        struct svc_export       *exp;
        struct iov_iter         iter;
        __be32                  nfserr;
@@ -1057,7 +1058,7 @@ nfsd_write(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset,
        if (err)
                goto out;
 
-       err = nfsd_vfs_write(rqstp, fhp, nf->nf_file, offset, vec,
+       err = nfsd_vfs_write(rqstp, fhp, nf, offset, vec,
                        vlen, cnt, stable);
        nfsd_file_put(nf);
 out:
index bbb4851..0174e95 100644 (file)
@@ -34,6 +34,8 @@
 #define NFSD_MAY_CREATE                (NFSD_MAY_EXEC|NFSD_MAY_WRITE)
 #define NFSD_MAY_REMOVE                (NFSD_MAY_EXEC|NFSD_MAY_WRITE|NFSD_MAY_TRUNC)
 
+struct nfsd_file;
+
 /*
  * Callback function for readdir
  */
@@ -93,7 +95,7 @@ __be32                nfsd_read(struct svc_rqst *, struct svc_fh *,
 __be32                 nfsd_write(struct svc_rqst *, struct svc_fh *, loff_t,
                                struct kvec *, int, unsigned long *, int);
 __be32         nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp,
-                               struct file *file, loff_t offset,
+                               struct nfsd_file *nf, loff_t offset,
                                struct kvec *vec, int vlen, unsigned long *cnt,
                                int stable);
 __be32         nfsd_readlink(struct svc_rqst *, struct svc_fh *,