@@ -4441,7 +4441,7 @@ smb2_new_read_req(void **buf, unsigned int *total_len,
4441
4441
* If we want to do a RDMA write, fill in and append
4442
4442
* smbd_buffer_descriptor_v1 to the end of read request
4443
4443
*/
4444
- if (smb3_use_rdma_offload (io_parms )) {
4444
+ if (rdata && smb3_use_rdma_offload (io_parms )) {
4445
4445
struct smbd_buffer_descriptor_v1 * v1 ;
4446
4446
bool need_invalidate = server -> dialect == SMB30_PROT_ID ;
4447
4447
@@ -4523,7 +4523,6 @@ smb2_readv_callback(struct mid_q_entry *mid)
4523
4523
4524
4524
if (rdata -> got_bytes ) {
4525
4525
rqst .rq_iter = rdata -> subreq .io_iter ;
4526
- rqst .rq_iter_size = iov_iter_count (& rdata -> subreq .io_iter );
4527
4526
}
4528
4527
4529
4528
WARN_ONCE (rdata -> server != mid -> server ,
@@ -4914,6 +4913,13 @@ smb2_async_writev(struct cifs_io_subrequest *wdata)
4914
4913
if (rc )
4915
4914
goto out ;
4916
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
+
4917
4923
if (smb3_encryption_required (tcon ))
4918
4924
flags |= CIFS_TRANSFORM_REQ ;
4919
4925
@@ -4925,6 +4931,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata)
4925
4931
req -> WriteChannelInfoOffset = 0 ;
4926
4932
req -> WriteChannelInfoLength = 0 ;
4927
4933
req -> Channel = SMB2_CHANNEL_NONE ;
4934
+ req -> Length = cpu_to_le32 (io_parms -> length );
4928
4935
req -> Offset = cpu_to_le64 (io_parms -> offset );
4929
4936
req -> DataOffset = cpu_to_le16 (
4930
4937
offsetof(struct smb2_write_req , Buffer ));
@@ -4944,7 +4951,6 @@ smb2_async_writev(struct cifs_io_subrequest *wdata)
4944
4951
*/
4945
4952
if (smb3_use_rdma_offload (io_parms )) {
4946
4953
struct smbd_buffer_descriptor_v1 * v1 ;
4947
- size_t data_size = iov_iter_count (& wdata -> subreq .io_iter );
4948
4954
bool need_invalidate = server -> dialect == SMB30_PROT_ID ;
4949
4955
4950
4956
wdata -> mr = smbd_register_mr (server -> smbd_conn , & wdata -> subreq .io_iter ,
@@ -4953,9 +4959,10 @@ smb2_async_writev(struct cifs_io_subrequest *wdata)
4953
4959
rc = - EAGAIN ;
4954
4960
goto async_writev_out ;
4955
4961
}
4962
+ /* For RDMA read, I/O size is in RemainingBytes not in Length */
4963
+ req -> RemainingBytes = req -> Length ;
4956
4964
req -> Length = 0 ;
4957
4965
req -> DataOffset = 0 ;
4958
- req -> RemainingBytes = cpu_to_le32 (data_size );
4959
4966
req -> Channel = SMB2_CHANNEL_RDMA_V1_INVALIDATE ;
4960
4967
if (need_invalidate )
4961
4968
req -> Channel = SMB2_CHANNEL_RDMA_V1 ;
@@ -4967,31 +4974,22 @@ smb2_async_writev(struct cifs_io_subrequest *wdata)
4967
4974
v1 -> offset = cpu_to_le64 (wdata -> mr -> mr -> iova );
4968
4975
v1 -> token = cpu_to_le32 (wdata -> mr -> mr -> rkey );
4969
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 );
4970
4985
}
4971
4986
#endif
4972
- iov [0 ].iov_len = total_len - 1 ;
4973
- iov [0 ].iov_base = (char * )req ;
4974
4987
4975
- rqst .rq_iov = iov ;
4976
- rqst .rq_nvec = 1 ;
4977
- rqst .rq_iter = wdata -> subreq .io_iter ;
4978
- rqst .rq_iter_size = iov_iter_count (& rqst .rq_iter );
4979
4988
if (test_bit (NETFS_SREQ_RETRYING , & wdata -> subreq .flags ))
4980
4989
smb2_set_replay (server , & rqst );
4981
- #ifdef CONFIG_CIFS_SMB_DIRECT
4982
- if (wdata -> mr )
4983
- iov [0 ].iov_len += sizeof (struct smbd_buffer_descriptor_v1 );
4984
- #endif
4985
- cifs_dbg (FYI , "async write at %llu %u bytes iter=%zx\n" ,
4986
- io_parms -> offset , io_parms -> length , iov_iter_count (& rqst .rq_iter ));
4987
4990
4988
- #ifdef CONFIG_CIFS_SMB_DIRECT
4989
- /* For RDMA read, I/O size is in RemainingBytes not in Length */
4990
- if (!wdata -> mr )
4991
- req -> Length = cpu_to_le32 (io_parms -> length );
4992
- #else
4993
- req -> Length = cpu_to_le32 (io_parms -> length );
4994
- #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 ));
4995
4993
4996
4994
if (wdata -> credits .value > 0 ) {
4997
4995
shdr -> CreditCharge = cpu_to_le16 (DIV_ROUND_UP (wdata -> subreq .len ,
0 commit comments