Lines Matching full:conn
28 * @conn: connection instance to be cleand up
30 * During the thread termination, the corresponding conn instance
31 * resources(sock/memory) are released and finally the conn object is freed.
33 void ksmbd_conn_free(struct ksmbd_conn *conn) in ksmbd_conn_free() argument
36 list_del(&conn->conns_list); in ksmbd_conn_free()
39 xa_destroy(&conn->sessions); in ksmbd_conn_free()
40 kvfree(conn->request_buf); in ksmbd_conn_free()
41 kfree(conn->preauth_info); in ksmbd_conn_free()
42 kfree(conn); in ksmbd_conn_free()
52 struct ksmbd_conn *conn; in ksmbd_conn_alloc() local
54 conn = kzalloc(sizeof(struct ksmbd_conn), GFP_KERNEL); in ksmbd_conn_alloc()
55 if (!conn) in ksmbd_conn_alloc()
58 conn->need_neg = true; in ksmbd_conn_alloc()
59 ksmbd_conn_set_new(conn); in ksmbd_conn_alloc()
60 conn->local_nls = load_nls("utf8"); in ksmbd_conn_alloc()
61 if (!conn->local_nls) in ksmbd_conn_alloc()
62 conn->local_nls = load_nls_default(); in ksmbd_conn_alloc()
64 conn->um = utf8_load(UNICODE_AGE(12, 1, 0)); in ksmbd_conn_alloc()
66 conn->um = ERR_PTR(-EOPNOTSUPP); in ksmbd_conn_alloc()
67 if (IS_ERR(conn->um)) in ksmbd_conn_alloc()
68 conn->um = NULL; in ksmbd_conn_alloc()
69 atomic_set(&conn->req_running, 0); in ksmbd_conn_alloc()
70 atomic_set(&conn->r_count, 0); in ksmbd_conn_alloc()
71 conn->total_credits = 1; in ksmbd_conn_alloc()
72 conn->outstanding_credits = 0; in ksmbd_conn_alloc()
74 init_waitqueue_head(&conn->req_running_q); in ksmbd_conn_alloc()
75 init_waitqueue_head(&conn->r_count_q); in ksmbd_conn_alloc()
76 INIT_LIST_HEAD(&conn->conns_list); in ksmbd_conn_alloc()
77 INIT_LIST_HEAD(&conn->requests); in ksmbd_conn_alloc()
78 INIT_LIST_HEAD(&conn->async_requests); in ksmbd_conn_alloc()
79 spin_lock_init(&conn->request_lock); in ksmbd_conn_alloc()
80 spin_lock_init(&conn->credits_lock); in ksmbd_conn_alloc()
81 ida_init(&conn->async_ida); in ksmbd_conn_alloc()
82 xa_init(&conn->sessions); in ksmbd_conn_alloc()
84 spin_lock_init(&conn->llist_lock); in ksmbd_conn_alloc()
85 INIT_LIST_HEAD(&conn->lock_list); in ksmbd_conn_alloc()
87 init_rwsem(&conn->session_lock); in ksmbd_conn_alloc()
90 list_add(&conn->conns_list, &conn_list); in ksmbd_conn_alloc()
92 return conn; in ksmbd_conn_alloc()
114 struct ksmbd_conn *conn = work->conn; in ksmbd_conn_enqueue_request() local
117 if (conn->ops->get_cmd_val(work) != SMB2_CANCEL_HE) in ksmbd_conn_enqueue_request()
118 requests_queue = &conn->requests; in ksmbd_conn_enqueue_request()
121 atomic_inc(&conn->req_running); in ksmbd_conn_enqueue_request()
122 spin_lock(&conn->request_lock); in ksmbd_conn_enqueue_request()
124 spin_unlock(&conn->request_lock); in ksmbd_conn_enqueue_request()
130 struct ksmbd_conn *conn = work->conn; in ksmbd_conn_try_dequeue_request() local
136 atomic_dec(&conn->req_running); in ksmbd_conn_try_dequeue_request()
137 spin_lock(&conn->request_lock); in ksmbd_conn_try_dequeue_request()
139 spin_unlock(&conn->request_lock); in ksmbd_conn_try_dequeue_request()
143 wake_up_all(&conn->req_running_q); in ksmbd_conn_try_dequeue_request()
146 void ksmbd_conn_lock(struct ksmbd_conn *conn) in ksmbd_conn_lock() argument
148 mutex_lock(&conn->srv_mutex); in ksmbd_conn_lock()
151 void ksmbd_conn_unlock(struct ksmbd_conn *conn) in ksmbd_conn_unlock() argument
153 mutex_unlock(&conn->srv_mutex); in ksmbd_conn_unlock()
158 struct ksmbd_conn *conn; in ksmbd_all_conn_set_status() local
161 list_for_each_entry(conn, &conn_list, conns_list) { in ksmbd_all_conn_set_status()
162 if (conn->binding || xa_load(&conn->sessions, sess_id)) in ksmbd_all_conn_set_status()
163 WRITE_ONCE(conn->status, status); in ksmbd_all_conn_set_status()
168 void ksmbd_conn_wait_idle(struct ksmbd_conn *conn, u64 sess_id) in ksmbd_conn_wait_idle() argument
170 wait_event(conn->req_running_q, atomic_read(&conn->req_running) < 2); in ksmbd_conn_wait_idle()
175 struct ksmbd_conn *conn = work->conn; in ksmbd_conn_write() local
189 ksmbd_conn_lock(conn); in ksmbd_conn_write()
190 sent = conn->transport->ops->writev(conn->transport, work->iov, in ksmbd_conn_write()
195 ksmbd_conn_unlock(conn); in ksmbd_conn_write()
205 int ksmbd_conn_rdma_read(struct ksmbd_conn *conn, in ksmbd_conn_rdma_read() argument
212 if (conn->transport->ops->rdma_read) in ksmbd_conn_rdma_read()
213 ret = conn->transport->ops->rdma_read(conn->transport, in ksmbd_conn_rdma_read()
219 int ksmbd_conn_rdma_write(struct ksmbd_conn *conn, in ksmbd_conn_rdma_write() argument
226 if (conn->transport->ops->rdma_write) in ksmbd_conn_rdma_write()
227 ret = conn->transport->ops->rdma_write(conn->transport, in ksmbd_conn_rdma_write()
233 bool ksmbd_conn_alive(struct ksmbd_conn *conn) in ksmbd_conn_alive() argument
238 if (ksmbd_conn_exiting(conn)) in ksmbd_conn_alive()
244 if (atomic_read(&conn->stats.open_files_count) > 0) in ksmbd_conn_alive()
253 time_after(jiffies, conn->last_active + server_conf.deadtime)) { in ksmbd_conn_alive()
254 ksmbd_debug(CONN, "No response from client in %lu minutes\n", in ksmbd_conn_alive()
274 struct ksmbd_conn *conn = (struct ksmbd_conn *)p; in ksmbd_conn_handler_loop() local
275 struct ksmbd_transport *t = conn->transport; in ksmbd_conn_handler_loop()
280 mutex_init(&conn->srv_mutex); in ksmbd_conn_handler_loop()
286 conn->last_active = jiffies; in ksmbd_conn_handler_loop()
288 while (ksmbd_conn_alive(conn)) { in ksmbd_conn_handler_loop()
292 kvfree(conn->request_buf); in ksmbd_conn_handler_loop()
293 conn->request_buf = NULL; in ksmbd_conn_handler_loop()
300 ksmbd_debug(CONN, "RFC1002 header %u bytes\n", pdu_size); in ksmbd_conn_handler_loop()
302 if (ksmbd_conn_good(conn)) in ksmbd_conn_handler_loop()
304 SMB3_MAX_MSGSIZE + conn->vals->max_write_size; in ksmbd_conn_handler_loop()
311 READ_ONCE(conn->status)); in ksmbd_conn_handler_loop()
327 conn->request_buf = kvmalloc(size, GFP_KERNEL); in ksmbd_conn_handler_loop()
328 if (!conn->request_buf) in ksmbd_conn_handler_loop()
331 memcpy(conn->request_buf, hdr_buf, sizeof(hdr_buf)); in ksmbd_conn_handler_loop()
337 size = t->ops->read(t, conn->request_buf + 4, pdu_size, 2); in ksmbd_conn_handler_loop()
349 if (!ksmbd_smb_request(conn)) in ksmbd_conn_handler_loop()
352 if (((struct smb2_hdr *)smb2_get_msg(conn->request_buf))->ProtocolId == in ksmbd_conn_handler_loop()
363 if (default_conn_ops.process_fn(conn)) { in ksmbd_conn_handler_loop()
370 ksmbd_conn_set_releasing(conn); in ksmbd_conn_handler_loop()
372 wait_event(conn->r_count_q, atomic_read(&conn->r_count) == 0); in ksmbd_conn_handler_loop()
375 utf8_unload(conn->um); in ksmbd_conn_handler_loop()
376 unload_nls(conn->local_nls); in ksmbd_conn_handler_loop()
378 default_conn_ops.terminate_fn(conn); in ksmbd_conn_handler_loop()
413 struct ksmbd_conn *conn; in stop_sessions() local
418 list_for_each_entry(conn, &conn_list, conns_list) { in stop_sessions()
419 t = conn->transport; in stop_sessions()
420 ksmbd_conn_set_exiting(conn); in stop_sessions()