Commit 8e06b31e authored by Namjae Jeon's avatar Namjae Jeon Committed by Steve French

ksmbd: add channel rwlock

Add missing rwlock for channel list in session.
Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
Reviewed-by: default avatarHyunchul Lee <hyc.lee@gmail.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent e4d3e6b5
...@@ -32,11 +32,13 @@ static void free_channel_list(struct ksmbd_session *sess) ...@@ -32,11 +32,13 @@ static void free_channel_list(struct ksmbd_session *sess)
{ {
struct channel *chann, *tmp; struct channel *chann, *tmp;
write_lock(&sess->chann_lock);
list_for_each_entry_safe(chann, tmp, &sess->ksmbd_chann_list, list_for_each_entry_safe(chann, tmp, &sess->ksmbd_chann_list,
chann_list) { chann_list) {
list_del(&chann->chann_list); list_del(&chann->chann_list);
kfree(chann); kfree(chann);
} }
write_unlock(&sess->chann_lock);
} }
static void __session_rpc_close(struct ksmbd_session *sess, static void __session_rpc_close(struct ksmbd_session *sess,
...@@ -303,6 +305,7 @@ static struct ksmbd_session *__session_create(int protocol) ...@@ -303,6 +305,7 @@ static struct ksmbd_session *__session_create(int protocol)
INIT_LIST_HEAD(&sess->rpc_handle_list); INIT_LIST_HEAD(&sess->rpc_handle_list);
sess->sequence_number = 1; sess->sequence_number = 1;
atomic_set(&sess->refcnt, 1); atomic_set(&sess->refcnt, 1);
rwlock_init(&sess->chann_lock);
switch (protocol) { switch (protocol) {
case CIFDS_SESSION_FLAG_SMB2: case CIFDS_SESSION_FLAG_SMB2:
......
...@@ -48,6 +48,7 @@ struct ksmbd_session { ...@@ -48,6 +48,7 @@ struct ksmbd_session {
char sess_key[CIFS_KEY_SIZE]; char sess_key[CIFS_KEY_SIZE];
struct hlist_node hlist; struct hlist_node hlist;
rwlock_t chann_lock;
struct list_head ksmbd_chann_list; struct list_head ksmbd_chann_list;
struct xarray tree_conns; struct xarray tree_conns;
struct ida tree_conn_ida; struct ida tree_conn_ida;
......
...@@ -1512,7 +1512,9 @@ static int ntlm_authenticate(struct ksmbd_work *work) ...@@ -1512,7 +1512,9 @@ static int ntlm_authenticate(struct ksmbd_work *work)
binding_session: binding_session:
if (conn->dialect >= SMB30_PROT_ID) { if (conn->dialect >= SMB30_PROT_ID) {
read_lock(&sess->chann_lock);
chann = lookup_chann_list(sess, conn); chann = lookup_chann_list(sess, conn);
read_unlock(&sess->chann_lock);
if (!chann) { if (!chann) {
chann = kmalloc(sizeof(struct channel), GFP_KERNEL); chann = kmalloc(sizeof(struct channel), GFP_KERNEL);
if (!chann) if (!chann)
...@@ -1520,7 +1522,9 @@ static int ntlm_authenticate(struct ksmbd_work *work) ...@@ -1520,7 +1522,9 @@ static int ntlm_authenticate(struct ksmbd_work *work)
chann->conn = conn; chann->conn = conn;
INIT_LIST_HEAD(&chann->chann_list); INIT_LIST_HEAD(&chann->chann_list);
write_lock(&sess->chann_lock);
list_add(&chann->chann_list, &sess->ksmbd_chann_list); list_add(&chann->chann_list, &sess->ksmbd_chann_list);
write_unlock(&sess->chann_lock);
} }
} }
...@@ -1594,7 +1598,9 @@ static int krb5_authenticate(struct ksmbd_work *work) ...@@ -1594,7 +1598,9 @@ static int krb5_authenticate(struct ksmbd_work *work)
} }
if (conn->dialect >= SMB30_PROT_ID) { if (conn->dialect >= SMB30_PROT_ID) {
read_lock(&sess->chann_lock);
chann = lookup_chann_list(sess, conn); chann = lookup_chann_list(sess, conn);
read_unlock(&sess->chann_lock);
if (!chann) { if (!chann) {
chann = kmalloc(sizeof(struct channel), GFP_KERNEL); chann = kmalloc(sizeof(struct channel), GFP_KERNEL);
if (!chann) if (!chann)
...@@ -1602,7 +1608,9 @@ static int krb5_authenticate(struct ksmbd_work *work) ...@@ -1602,7 +1608,9 @@ static int krb5_authenticate(struct ksmbd_work *work)
chann->conn = conn; chann->conn = conn;
INIT_LIST_HEAD(&chann->chann_list); INIT_LIST_HEAD(&chann->chann_list);
write_lock(&sess->chann_lock);
list_add(&chann->chann_list, &sess->ksmbd_chann_list); list_add(&chann->chann_list, &sess->ksmbd_chann_list);
write_unlock(&sess->chann_lock);
} }
} }
...@@ -8361,10 +8369,14 @@ int smb3_check_sign_req(struct ksmbd_work *work) ...@@ -8361,10 +8369,14 @@ int smb3_check_sign_req(struct ksmbd_work *work)
if (le16_to_cpu(hdr->Command) == SMB2_SESSION_SETUP_HE) { if (le16_to_cpu(hdr->Command) == SMB2_SESSION_SETUP_HE) {
signing_key = work->sess->smb3signingkey; signing_key = work->sess->smb3signingkey;
} else { } else {
read_lock(&work->sess->chann_lock);
chann = lookup_chann_list(work->sess, conn); chann = lookup_chann_list(work->sess, conn);
if (!chann) if (!chann) {
read_unlock(&work->sess->chann_lock);
return 0; return 0;
}
signing_key = chann->smb3signingkey; signing_key = chann->smb3signingkey;
read_unlock(&work->sess->chann_lock);
} }
if (!signing_key) { if (!signing_key) {
...@@ -8424,10 +8436,14 @@ void smb3_set_sign_rsp(struct ksmbd_work *work) ...@@ -8424,10 +8436,14 @@ void smb3_set_sign_rsp(struct ksmbd_work *work)
le16_to_cpu(hdr->Command) == SMB2_SESSION_SETUP_HE) { le16_to_cpu(hdr->Command) == SMB2_SESSION_SETUP_HE) {
signing_key = work->sess->smb3signingkey; signing_key = work->sess->smb3signingkey;
} else { } else {
read_lock(&work->sess->chann_lock);
chann = lookup_chann_list(work->sess, work->conn); chann = lookup_chann_list(work->sess, work->conn);
if (!chann) if (!chann) {
read_unlock(&work->sess->chann_lock);
return; return;
}
signing_key = chann->smb3signingkey; signing_key = chann->smb3signingkey;
read_unlock(&work->sess->chann_lock);
} }
if (!signing_key) if (!signing_key)
......
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