@@ -1143,11 +1143,27 @@ static int wait_for_concurrent_writes(struct file *file)
11431143 return err ;
11441144}
11451145
1146+ /**
1147+ * nfsd_vfs_write - write data to an already-open file
1148+ * @rqstp: RPC execution context
1149+ * @fhp: File handle of file to write into
1150+ * @nf: An open file matching @fhp
1151+ * @offset: Byte offset of start
1152+ * @payload: xdr_buf containing the write payload
1153+ * @cnt: IN: number of bytes to write, OUT: number of bytes actually written
1154+ * @stable: An NFS stable_how value
1155+ * @verf: NFS WRITE verifier
1156+ *
1157+ * Upon return, caller must invoke fh_put on @fhp.
1158+ *
1159+ * Return values:
1160+ * An nfsstat value in network byte order.
1161+ */
11461162__be32
1147- nfsd_vfs_write (struct svc_rqst * rqstp , struct svc_fh * fhp , struct nfsd_file * nf ,
1148- loff_t offset , struct kvec * vec , int vlen ,
1149- unsigned long * cnt , int stable ,
1150- __be32 * verf )
1163+ nfsd_vfs_write (struct svc_rqst * rqstp , struct svc_fh * fhp ,
1164+ struct nfsd_file * nf , loff_t offset ,
1165+ const struct xdr_buf * payload , unsigned long * cnt ,
1166+ int stable , __be32 * verf )
11511167{
11521168 struct nfsd_net * nn = net_generic (SVC_NET (rqstp ), nfsd_net_id );
11531169 struct file * file = nf -> nf_file ;
@@ -1162,6 +1178,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfsd_file *nf,
11621178 unsigned int pflags = current -> flags ;
11631179 rwf_t flags = 0 ;
11641180 bool restore_flags = false;
1181+ unsigned int nvecs ;
11651182
11661183 trace_nfsd_write_opened (rqstp , fhp , offset , * cnt );
11671184
@@ -1189,7 +1206,8 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfsd_file *nf,
11891206 if (stable && !fhp -> fh_use_wgather )
11901207 flags |= RWF_SYNC ;
11911208
1192- iov_iter_kvec (& iter , ITER_SOURCE , vec , vlen , * cnt );
1209+ nvecs = svc_fill_write_vector (rqstp , payload );
1210+ iov_iter_kvec (& iter , ITER_SOURCE , rqstp -> rq_vec , nvecs , * cnt );
11931211 since = READ_ONCE (file -> f_wb_err );
11941212 if (verf )
11951213 nfsd_copy_write_verifier (verf , nn );
@@ -1289,14 +1307,24 @@ __be32 nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp,
12891307 return err ;
12901308}
12911309
1292- /*
1293- * Write data to a file.
1294- * The stable flag requests synchronous writes.
1295- * N.B. After this call fhp needs an fh_put
1310+ /**
1311+ * nfsd_write - open a file and write data to it
1312+ * @rqstp: RPC execution context
1313+ * @fhp: File handle of file to write into; nfsd_write() may modify it
1314+ * @offset: Byte offset of start
1315+ * @payload: xdr_buf containing the write payload
1316+ * @cnt: IN: number of bytes to write, OUT: number of bytes actually written
1317+ * @stable: An NFS stable_how value
1318+ * @verf: NFS WRITE verifier
1319+ *
1320+ * Upon return, caller must invoke fh_put on @fhp.
1321+ *
1322+ * Return values:
1323+ * An nfsstat value in network byte order.
12961324 */
12971325__be32
12981326nfsd_write (struct svc_rqst * rqstp , struct svc_fh * fhp , loff_t offset ,
1299- struct kvec * vec , int vlen , unsigned long * cnt , int stable ,
1327+ const struct xdr_buf * payload , unsigned long * cnt , int stable ,
13001328 __be32 * verf )
13011329{
13021330 struct nfsd_file * nf ;
@@ -1308,8 +1336,8 @@ nfsd_write(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset,
13081336 if (err )
13091337 goto out ;
13101338
1311- err = nfsd_vfs_write (rqstp , fhp , nf , offset , vec ,
1312- vlen , cnt , stable , verf );
1339+ err = nfsd_vfs_write (rqstp , fhp , nf , offset , payload , cnt ,
1340+ stable , verf );
13131341 nfsd_file_put (nf );
13141342out :
13151343 trace_nfsd_write_done (rqstp , fhp , offset , * cnt );
0 commit comments