Commit b589f5db authored by Namjae Jeon's avatar Namjae Jeon Committed by Steve French

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: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 914d7e57
...@@ -62,6 +62,7 @@ struct ksmbd_conn *ksmbd_conn_alloc(void) ...@@ -62,6 +62,7 @@ struct ksmbd_conn *ksmbd_conn_alloc(void)
atomic_set(&conn->req_running, 0); atomic_set(&conn->req_running, 0);
atomic_set(&conn->r_count, 0); atomic_set(&conn->r_count, 0);
conn->total_credits = 1; conn->total_credits = 1;
conn->outstanding_credits = 1;
init_waitqueue_head(&conn->req_running_q); init_waitqueue_head(&conn->req_running_q);
INIT_LIST_HEAD(&conn->conns_list); INIT_LIST_HEAD(&conn->conns_list);
......
...@@ -61,7 +61,8 @@ struct ksmbd_conn { ...@@ -61,7 +61,8 @@ struct ksmbd_conn {
atomic_t req_running; atomic_t req_running;
/* References which are made for this Server object*/ /* References which are made for this Server object*/
atomic_t r_count; atomic_t r_count;
unsigned short total_credits; unsigned int total_credits;
unsigned int outstanding_credits;
spinlock_t credits_lock; spinlock_t credits_lock;
wait_queue_head_t req_running_q; wait_queue_head_t req_running_q;
/* Lock to protect requests list*/ /* Lock to protect requests list*/
......
...@@ -337,7 +337,16 @@ static int smb2_validate_credit_charge(struct ksmbd_conn *conn, ...@@ -337,7 +337,16 @@ static int smb2_validate_credit_charge(struct ksmbd_conn *conn,
credit_charge, conn->total_credits); credit_charge, conn->total_credits);
ret = 1; 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); spin_unlock(&conn->credits_lock);
return ret; return ret;
} }
......
...@@ -322,6 +322,7 @@ int smb2_set_rsp_credits(struct ksmbd_work *work) ...@@ -322,6 +322,7 @@ int smb2_set_rsp_credits(struct ksmbd_work *work)
} }
conn->total_credits -= credit_charge; conn->total_credits -= credit_charge;
conn->outstanding_credits -= credit_charge;
credits_requested = max_t(unsigned short, credits_requested = max_t(unsigned short,
le16_to_cpu(req_hdr->CreditRequest), 1); le16_to_cpu(req_hdr->CreditRequest), 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment