@@ -292,22 +292,6 @@ int init_smb2_neg_rsp(struct ksmbd_work *work)
292
292
return 0 ;
293
293
}
294
294
295
- static int smb2_consume_credit_charge (struct ksmbd_work * work ,
296
- unsigned short credit_charge )
297
- {
298
- struct ksmbd_conn * conn = work -> conn ;
299
- unsigned int rsp_credits = 1 ;
300
-
301
- if (!conn -> total_credits )
302
- return 0 ;
303
-
304
- if (credit_charge > 0 )
305
- rsp_credits = credit_charge ;
306
-
307
- conn -> total_credits -= rsp_credits ;
308
- return rsp_credits ;
309
- }
310
-
311
295
/**
312
296
* smb2_set_rsp_credits() - set number of credits in response buffer
313
297
* @work: smb work containing smb response buffer
@@ -317,49 +301,43 @@ int smb2_set_rsp_credits(struct ksmbd_work *work)
317
301
struct smb2_hdr * req_hdr = ksmbd_req_buf_next (work );
318
302
struct smb2_hdr * hdr = ksmbd_resp_buf_next (work );
319
303
struct ksmbd_conn * conn = work -> conn ;
320
- unsigned short credits_requested = le16_to_cpu (req_hdr -> CreditRequest );
321
- unsigned short credit_charge = 1 , credits_granted = 0 ;
322
- unsigned short aux_max , aux_credits , min_credits ;
323
- int rsp_credit_charge ;
304
+ unsigned short credits_requested ;
305
+ unsigned short credit_charge , credits_granted = 0 ;
306
+ unsigned short aux_max , aux_credits ;
324
307
325
- if (hdr -> Command == SMB2_CANCEL )
326
- goto out ;
308
+ if (work -> send_no_response )
309
+ return 0 ;
327
310
328
- /* get default minimum credits by shifting maximum credits by 4 */
329
- min_credits = conn -> max_credits >> 4 ;
311
+ hdr -> CreditCharge = req_hdr -> CreditCharge ;
330
312
331
- if (conn -> total_credits >= conn -> max_credits ) {
313
+ if (conn -> total_credits > conn -> max_credits ) {
314
+ hdr -> CreditRequest = 0 ;
332
315
pr_err ("Total credits overflow: %d\n" , conn -> total_credits );
333
- conn -> total_credits = min_credits ;
334
- }
335
-
336
- rsp_credit_charge =
337
- smb2_consume_credit_charge (work , le16_to_cpu (req_hdr -> CreditCharge ));
338
- if (rsp_credit_charge < 0 )
339
316
return - EINVAL ;
317
+ }
340
318
341
- hdr -> CreditCharge = cpu_to_le16 (rsp_credit_charge );
319
+ credit_charge = max_t (unsigned short ,
320
+ le16_to_cpu (req_hdr -> CreditCharge ), 1 );
321
+ credits_requested = max_t (unsigned short ,
322
+ le16_to_cpu (req_hdr -> CreditRequest ), 1 );
342
323
343
- if (credits_requested > 0 ) {
344
- aux_credits = credits_requested - 1 ;
345
- aux_max = 32 ;
346
- if (hdr -> Command == SMB2_NEGOTIATE )
347
- aux_max = 0 ;
348
- aux_credits = (aux_credits < aux_max ) ? aux_credits : aux_max ;
349
- credits_granted = aux_credits + credit_charge ;
324
+ /* according to smb2.credits smbtorture, Windows server
325
+ * 2016 or later grant up to 8192 credits at once.
326
+ *
327
+ * TODO: Need to adjuct CreditRequest value according to
328
+ * current cpu load
329
+ */
330
+ aux_credits = credits_requested - 1 ;
331
+ if (hdr -> Command == SMB2_NEGOTIATE )
332
+ aux_max = 0 ;
333
+ else
334
+ aux_max = conn -> max_credits - credit_charge ;
335
+ aux_credits = min_t (unsigned short , aux_credits , aux_max );
336
+ credits_granted = credit_charge + aux_credits ;
350
337
351
- /* if credits granted per client is getting bigger than default
352
- * minimum credits then we should wrap it up within the limits.
353
- */
354
- if ((conn -> total_credits + credits_granted ) > min_credits )
355
- credits_granted = min_credits - conn -> total_credits ;
356
- /*
357
- * TODO: Need to adjuct CreditRequest value according to
358
- * current cpu load
359
- */
360
- } else if (conn -> total_credits == 0 ) {
361
- credits_granted = 1 ;
362
- }
338
+ if (conn -> max_credits - conn -> total_credits < credits_granted )
339
+ credits_granted = conn -> max_credits -
340
+ conn -> total_credits ;
363
341
364
342
conn -> total_credits += credits_granted ;
365
343
work -> credits_granted += credits_granted ;
@@ -368,7 +346,6 @@ int smb2_set_rsp_credits(struct ksmbd_work *work)
368
346
/* Update CreditRequest in last request */
369
347
hdr -> CreditRequest = cpu_to_le16 (work -> credits_granted );
370
348
}
371
- out :
372
349
ksmbd_debug (SMB ,
373
350
"credits: requested[%d] granted[%d] total_granted[%d]\n" ,
374
351
credits_requested , credits_granted ,
0 commit comments