Message ID | 20220722030346.28534-2-linkinjeon@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/5] ksmbd: replace sessions list in connection with xarray | expand |
2022년 7월 22일 (금) 오후 12:04, Namjae Jeon <linkinjeon@kernel.org>님이 작성: > > Add missing rwlock for channel list in session. > > Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Looks good to me. Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com> > --- > fs/ksmbd/mgmt/user_session.c | 3 +++ > fs/ksmbd/mgmt/user_session.h | 1 + > fs/ksmbd/smb2pdu.c | 20 ++++++++++++++++++-- > 3 files changed, 22 insertions(+), 2 deletions(-) > > diff --git a/fs/ksmbd/mgmt/user_session.c b/fs/ksmbd/mgmt/user_session.c > index 3a44e66456fc..25e9ba3b7550 100644 > --- a/fs/ksmbd/mgmt/user_session.c > +++ b/fs/ksmbd/mgmt/user_session.c > @@ -32,11 +32,13 @@ static void free_channel_list(struct ksmbd_session *sess) > { > struct channel *chann, *tmp; > > + write_lock(&sess->chann_lock); > list_for_each_entry_safe(chann, tmp, &sess->ksmbd_chann_list, > chann_list) { > list_del(&chann->chann_list); > kfree(chann); > } > + write_unlock(&sess->chann_lock); > } > > static void __session_rpc_close(struct ksmbd_session *sess, > @@ -303,6 +305,7 @@ static struct ksmbd_session *__session_create(int protocol) > INIT_LIST_HEAD(&sess->rpc_handle_list); > sess->sequence_number = 1; > atomic_set(&sess->refcnt, 1); > + rwlock_init(&sess->chann_lock); > > switch (protocol) { > case CIFDS_SESSION_FLAG_SMB2: > diff --git a/fs/ksmbd/mgmt/user_session.h b/fs/ksmbd/mgmt/user_session.h > index 8b08189be3fc..1ec659f0151b 100644 > --- a/fs/ksmbd/mgmt/user_session.h > +++ b/fs/ksmbd/mgmt/user_session.h > @@ -48,6 +48,7 @@ struct ksmbd_session { > char sess_key[CIFS_KEY_SIZE]; > > struct hlist_node hlist; > + rwlock_t chann_lock; > struct list_head ksmbd_chann_list; > struct xarray tree_conns; > struct ida tree_conn_ida; > diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c > index 04d20a2e6dee..5a0328a070dc 100644 > --- a/fs/ksmbd/smb2pdu.c > +++ b/fs/ksmbd/smb2pdu.c > @@ -1512,7 +1512,9 @@ static int ntlm_authenticate(struct ksmbd_work *work) > > binding_session: > if (conn->dialect >= SMB30_PROT_ID) { > + read_lock(&sess->chann_lock); > chann = lookup_chann_list(sess, conn); > + read_unlock(&sess->chann_lock); > if (!chann) { > chann = kmalloc(sizeof(struct channel), GFP_KERNEL); > if (!chann) > @@ -1520,7 +1522,9 @@ static int ntlm_authenticate(struct ksmbd_work *work) > > chann->conn = conn; > INIT_LIST_HEAD(&chann->chann_list); > + write_lock(&sess->chann_lock); > 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) > } > > if (conn->dialect >= SMB30_PROT_ID) { > + read_lock(&sess->chann_lock); > chann = lookup_chann_list(sess, conn); > + read_unlock(&sess->chann_lock); > if (!chann) { > chann = kmalloc(sizeof(struct channel), GFP_KERNEL); > if (!chann) > @@ -1602,7 +1608,9 @@ static int krb5_authenticate(struct ksmbd_work *work) > > chann->conn = conn; > INIT_LIST_HEAD(&chann->chann_list); > + write_lock(&sess->chann_lock); > list_add(&chann->chann_list, &sess->ksmbd_chann_list); > + write_unlock(&sess->chann_lock); > } > } > > @@ -8351,10 +8359,14 @@ int smb3_check_sign_req(struct ksmbd_work *work) > if (le16_to_cpu(hdr->Command) == SMB2_SESSION_SETUP_HE) { > signing_key = work->sess->smb3signingkey; > } else { > + read_lock(&work->sess->chann_lock); > chann = lookup_chann_list(work->sess, conn); > - if (!chann) > + if (!chann) { > + read_unlock(&work->sess->chann_lock); > return 0; > + } > signing_key = chann->smb3signingkey; > + read_unlock(&work->sess->chann_lock); > } > > if (!signing_key) { > @@ -8414,10 +8426,14 @@ void smb3_set_sign_rsp(struct ksmbd_work *work) > le16_to_cpu(hdr->Command) == SMB2_SESSION_SETUP_HE) { > signing_key = work->sess->smb3signingkey; > } else { > + read_lock(&work->sess->chann_lock); > chann = lookup_chann_list(work->sess, work->conn); > - if (!chann) > + if (!chann) { > + read_unlock(&work->sess->chann_lock); > return; > + } > signing_key = chann->smb3signingkey; > + read_unlock(&work->sess->chann_lock); > } > > if (!signing_key) > -- > 2.25.1 >
diff --git a/fs/ksmbd/mgmt/user_session.c b/fs/ksmbd/mgmt/user_session.c index 3a44e66456fc..25e9ba3b7550 100644 --- a/fs/ksmbd/mgmt/user_session.c +++ b/fs/ksmbd/mgmt/user_session.c @@ -32,11 +32,13 @@ static void free_channel_list(struct ksmbd_session *sess) { struct channel *chann, *tmp; + write_lock(&sess->chann_lock); list_for_each_entry_safe(chann, tmp, &sess->ksmbd_chann_list, chann_list) { list_del(&chann->chann_list); kfree(chann); } + write_unlock(&sess->chann_lock); } static void __session_rpc_close(struct ksmbd_session *sess, @@ -303,6 +305,7 @@ static struct ksmbd_session *__session_create(int protocol) INIT_LIST_HEAD(&sess->rpc_handle_list); sess->sequence_number = 1; atomic_set(&sess->refcnt, 1); + rwlock_init(&sess->chann_lock); switch (protocol) { case CIFDS_SESSION_FLAG_SMB2: diff --git a/fs/ksmbd/mgmt/user_session.h b/fs/ksmbd/mgmt/user_session.h index 8b08189be3fc..1ec659f0151b 100644 --- a/fs/ksmbd/mgmt/user_session.h +++ b/fs/ksmbd/mgmt/user_session.h @@ -48,6 +48,7 @@ struct ksmbd_session { char sess_key[CIFS_KEY_SIZE]; struct hlist_node hlist; + rwlock_t chann_lock; struct list_head ksmbd_chann_list; struct xarray tree_conns; struct ida tree_conn_ida; diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c index 04d20a2e6dee..5a0328a070dc 100644 --- a/fs/ksmbd/smb2pdu.c +++ b/fs/ksmbd/smb2pdu.c @@ -1512,7 +1512,9 @@ static int ntlm_authenticate(struct ksmbd_work *work) binding_session: if (conn->dialect >= SMB30_PROT_ID) { + read_lock(&sess->chann_lock); chann = lookup_chann_list(sess, conn); + read_unlock(&sess->chann_lock); if (!chann) { chann = kmalloc(sizeof(struct channel), GFP_KERNEL); if (!chann) @@ -1520,7 +1522,9 @@ static int ntlm_authenticate(struct ksmbd_work *work) chann->conn = conn; INIT_LIST_HEAD(&chann->chann_list); + write_lock(&sess->chann_lock); 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) } if (conn->dialect >= SMB30_PROT_ID) { + read_lock(&sess->chann_lock); chann = lookup_chann_list(sess, conn); + read_unlock(&sess->chann_lock); if (!chann) { chann = kmalloc(sizeof(struct channel), GFP_KERNEL); if (!chann) @@ -1602,7 +1608,9 @@ static int krb5_authenticate(struct ksmbd_work *work) chann->conn = conn; INIT_LIST_HEAD(&chann->chann_list); + write_lock(&sess->chann_lock); list_add(&chann->chann_list, &sess->ksmbd_chann_list); + write_unlock(&sess->chann_lock); } } @@ -8351,10 +8359,14 @@ int smb3_check_sign_req(struct ksmbd_work *work) if (le16_to_cpu(hdr->Command) == SMB2_SESSION_SETUP_HE) { signing_key = work->sess->smb3signingkey; } else { + read_lock(&work->sess->chann_lock); chann = lookup_chann_list(work->sess, conn); - if (!chann) + if (!chann) { + read_unlock(&work->sess->chann_lock); return 0; + } signing_key = chann->smb3signingkey; + read_unlock(&work->sess->chann_lock); } if (!signing_key) { @@ -8414,10 +8426,14 @@ void smb3_set_sign_rsp(struct ksmbd_work *work) le16_to_cpu(hdr->Command) == SMB2_SESSION_SETUP_HE) { signing_key = work->sess->smb3signingkey; } else { + read_lock(&work->sess->chann_lock); chann = lookup_chann_list(work->sess, work->conn); - if (!chann) + if (!chann) { + read_unlock(&work->sess->chann_lock); return; + } signing_key = chann->smb3signingkey; + read_unlock(&work->sess->chann_lock); } if (!signing_key)
Add missing rwlock for channel list in session. Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> --- fs/ksmbd/mgmt/user_session.c | 3 +++ fs/ksmbd/mgmt/user_session.h | 1 + fs/ksmbd/smb2pdu.c | 20 ++++++++++++++++++-- 3 files changed, 22 insertions(+), 2 deletions(-)