]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ksmbd: add smb-direct shutdown
authorNamjae Jeon <linkinjeon@kernel.org>
Mon, 18 Dec 2023 15:32:41 +0000 (00:32 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Dec 2023 09:41:50 +0000 (10:41 +0100)
[ Upstream commit 136dff3a6b71dc16c30b35cc390feb0bfc32ed50 ]

When killing ksmbd server after connecting rdma, ksmbd threads does not
terminate properly because the rdma connection is still alive.
This patch add shutdown operation to disconnect rdma connection while
ksmbd threads terminate.

Signed-off-by: Yufan Chen <wiz.chen@gmail.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/ksmbd/connection.c
fs/ksmbd/connection.h
fs/ksmbd/transport_rdma.c

index ddf447e9b8bfc0d3aa2d1141abbd71994743e52d..6e3416d9c65ee1693da04a7908d5238247b69601 100644 (file)
@@ -399,17 +399,24 @@ out:
 static void stop_sessions(void)
 {
        struct ksmbd_conn *conn;
+       struct ksmbd_transport *t;
 
 again:
        read_lock(&conn_list_lock);
        list_for_each_entry(conn, &conn_list, conns_list) {
                struct task_struct *task;
 
-               task = conn->transport->handler;
+               t = conn->transport;
+               task = t->handler;
                if (task)
                        ksmbd_debug(CONN, "Stop session handler %s/%d\n",
                                    task->comm, task_pid_nr(task));
                conn->status = KSMBD_SESS_EXITING;
+               if (t->ops->shutdown) {
+                       read_unlock(&conn_list_lock);
+                       t->ops->shutdown(t);
+                       read_lock(&conn_list_lock);
+               }
        }
        read_unlock(&conn_list_lock);
 
index 89eb41bbd1601f3042395eb7ace5055a0630ce51..fd243cdddb22798734ab5393f086fc6199464326 100644 (file)
@@ -110,6 +110,7 @@ struct ksmbd_conn_ops {
 struct ksmbd_transport_ops {
        int (*prepare)(struct ksmbd_transport *t);
        void (*disconnect)(struct ksmbd_transport *t);
+       void (*shutdown)(struct ksmbd_transport *t);
        int (*read)(struct ksmbd_transport *t, char *buf,
                    unsigned int size, int max_retries);
        int (*writev)(struct ksmbd_transport *t, struct kvec *iovs, int niov,
index 7e85c2767cd03de17c944914156149ec75c417b7..c723e0552d7766f3fd45b1ce3d833ae2052f77c8 100644 (file)
@@ -1459,6 +1459,15 @@ static void smb_direct_disconnect(struct ksmbd_transport *t)
        free_transport(st);
 }
 
+static void smb_direct_shutdown(struct ksmbd_transport *t)
+{
+       struct smb_direct_transport *st = smb_trans_direct_transfort(t);
+
+       ksmbd_debug(RDMA, "smb-direct shutdown cm_id=%p\n", st->cm_id);
+
+       smb_direct_disconnect_rdma_work(&st->disconnect_work);
+}
+
 static int smb_direct_cm_handler(struct rdma_cm_id *cm_id,
                                 struct rdma_cm_event *event)
 {
@@ -2207,6 +2216,7 @@ out:
 static struct ksmbd_transport_ops ksmbd_smb_direct_transport_ops = {
        .prepare        = smb_direct_prepare,
        .disconnect     = smb_direct_disconnect,
+       .shutdown       = smb_direct_shutdown,
        .writev         = smb_direct_writev,
        .read           = smb_direct_read,
        .rdma_read      = smb_direct_rdma_read,