@@ -259,7 +259,7 @@ smb2_revert_current_mid(struct TCP_Server_Info *server, const unsigned int val)
259
259
}
260
260
261
261
static struct mid_q_entry *
262
- smb2_find_mid (struct TCP_Server_Info * server , char * buf )
262
+ __smb2_find_mid (struct TCP_Server_Info * server , char * buf , bool dequeue )
263
263
{
264
264
struct mid_q_entry * mid ;
265
265
struct smb2_sync_hdr * shdr = (struct smb2_sync_hdr * )buf ;
@@ -276,6 +276,10 @@ smb2_find_mid(struct TCP_Server_Info *server, char *buf)
276
276
(mid -> mid_state == MID_REQUEST_SUBMITTED ) &&
277
277
(mid -> command == shdr -> Command )) {
278
278
kref_get (& mid -> refcount );
279
+ if (dequeue ) {
280
+ list_del_init (& mid -> qhead );
281
+ mid -> mid_flags |= MID_DELETED ;
282
+ }
279
283
spin_unlock (& GlobalMid_Lock );
280
284
return mid ;
281
285
}
@@ -284,6 +288,18 @@ smb2_find_mid(struct TCP_Server_Info *server, char *buf)
284
288
return NULL ;
285
289
}
286
290
291
+ static struct mid_q_entry *
292
+ smb2_find_mid (struct TCP_Server_Info * server , char * buf )
293
+ {
294
+ return __smb2_find_mid (server , buf , false);
295
+ }
296
+
297
+ static struct mid_q_entry *
298
+ smb2_find_dequeue_mid (struct TCP_Server_Info * server , char * buf )
299
+ {
300
+ return __smb2_find_mid (server , buf , true);
301
+ }
302
+
287
303
static void
288
304
smb2_dump_detail (void * buf , struct TCP_Server_Info * server )
289
305
{
@@ -4067,7 +4083,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
4067
4083
cifs_dbg (FYI , "%s: server returned error %d\n" ,
4068
4084
__func__ , rdata -> result );
4069
4085
/* normal error on read response */
4070
- dequeue_mid (mid , false);
4086
+ if (is_offloaded )
4087
+ mid -> mid_state = MID_RESPONSE_RECEIVED ;
4088
+ else
4089
+ dequeue_mid (mid , false);
4071
4090
return 0 ;
4072
4091
}
4073
4092
@@ -4091,7 +4110,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
4091
4110
cifs_dbg (FYI , "%s: data offset (%u) beyond end of smallbuf\n" ,
4092
4111
__func__ , data_offset );
4093
4112
rdata -> result = - EIO ;
4094
- dequeue_mid (mid , rdata -> result );
4113
+ if (is_offloaded )
4114
+ mid -> mid_state = MID_RESPONSE_MALFORMED ;
4115
+ else
4116
+ dequeue_mid (mid , rdata -> result );
4095
4117
return 0 ;
4096
4118
}
4097
4119
@@ -4107,21 +4129,30 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
4107
4129
cifs_dbg (FYI , "%s: data offset (%u) beyond 1st page of response\n" ,
4108
4130
__func__ , data_offset );
4109
4131
rdata -> result = - EIO ;
4110
- dequeue_mid (mid , rdata -> result );
4132
+ if (is_offloaded )
4133
+ mid -> mid_state = MID_RESPONSE_MALFORMED ;
4134
+ else
4135
+ dequeue_mid (mid , rdata -> result );
4111
4136
return 0 ;
4112
4137
}
4113
4138
4114
4139
if (data_len > page_data_size - pad_len ) {
4115
4140
/* data_len is corrupt -- discard frame */
4116
4141
rdata -> result = - EIO ;
4117
- dequeue_mid (mid , rdata -> result );
4142
+ if (is_offloaded )
4143
+ mid -> mid_state = MID_RESPONSE_MALFORMED ;
4144
+ else
4145
+ dequeue_mid (mid , rdata -> result );
4118
4146
return 0 ;
4119
4147
}
4120
4148
4121
4149
rdata -> result = init_read_bvec (pages , npages , page_data_size ,
4122
4150
cur_off , & bvec );
4123
4151
if (rdata -> result != 0 ) {
4124
- dequeue_mid (mid , rdata -> result );
4152
+ if (is_offloaded )
4153
+ mid -> mid_state = MID_RESPONSE_MALFORMED ;
4154
+ else
4155
+ dequeue_mid (mid , rdata -> result );
4125
4156
return 0 ;
4126
4157
}
4127
4158
@@ -4136,7 +4167,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
4136
4167
/* read response payload cannot be in both buf and pages */
4137
4168
WARN_ONCE (1 , "buf can not contain only a part of read data" );
4138
4169
rdata -> result = - EIO ;
4139
- dequeue_mid (mid , rdata -> result );
4170
+ if (is_offloaded )
4171
+ mid -> mid_state = MID_RESPONSE_MALFORMED ;
4172
+ else
4173
+ dequeue_mid (mid , rdata -> result );
4140
4174
return 0 ;
4141
4175
}
4142
4176
@@ -4147,7 +4181,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
4147
4181
if (length < 0 )
4148
4182
return length ;
4149
4183
4150
- dequeue_mid (mid , false);
4184
+ if (is_offloaded )
4185
+ mid -> mid_state = MID_RESPONSE_RECEIVED ;
4186
+ else
4187
+ dequeue_mid (mid , false);
4151
4188
return length ;
4152
4189
}
4153
4190
@@ -4176,7 +4213,7 @@ static void smb2_decrypt_offload(struct work_struct *work)
4176
4213
}
4177
4214
4178
4215
dw -> server -> lstrp = jiffies ;
4179
- mid = smb2_find_mid (dw -> server , dw -> buf );
4216
+ mid = smb2_find_dequeue_mid (dw -> server , dw -> buf );
4180
4217
if (mid == NULL )
4181
4218
cifs_dbg (FYI , "mid not found\n" );
4182
4219
else {
0 commit comments