@@ -4913,6 +4913,13 @@ smb2_async_writev(struct cifs_io_subrequest *wdata)
4913
4913
if (rc )
4914
4914
goto out ;
4915
4915
4916
+ rqst .rq_iov = iov ;
4917
+ rqst .rq_iter = wdata -> subreq .io_iter ;
4918
+
4919
+ rqst .rq_iov [0 ].iov_len = total_len - 1 ;
4920
+ rqst .rq_iov [0 ].iov_base = (char * )req ;
4921
+ rqst .rq_nvec += 1 ;
4922
+
4916
4923
if (smb3_encryption_required (tcon ))
4917
4924
flags |= CIFS_TRANSFORM_REQ ;
4918
4925
@@ -4924,6 +4931,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata)
4924
4931
req -> WriteChannelInfoOffset = 0 ;
4925
4932
req -> WriteChannelInfoLength = 0 ;
4926
4933
req -> Channel = SMB2_CHANNEL_NONE ;
4934
+ req -> Length = cpu_to_le32 (io_parms -> length );
4927
4935
req -> Offset = cpu_to_le64 (io_parms -> offset );
4928
4936
req -> DataOffset = cpu_to_le16 (
4929
4937
offsetof(struct smb2_write_req , Buffer ));
@@ -4943,7 +4951,6 @@ smb2_async_writev(struct cifs_io_subrequest *wdata)
4943
4951
*/
4944
4952
if (smb3_use_rdma_offload (io_parms )) {
4945
4953
struct smbd_buffer_descriptor_v1 * v1 ;
4946
- size_t data_size = iov_iter_count (& wdata -> subreq .io_iter );
4947
4954
bool need_invalidate = server -> dialect == SMB30_PROT_ID ;
4948
4955
4949
4956
wdata -> mr = smbd_register_mr (server -> smbd_conn , & wdata -> subreq .io_iter ,
@@ -4952,9 +4959,10 @@ smb2_async_writev(struct cifs_io_subrequest *wdata)
4952
4959
rc = - EAGAIN ;
4953
4960
goto async_writev_out ;
4954
4961
}
4962
+ /* For RDMA read, I/O size is in RemainingBytes not in Length */
4963
+ req -> RemainingBytes = req -> Length ;
4955
4964
req -> Length = 0 ;
4956
4965
req -> DataOffset = 0 ;
4957
- req -> RemainingBytes = cpu_to_le32 (data_size );
4958
4966
req -> Channel = SMB2_CHANNEL_RDMA_V1_INVALIDATE ;
4959
4967
if (need_invalidate )
4960
4968
req -> Channel = SMB2_CHANNEL_RDMA_V1 ;
@@ -4966,30 +4974,22 @@ smb2_async_writev(struct cifs_io_subrequest *wdata)
4966
4974
v1 -> offset = cpu_to_le64 (wdata -> mr -> mr -> iova );
4967
4975
v1 -> token = cpu_to_le32 (wdata -> mr -> mr -> rkey );
4968
4976
v1 -> length = cpu_to_le32 (wdata -> mr -> mr -> length );
4977
+
4978
+ rqst .rq_iov [0 ].iov_len += sizeof (* v1 );
4979
+
4980
+ /*
4981
+ * We keep wdata->subreq.io_iter,
4982
+ * but we have to truncate rqst.rq_iter
4983
+ */
4984
+ iov_iter_truncate (& rqst .rq_iter , 0 );
4969
4985
}
4970
4986
#endif
4971
- iov [0 ].iov_len = total_len - 1 ;
4972
- iov [0 ].iov_base = (char * )req ;
4973
4987
4974
- rqst .rq_iov = iov ;
4975
- rqst .rq_nvec = 1 ;
4976
- rqst .rq_iter = wdata -> subreq .io_iter ;
4977
4988
if (test_bit (NETFS_SREQ_RETRYING , & wdata -> subreq .flags ))
4978
4989
smb2_set_replay (server , & rqst );
4979
- #ifdef CONFIG_CIFS_SMB_DIRECT
4980
- if (wdata -> mr )
4981
- iov [0 ].iov_len += sizeof (struct smbd_buffer_descriptor_v1 );
4982
- #endif
4983
- cifs_dbg (FYI , "async write at %llu %u bytes iter=%zx\n" ,
4984
- io_parms -> offset , io_parms -> length , iov_iter_count (& rqst .rq_iter ));
4985
4990
4986
- #ifdef CONFIG_CIFS_SMB_DIRECT
4987
- /* For RDMA read, I/O size is in RemainingBytes not in Length */
4988
- if (!wdata -> mr )
4989
- req -> Length = cpu_to_le32 (io_parms -> length );
4990
- #else
4991
- req -> Length = cpu_to_le32 (io_parms -> length );
4992
- #endif
4991
+ cifs_dbg (FYI , "async write at %llu %u bytes iter=%zx\n" ,
4992
+ io_parms -> offset , io_parms -> length , iov_iter_count (& wdata -> subreq .io_iter ));
4993
4993
4994
4994
if (wdata -> credits .value > 0 ) {
4995
4995
shdr -> CreditCharge = cpu_to_le16 (DIV_ROUND_UP (wdata -> subreq .len ,
0 commit comments