ksmbd: limits exceeding the maximum allowable outstanding requests
If the client ignores the CreditResponse received from the server and continues to send the request, ksmbd limits the requests if it exceeds smb2 max credits. Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
914d7e5709
commit
b589f5db6d
|
@ -62,6 +62,7 @@ struct ksmbd_conn *ksmbd_conn_alloc(void)
|
|||
atomic_set(&conn->req_running, 0);
|
||||
atomic_set(&conn->r_count, 0);
|
||||
conn->total_credits = 1;
|
||||
conn->outstanding_credits = 1;
|
||||
|
||||
init_waitqueue_head(&conn->req_running_q);
|
||||
INIT_LIST_HEAD(&conn->conns_list);
|
||||
|
|
|
@ -61,7 +61,8 @@ struct ksmbd_conn {
|
|||
atomic_t req_running;
|
||||
/* References which are made for this Server object*/
|
||||
atomic_t r_count;
|
||||
unsigned short total_credits;
|
||||
unsigned int total_credits;
|
||||
unsigned int outstanding_credits;
|
||||
spinlock_t credits_lock;
|
||||
wait_queue_head_t req_running_q;
|
||||
/* Lock to protect requests list*/
|
||||
|
|
|
@ -337,7 +337,16 @@ static int smb2_validate_credit_charge(struct ksmbd_conn *conn,
|
|||
credit_charge, conn->total_credits);
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
if ((u64)conn->outstanding_credits + credit_charge > conn->vals->max_credits) {
|
||||
ksmbd_debug(SMB, "Limits exceeding the maximum allowable outstanding requests, given : %u, pending : %u\n",
|
||||
credit_charge, conn->outstanding_credits);
|
||||
ret = 1;
|
||||
} else
|
||||
conn->outstanding_credits += credit_charge;
|
||||
|
||||
spin_unlock(&conn->credits_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -322,6 +322,7 @@ int smb2_set_rsp_credits(struct ksmbd_work *work)
|
|||
}
|
||||
|
||||
conn->total_credits -= credit_charge;
|
||||
conn->outstanding_credits -= credit_charge;
|
||||
credits_requested = max_t(unsigned short,
|
||||
le16_to_cpu(req_hdr->CreditRequest), 1);
|
||||
|
||||
|
|
Loading…
Reference in New Issue