@@ -4507,6 +4507,7 @@ static void
45074507smb2_readv_callback (struct mid_q_entry * mid )
45084508{
45094509 struct cifs_io_subrequest * rdata = mid -> callback_data ;
4510+ struct netfs_inode * ictx = netfs_inode (rdata -> rreq -> inode );
45104511 struct cifs_tcon * tcon = tlink_tcon (rdata -> req -> cfile -> tlink );
45114512 struct TCP_Server_Info * server = rdata -> server ;
45124513 struct smb2_hdr * shdr =
@@ -4529,9 +4530,9 @@ smb2_readv_callback(struct mid_q_entry *mid)
45294530 "rdata server %p != mid server %p" ,
45304531 rdata -> server , mid -> server );
45314532
4532- cifs_dbg (FYI , "%s: mid=%llu state=%d result=%d bytes=%zu\n" ,
4533+ cifs_dbg (FYI , "%s: mid=%llu state=%d result=%d bytes=%zu/%zu \n" ,
45334534 __func__ , mid -> mid , mid -> mid_state , rdata -> result ,
4534- rdata -> subreq .len );
4535+ rdata -> actual_len , rdata -> subreq .len - rdata -> subreq . transferred );
45354536
45364537 switch (mid -> mid_state ) {
45374538 case MID_RESPONSE_RECEIVED :
@@ -4585,22 +4586,29 @@ smb2_readv_callback(struct mid_q_entry *mid)
45854586 rdata -> subreq .debug_index ,
45864587 rdata -> xid ,
45874588 rdata -> req -> cfile -> fid .persistent_fid ,
4588- tcon -> tid , tcon -> ses -> Suid , rdata -> subreq .start ,
4589- rdata -> subreq .len , rdata -> result );
4589+ tcon -> tid , tcon -> ses -> Suid ,
4590+ rdata -> subreq .start + rdata -> subreq .transferred ,
4591+ rdata -> actual_len ,
4592+ rdata -> result );
45904593 } else
45914594 trace_smb3_read_done (rdata -> rreq -> debug_id ,
45924595 rdata -> subreq .debug_index ,
45934596 rdata -> xid ,
45944597 rdata -> req -> cfile -> fid .persistent_fid ,
45954598 tcon -> tid , tcon -> ses -> Suid ,
4596- rdata -> subreq .start , rdata -> got_bytes );
4599+ rdata -> subreq .start + rdata -> subreq .transferred ,
4600+ rdata -> got_bytes );
45974601
45984602 if (rdata -> result == - ENODATA ) {
4599- /* We may have got an EOF error because fallocate
4600- * failed to enlarge the file.
4601- */
4602- if (rdata -> subreq .start < rdata -> subreq .rreq -> i_size )
4603+ __set_bit (NETFS_SREQ_HIT_EOF , & rdata -> subreq .flags );
4604+ rdata -> result = 0 ;
4605+ } else {
4606+ if (rdata -> got_bytes < rdata -> actual_len &&
4607+ rdata -> subreq .start + rdata -> subreq .transferred + rdata -> got_bytes ==
4608+ ictx -> remote_i_size ) {
4609+ __set_bit (NETFS_SREQ_HIT_EOF , & rdata -> subreq .flags );
46034610 rdata -> result = 0 ;
4611+ }
46044612 }
46054613 trace_smb3_rw_credits (rreq_debug_id , subreq_debug_index , rdata -> credits .value ,
46064614 server -> credits , server -> in_flight ,
@@ -4621,6 +4629,7 @@ smb2_async_readv(struct cifs_io_subrequest *rdata)
46214629{
46224630 int rc , flags = 0 ;
46234631 char * buf ;
4632+ struct netfs_io_subrequest * subreq = & rdata -> subreq ;
46244633 struct smb2_hdr * shdr ;
46254634 struct cifs_io_parms io_parms ;
46264635 struct smb_rqst rqst = { .rq_iov = rdata -> iov ,
@@ -4631,15 +4640,15 @@ smb2_async_readv(struct cifs_io_subrequest *rdata)
46314640 int credit_request ;
46324641
46334642 cifs_dbg (FYI , "%s: offset=%llu bytes=%zu\n" ,
4634- __func__ , rdata -> subreq . start , rdata -> subreq . len );
4643+ __func__ , subreq -> start , subreq -> len );
46354644
46364645 if (!rdata -> server )
46374646 rdata -> server = cifs_pick_channel (tcon -> ses );
46384647
46394648 io_parms .tcon = tlink_tcon (rdata -> req -> cfile -> tlink );
46404649 io_parms .server = server = rdata -> server ;
4641- io_parms .offset = rdata -> subreq . start ;
4642- io_parms .length = rdata -> subreq . len ;
4650+ io_parms .offset = subreq -> start + subreq -> transferred ;
4651+ io_parms .length = rdata -> actual_len ;
46434652 io_parms .persistent_fid = rdata -> req -> cfile -> fid .persistent_fid ;
46444653 io_parms .volatile_fid = rdata -> req -> cfile -> fid .volatile_fid ;
46454654 io_parms .pid = rdata -> req -> pid ;
@@ -4654,11 +4663,13 @@ smb2_async_readv(struct cifs_io_subrequest *rdata)
46544663
46554664 rdata -> iov [0 ].iov_base = buf ;
46564665 rdata -> iov [0 ].iov_len = total_len ;
4666+ rdata -> got_bytes = 0 ;
4667+ rdata -> result = 0 ;
46574668
46584669 shdr = (struct smb2_hdr * )buf ;
46594670
46604671 if (rdata -> credits .value > 0 ) {
4661- shdr -> CreditCharge = cpu_to_le16 (DIV_ROUND_UP (rdata -> subreq . len ,
4672+ shdr -> CreditCharge = cpu_to_le16 (DIV_ROUND_UP (rdata -> actual_len ,
46624673 SMB2_MAX_BUFFER_SIZE ));
46634674 credit_request = le16_to_cpu (shdr -> CreditCharge ) + 8 ;
46644675 if (server -> credits >= server -> max_credits )
@@ -4682,11 +4693,11 @@ smb2_async_readv(struct cifs_io_subrequest *rdata)
46824693 if (rc ) {
46834694 cifs_stats_fail_inc (io_parms .tcon , SMB2_READ_HE );
46844695 trace_smb3_read_err (rdata -> rreq -> debug_id ,
4685- rdata -> subreq . debug_index ,
4696+ subreq -> debug_index ,
46864697 rdata -> xid , io_parms .persistent_fid ,
46874698 io_parms .tcon -> tid ,
46884699 io_parms .tcon -> ses -> Suid ,
4689- io_parms .offset , io_parms . length , rc );
4700+ io_parms .offset , rdata -> actual_len , rc );
46904701 }
46914702
46924703async_readv_out :
0 commit comments