aboutsummaryrefslogtreecommitdiff
path: root/fs/ksmbd/connection.c
diff options
context:
space:
mode:
authorGravatar Namjae Jeon <linkinjeon@kernel.org> 2023-03-31 08:42:12 +0900
committerGravatar Steve French <stfrench@microsoft.com> 2023-04-02 23:08:52 -0500
commit3a9b557f44ea8f216aab515a7db20e23f0eb51b9 (patch)
tree5a2587229b6511c14ef5f549fadcd2be083e58bd /fs/ksmbd/connection.c
parentksmbd: remove unused is_char_allowed function (diff)
downloadlinux-3a9b557f44ea8f216aab515a7db20e23f0eb51b9.tar.gz
linux-3a9b557f44ea8f216aab515a7db20e23f0eb51b9.tar.bz2
linux-3a9b557f44ea8f216aab515a7db20e23f0eb51b9.zip
ksmbd: delete asynchronous work from list
When smb2_lock request is canceled by smb2_cancel or smb2_close(), ksmbd is missing deleting async_request_entry async_requests list. Because calling init_smb2_rsp_hdr() in smb2_lock() mark ->synchronous as true and then it will not be deleted in ksmbd_conn_try_dequeue_request(). This patch add release_async_work() to release the ones allocated for async work. Cc: stable@vger.kernel.org Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs/ksmbd/connection.c')
-rw-r--r--fs/ksmbd/connection.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/fs/ksmbd/connection.c b/fs/ksmbd/connection.c
index 3f5dfebaa041..365ac32af505 100644
--- a/fs/ksmbd/connection.c
+++ b/fs/ksmbd/connection.c
@@ -112,10 +112,8 @@ void ksmbd_conn_enqueue_request(struct ksmbd_work *work)
struct ksmbd_conn *conn = work->conn;
struct list_head *requests_queue = NULL;
- if (conn->ops->get_cmd_val(work) != SMB2_CANCEL_HE) {
+ if (conn->ops->get_cmd_val(work) != SMB2_CANCEL_HE)
requests_queue = &conn->requests;
- work->synchronous = true;
- }
if (requests_queue) {
atomic_inc(&conn->req_running);
@@ -136,14 +134,14 @@ int ksmbd_conn_try_dequeue_request(struct ksmbd_work *work)
if (!work->multiRsp)
atomic_dec(&conn->req_running);
- spin_lock(&conn->request_lock);
if (!work->multiRsp) {
+ spin_lock(&conn->request_lock);
list_del_init(&work->request_entry);
- if (!work->synchronous)
- list_del_init(&work->async_request_entry);
+ spin_unlock(&conn->request_lock);
+ if (work->asynchronous)
+ release_async_work(work);
ret = 0;
}
- spin_unlock(&conn->request_lock);
wake_up_all(&conn->req_running_q);
return ret;