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 if (atomic_dec_and_test(&conn->refcnt)) in ksmbd_conn_free()
43 kfree(conn); in ksmbd_conn_free()
53 struct ksmbd_conn *conn; in ksmbd_conn_alloc() local
55 conn = kzalloc(sizeof(struct ksmbd_conn), GFP_KERNEL); in ksmbd_conn_alloc()
56 if (!conn) in ksmbd_conn_alloc()
59 conn->need_neg = true; in ksmbd_conn_alloc()
60 ksmbd_conn_set_new(conn); in ksmbd_conn_alloc()
61 conn->local_nls = load_nls("utf8"); in ksmbd_conn_alloc()
62 if (!conn->local_nls) in ksmbd_conn_alloc()
63 conn->local_nls = load_nls_default(); in ksmbd_conn_alloc()
65 conn->um = utf8_load(UNICODE_AGE(12, 1, 0)); in ksmbd_conn_alloc()
67 conn->um = ERR_PTR(-EOPNOTSUPP); in ksmbd_conn_alloc()
68 if (IS_ERR(conn->um)) in ksmbd_conn_alloc()
69 conn->um = NULL; in ksmbd_conn_alloc()
70 atomic_set(&conn->req_running, 0); in ksmbd_conn_alloc()
71 atomic_set(&conn->r_count, 0); in ksmbd_conn_alloc()
72 atomic_set(&conn->refcnt, 1); in ksmbd_conn_alloc()
73 conn->total_credits = 1; in ksmbd_conn_alloc()
74 conn->outstanding_credits = 0; in ksmbd_conn_alloc()
76 init_waitqueue_head(&conn->req_running_q); in ksmbd_conn_alloc()
77 init_waitqueue_head(&conn->r_count_q); in ksmbd_conn_alloc()
78 INIT_LIST_HEAD(&conn->conns_list); in ksmbd_conn_alloc()
79 INIT_LIST_HEAD(&conn->requests); in ksmbd_conn_alloc()
80 INIT_LIST_HEAD(&conn->async_requests); in ksmbd_conn_alloc()
81 spin_lock_init(&conn->request_lock); in ksmbd_conn_alloc()
82 spin_lock_init(&conn->credits_lock); in ksmbd_conn_alloc()
83 ida_init(&conn->async_ida); in ksmbd_conn_alloc()
84 xa_init(&conn->sessions); in ksmbd_conn_alloc()
86 spin_lock_init(&conn->llist_lock); in ksmbd_conn_alloc()
87 INIT_LIST_HEAD(&conn->lock_list); in ksmbd_conn_alloc()
89 init_rwsem(&conn->session_lock); in ksmbd_conn_alloc()
92 list_add(&conn->conns_list, &conn_list); in ksmbd_conn_alloc()
94 return conn; in ksmbd_conn_alloc()
116 struct ksmbd_conn *conn = work->conn; in ksmbd_conn_enqueue_request() local
119 if (conn->ops->get_cmd_val(work) != SMB2_CANCEL_HE) in ksmbd_conn_enqueue_request()
120 requests_queue = &conn->requests; in ksmbd_conn_enqueue_request()
122 atomic_inc(&conn->req_running); in ksmbd_conn_enqueue_request()
124 spin_lock(&conn->request_lock); in ksmbd_conn_enqueue_request()
126 spin_unlock(&conn->request_lock); in ksmbd_conn_enqueue_request()
132 struct ksmbd_conn *conn = work->conn; in ksmbd_conn_try_dequeue_request() local
134 atomic_dec(&conn->req_running); in ksmbd_conn_try_dequeue_request()
135 if (waitqueue_active(&conn->req_running_q)) in ksmbd_conn_try_dequeue_request()
136 wake_up(&conn->req_running_q); in ksmbd_conn_try_dequeue_request()
142 spin_lock(&conn->request_lock); in ksmbd_conn_try_dequeue_request()
144 spin_unlock(&conn->request_lock); in ksmbd_conn_try_dequeue_request()
148 wake_up_all(&conn->req_running_q); in ksmbd_conn_try_dequeue_request()
151 void ksmbd_conn_lock(struct ksmbd_conn *conn) in ksmbd_conn_lock() argument
153 mutex_lock(&conn->srv_mutex); in ksmbd_conn_lock()
156 void ksmbd_conn_unlock(struct ksmbd_conn *conn) in ksmbd_conn_unlock() argument
158 mutex_unlock(&conn->srv_mutex); in ksmbd_conn_unlock()
163 struct ksmbd_conn *conn; in ksmbd_all_conn_set_status() local
166 list_for_each_entry(conn, &conn_list, conns_list) { in ksmbd_all_conn_set_status()
167 if (conn->binding || xa_load(&conn->sessions, sess_id)) in ksmbd_all_conn_set_status()
168 WRITE_ONCE(conn->status, status); in ksmbd_all_conn_set_status()
173 void ksmbd_conn_wait_idle(struct ksmbd_conn *conn) in ksmbd_conn_wait_idle() argument
175 wait_event(conn->req_running_q, atomic_read(&conn->req_running) < 2); in ksmbd_conn_wait_idle()
180 struct ksmbd_conn *conn; in ksmbd_conn_wait_idle_sess_id() local
189 list_for_each_entry(conn, &conn_list, conns_list) { in ksmbd_conn_wait_idle_sess_id()
190 if (conn->binding || xa_load(&conn->sessions, sess_id)) { in ksmbd_conn_wait_idle_sess_id()
191 if (conn == curr_conn) in ksmbd_conn_wait_idle_sess_id()
193 if (atomic_read(&conn->req_running) >= rcount) { in ksmbd_conn_wait_idle_sess_id()
194 rc = wait_event_timeout(conn->req_running_q, in ksmbd_conn_wait_idle_sess_id()
195 atomic_read(&conn->req_running) < rcount, in ksmbd_conn_wait_idle_sess_id()
212 struct ksmbd_conn *conn = work->conn; in ksmbd_conn_write() local
226 ksmbd_conn_lock(conn); in ksmbd_conn_write()
227 sent = conn->transport->ops->writev(conn->transport, work->iov, in ksmbd_conn_write()
232 ksmbd_conn_unlock(conn); in ksmbd_conn_write()
242 int ksmbd_conn_rdma_read(struct ksmbd_conn *conn, in ksmbd_conn_rdma_read() argument
249 if (conn->transport->ops->rdma_read) in ksmbd_conn_rdma_read()
250 ret = conn->transport->ops->rdma_read(conn->transport, in ksmbd_conn_rdma_read()
256 int ksmbd_conn_rdma_write(struct ksmbd_conn *conn, in ksmbd_conn_rdma_write() argument
263 if (conn->transport->ops->rdma_write) in ksmbd_conn_rdma_write()
264 ret = conn->transport->ops->rdma_write(conn->transport, in ksmbd_conn_rdma_write()
270 bool ksmbd_conn_alive(struct ksmbd_conn *conn) in ksmbd_conn_alive() argument
275 if (ksmbd_conn_exiting(conn)) in ksmbd_conn_alive()
281 if (atomic_read(&conn->stats.open_files_count) > 0) in ksmbd_conn_alive()
290 time_after(jiffies, conn->last_active + server_conf.deadtime)) { in ksmbd_conn_alive()
291 ksmbd_debug(CONN, "No response from client in %lu minutes\n", in ksmbd_conn_alive()
311 struct ksmbd_conn *conn = (struct ksmbd_conn *)p; in ksmbd_conn_handler_loop() local
312 struct ksmbd_transport *t = conn->transport; in ksmbd_conn_handler_loop()
317 mutex_init(&conn->srv_mutex); in ksmbd_conn_handler_loop()
324 conn->last_active = jiffies; in ksmbd_conn_handler_loop()
326 while (ksmbd_conn_alive(conn)) { in ksmbd_conn_handler_loop()
330 kvfree(conn->request_buf); in ksmbd_conn_handler_loop()
331 conn->request_buf = NULL; in ksmbd_conn_handler_loop()
334 if (atomic_read(&conn->req_running) + 1 > max_req) { in ksmbd_conn_handler_loop()
335 wait_event_interruptible(conn->req_running_q, in ksmbd_conn_handler_loop()
336 atomic_read(&conn->req_running) < max_req); in ksmbd_conn_handler_loop()
345 ksmbd_debug(CONN, "RFC1002 header %u bytes\n", pdu_size); in ksmbd_conn_handler_loop()
347 if (ksmbd_conn_good(conn)) in ksmbd_conn_handler_loop()
349 SMB3_MAX_MSGSIZE + conn->vals->max_write_size; in ksmbd_conn_handler_loop()
356 READ_ONCE(conn->status)); in ksmbd_conn_handler_loop()
372 conn->request_buf = kvmalloc(size, GFP_KERNEL); in ksmbd_conn_handler_loop()
373 if (!conn->request_buf) in ksmbd_conn_handler_loop()
376 memcpy(conn->request_buf, hdr_buf, sizeof(hdr_buf)); in ksmbd_conn_handler_loop()
382 size = t->ops->read(t, conn->request_buf + 4, pdu_size, 2); in ksmbd_conn_handler_loop()
394 if (!ksmbd_smb_request(conn)) in ksmbd_conn_handler_loop()
397 if (((struct smb2_hdr *)smb2_get_msg(conn->request_buf))->ProtocolId == in ksmbd_conn_handler_loop()
408 if (default_conn_ops.process_fn(conn)) { in ksmbd_conn_handler_loop()
415 ksmbd_conn_set_releasing(conn); in ksmbd_conn_handler_loop()
417 wait_event(conn->r_count_q, atomic_read(&conn->r_count) == 0); in ksmbd_conn_handler_loop()
420 utf8_unload(conn->um); in ksmbd_conn_handler_loop()
421 unload_nls(conn->local_nls); in ksmbd_conn_handler_loop()
423 default_conn_ops.terminate_fn(conn); in ksmbd_conn_handler_loop()
458 struct ksmbd_conn *conn; in stop_sessions() local
463 list_for_each_entry(conn, &conn_list, conns_list) { in stop_sessions()
464 t = conn->transport; in stop_sessions()
465 ksmbd_conn_set_exiting(conn); in stop_sessions()