@@ -264,7 +264,7 @@ smb2_revert_current_mid(struct TCP_Server_Info *server, const unsigned int val)
264
264
}
265
265
266
266
static struct mid_q_entry *
267
- smb2_find_mid (struct TCP_Server_Info * server , char * buf )
267
+ __smb2_find_mid (struct TCP_Server_Info * server , char * buf , bool dequeue )
268
268
{
269
269
struct mid_q_entry * mid ;
270
270
struct smb2_sync_hdr * shdr = (struct smb2_sync_hdr * )buf ;
@@ -281,6 +281,10 @@ smb2_find_mid(struct TCP_Server_Info *server, char *buf)
281
281
(mid -> mid_state == MID_REQUEST_SUBMITTED ) &&
282
282
(mid -> command == shdr -> Command )) {
283
283
kref_get (& mid -> refcount );
284
+ if (dequeue ) {
285
+ list_del_init (& mid -> qhead );
286
+ mid -> mid_flags |= MID_DELETED ;
287
+ }
284
288
spin_unlock (& GlobalMid_Lock );
285
289
return mid ;
286
290
}
@@ -289,6 +293,18 @@ smb2_find_mid(struct TCP_Server_Info *server, char *buf)
289
293
return NULL ;
290
294
}
291
295
296
+ static struct mid_q_entry *
297
+ smb2_find_mid (struct TCP_Server_Info * server , char * buf )
298
+ {
299
+ return __smb2_find_mid (server , buf , false);
300
+ }
301
+
302
+ static struct mid_q_entry *
303
+ smb2_find_dequeue_mid (struct TCP_Server_Info * server , char * buf )
304
+ {
305
+ return __smb2_find_mid (server , buf , true);
306
+ }
307
+
292
308
static void
293
309
smb2_dump_detail (void * buf , struct TCP_Server_Info * server )
294
310
{
@@ -4404,7 +4420,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
4404
4420
cifs_dbg (FYI , "%s: server returned error %d\n" ,
4405
4421
__func__ , rdata -> result );
4406
4422
/* normal error on read response */
4407
- dequeue_mid (mid , false);
4423
+ if (is_offloaded )
4424
+ mid -> mid_state = MID_RESPONSE_RECEIVED ;
4425
+ else
4426
+ dequeue_mid (mid , false);
4408
4427
return 0 ;
4409
4428
}
4410
4429
@@ -4428,7 +4447,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
4428
4447
cifs_dbg (FYI , "%s: data offset (%u) beyond end of smallbuf\n" ,
4429
4448
__func__ , data_offset );
4430
4449
rdata -> result = - EIO ;
4431
- dequeue_mid (mid , rdata -> result );
4450
+ if (is_offloaded )
4451
+ mid -> mid_state = MID_RESPONSE_MALFORMED ;
4452
+ else
4453
+ dequeue_mid (mid , rdata -> result );
4432
4454
return 0 ;
4433
4455
}
4434
4456
@@ -4444,21 +4466,30 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
4444
4466
cifs_dbg (FYI , "%s: data offset (%u) beyond 1st page of response\n" ,
4445
4467
__func__ , data_offset );
4446
4468
rdata -> result = - EIO ;
4447
- dequeue_mid (mid , rdata -> result );
4469
+ if (is_offloaded )
4470
+ mid -> mid_state = MID_RESPONSE_MALFORMED ;
4471
+ else
4472
+ dequeue_mid (mid , rdata -> result );
4448
4473
return 0 ;
4449
4474
}
4450
4475
4451
4476
if (data_len > page_data_size - pad_len ) {
4452
4477
/* data_len is corrupt -- discard frame */
4453
4478
rdata -> result = - EIO ;
4454
- dequeue_mid (mid , rdata -> result );
4479
+ if (is_offloaded )
4480
+ mid -> mid_state = MID_RESPONSE_MALFORMED ;
4481
+ else
4482
+ dequeue_mid (mid , rdata -> result );
4455
4483
return 0 ;
4456
4484
}
4457
4485
4458
4486
rdata -> result = init_read_bvec (pages , npages , page_data_size ,
4459
4487
cur_off , & bvec );
4460
4488
if (rdata -> result != 0 ) {
4461
- dequeue_mid (mid , rdata -> result );
4489
+ if (is_offloaded )
4490
+ mid -> mid_state = MID_RESPONSE_MALFORMED ;
4491
+ else
4492
+ dequeue_mid (mid , rdata -> result );
4462
4493
return 0 ;
4463
4494
}
4464
4495
@@ -4473,7 +4504,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
4473
4504
/* read response payload cannot be in both buf and pages */
4474
4505
WARN_ONCE (1 , "buf can not contain only a part of read data" );
4475
4506
rdata -> result = - EIO ;
4476
- dequeue_mid (mid , rdata -> result );
4507
+ if (is_offloaded )
4508
+ mid -> mid_state = MID_RESPONSE_MALFORMED ;
4509
+ else
4510
+ dequeue_mid (mid , rdata -> result );
4477
4511
return 0 ;
4478
4512
}
4479
4513
@@ -4484,7 +4518,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
4484
4518
if (length < 0 )
4485
4519
return length ;
4486
4520
4487
- dequeue_mid (mid , false);
4521
+ if (is_offloaded )
4522
+ mid -> mid_state = MID_RESPONSE_RECEIVED ;
4523
+ else
4524
+ dequeue_mid (mid , false);
4488
4525
return length ;
4489
4526
}
4490
4527
@@ -4513,7 +4550,7 @@ static void smb2_decrypt_offload(struct work_struct *work)
4513
4550
}
4514
4551
4515
4552
dw -> server -> lstrp = jiffies ;
4516
- mid = smb2_find_mid (dw -> server , dw -> buf );
4553
+ mid = smb2_find_dequeue_mid (dw -> server , dw -> buf );
4517
4554
if (mid == NULL )
4518
4555
cifs_dbg (FYI , "mid not found\n" );
4519
4556
else {
0 commit comments