@@ -1261,16 +1261,32 @@ CIFS_open(const unsigned int xid, struct cifs_open_parms *oparms, int *oplock,
1261
1261
return rc ;
1262
1262
}
1263
1263
1264
+ static void cifs_readv_worker (struct work_struct * work )
1265
+ {
1266
+ struct cifs_io_subrequest * rdata =
1267
+ container_of (work , struct cifs_io_subrequest , subreq .work );
1268
+
1269
+ netfs_subreq_terminated (& rdata -> subreq ,
1270
+ (rdata -> result == 0 || rdata -> result == - EAGAIN ) ?
1271
+ rdata -> got_bytes : rdata -> result , true);
1272
+ }
1273
+
1264
1274
static void
1265
1275
cifs_readv_callback (struct mid_q_entry * mid )
1266
1276
{
1267
1277
struct cifs_io_subrequest * rdata = mid -> callback_data ;
1278
+ struct netfs_inode * ictx = netfs_inode (rdata -> rreq -> inode );
1268
1279
struct cifs_tcon * tcon = tlink_tcon (rdata -> req -> cfile -> tlink );
1269
1280
struct TCP_Server_Info * server = tcon -> ses -> server ;
1270
1281
struct smb_rqst rqst = { .rq_iov = rdata -> iov ,
1271
1282
.rq_nvec = 2 ,
1272
1283
.rq_iter = rdata -> subreq .io_iter };
1273
- struct cifs_credits credits = { .value = 1 , .instance = 0 };
1284
+ struct cifs_credits credits = {
1285
+ .value = 1 ,
1286
+ .instance = 0 ,
1287
+ .rreq_debug_id = rdata -> rreq -> debug_id ,
1288
+ .rreq_debug_index = rdata -> subreq .debug_index ,
1289
+ };
1274
1290
1275
1291
cifs_dbg (FYI , "%s: mid=%llu state=%d result=%d bytes=%zu\n" ,
1276
1292
__func__ , mid -> mid , mid -> mid_state , rdata -> result ,
@@ -1282,6 +1298,7 @@ cifs_readv_callback(struct mid_q_entry *mid)
1282
1298
if (server -> sign ) {
1283
1299
int rc = 0 ;
1284
1300
1301
+ iov_iter_truncate (& rqst .rq_iter , rdata -> got_bytes );
1285
1302
rc = cifs_verify_signature (& rqst , server ,
1286
1303
mid -> sequence_number );
1287
1304
if (rc )
@@ -1306,13 +1323,21 @@ cifs_readv_callback(struct mid_q_entry *mid)
1306
1323
rdata -> result = - EIO ;
1307
1324
}
1308
1325
1309
- if (rdata -> result == 0 || rdata -> result == - EAGAIN )
1310
- iov_iter_advance (& rdata -> subreq .io_iter , rdata -> got_bytes );
1326
+ if (rdata -> result == - ENODATA ) {
1327
+ __set_bit (NETFS_SREQ_HIT_EOF , & rdata -> subreq .flags );
1328
+ rdata -> result = 0 ;
1329
+ } else {
1330
+ if (rdata -> got_bytes < rdata -> actual_len &&
1331
+ rdata -> subreq .start + rdata -> subreq .transferred + rdata -> got_bytes ==
1332
+ ictx -> remote_i_size ) {
1333
+ __set_bit (NETFS_SREQ_HIT_EOF , & rdata -> subreq .flags );
1334
+ rdata -> result = 0 ;
1335
+ }
1336
+ }
1337
+
1311
1338
rdata -> credits .value = 0 ;
1312
- netfs_subreq_terminated (& rdata -> subreq ,
1313
- (rdata -> result == 0 || rdata -> result == - EAGAIN ) ?
1314
- rdata -> got_bytes : rdata -> result ,
1315
- false);
1339
+ INIT_WORK (& rdata -> subreq .work , cifs_readv_worker );
1340
+ queue_work (cifsiod_wq , & rdata -> subreq .work );
1316
1341
release_mid (mid );
1317
1342
add_credits (server , & credits , 0 );
1318
1343
}
@@ -1619,9 +1644,15 @@ static void
1619
1644
cifs_writev_callback (struct mid_q_entry * mid )
1620
1645
{
1621
1646
struct cifs_io_subrequest * wdata = mid -> callback_data ;
1647
+ struct TCP_Server_Info * server = wdata -> server ;
1622
1648
struct cifs_tcon * tcon = tlink_tcon (wdata -> req -> cfile -> tlink );
1623
1649
WRITE_RSP * smb = (WRITE_RSP * )mid -> resp_buf ;
1624
- struct cifs_credits credits = { .value = 1 , .instance = 0 };
1650
+ struct cifs_credits credits = {
1651
+ .value = 1 ,
1652
+ .instance = 0 ,
1653
+ .rreq_debug_id = wdata -> rreq -> debug_id ,
1654
+ .rreq_debug_index = wdata -> subreq .debug_index ,
1655
+ };
1625
1656
ssize_t result ;
1626
1657
size_t written ;
1627
1658
@@ -1657,9 +1688,16 @@ cifs_writev_callback(struct mid_q_entry *mid)
1657
1688
break ;
1658
1689
}
1659
1690
1691
+ trace_smb3_rw_credits (credits .rreq_debug_id , credits .rreq_debug_index ,
1692
+ wdata -> credits .value ,
1693
+ server -> credits , server -> in_flight ,
1694
+ 0 , cifs_trace_rw_credits_write_response_clear );
1660
1695
wdata -> credits .value = 0 ;
1661
1696
cifs_write_subrequest_terminated (wdata , result , true);
1662
1697
release_mid (mid );
1698
+ trace_smb3_rw_credits (credits .rreq_debug_id , credits .rreq_debug_index , 0 ,
1699
+ server -> credits , server -> in_flight ,
1700
+ credits .value , cifs_trace_rw_credits_write_response_add );
1663
1701
add_credits (tcon -> ses -> server , & credits , 0 );
1664
1702
}
1665
1703
0 commit comments