Lines Matching refs:conn
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
172 wait_event(conn->req_running_q, atomic_read(&conn->req_running) < 2); in ksmbd_conn_wait_idle()
176 if (bind_conn == conn) in ksmbd_conn_wait_idle()
191 struct ksmbd_conn *conn = work->conn; in ksmbd_conn_write() local
205 ksmbd_conn_lock(conn); in ksmbd_conn_write()
206 sent = conn->transport->ops->writev(conn->transport, work->iov, in ksmbd_conn_write()
211 ksmbd_conn_unlock(conn); in ksmbd_conn_write()
221 int ksmbd_conn_rdma_read(struct ksmbd_conn *conn, in ksmbd_conn_rdma_read() argument
228 if (conn->transport->ops->rdma_read) in ksmbd_conn_rdma_read()
229 ret = conn->transport->ops->rdma_read(conn->transport, in ksmbd_conn_rdma_read()
235 int ksmbd_conn_rdma_write(struct ksmbd_conn *conn, in ksmbd_conn_rdma_write() argument
242 if (conn->transport->ops->rdma_write) in ksmbd_conn_rdma_write()
243 ret = conn->transport->ops->rdma_write(conn->transport, in ksmbd_conn_rdma_write()
249 bool ksmbd_conn_alive(struct ksmbd_conn *conn) in ksmbd_conn_alive() argument
254 if (ksmbd_conn_exiting(conn)) in ksmbd_conn_alive()
260 if (atomic_read(&conn->stats.open_files_count) > 0) in ksmbd_conn_alive()
269 time_after(jiffies, conn->last_active + server_conf.deadtime)) { in ksmbd_conn_alive()
290 struct ksmbd_conn *conn = (struct ksmbd_conn *)p; in ksmbd_conn_handler_loop() local
291 struct ksmbd_transport *t = conn->transport; in ksmbd_conn_handler_loop()
296 mutex_init(&conn->srv_mutex); in ksmbd_conn_handler_loop()
302 conn->last_active = jiffies; in ksmbd_conn_handler_loop()
303 while (ksmbd_conn_alive(conn)) { in ksmbd_conn_handler_loop()
307 kvfree(conn->request_buf); in ksmbd_conn_handler_loop()
308 conn->request_buf = NULL; in ksmbd_conn_handler_loop()
317 if (ksmbd_conn_good(conn)) in ksmbd_conn_handler_loop()
319 SMB3_MAX_MSGSIZE + conn->vals->max_write_size; in ksmbd_conn_handler_loop()
326 READ_ONCE(conn->status)); in ksmbd_conn_handler_loop()
342 conn->request_buf = kvmalloc(size, GFP_KERNEL); in ksmbd_conn_handler_loop()
343 if (!conn->request_buf) in ksmbd_conn_handler_loop()
346 memcpy(conn->request_buf, hdr_buf, sizeof(hdr_buf)); in ksmbd_conn_handler_loop()
352 size = t->ops->read(t, conn->request_buf + 4, pdu_size, 2); in ksmbd_conn_handler_loop()
364 if (!ksmbd_smb_request(conn)) in ksmbd_conn_handler_loop()
367 if (((struct smb2_hdr *)smb2_get_msg(conn->request_buf))->ProtocolId == in ksmbd_conn_handler_loop()
378 if (default_conn_ops.process_fn(conn)) { in ksmbd_conn_handler_loop()
385 ksmbd_conn_set_releasing(conn); in ksmbd_conn_handler_loop()
387 wait_event(conn->r_count_q, atomic_read(&conn->r_count) == 0); in ksmbd_conn_handler_loop()
390 utf8_unload(conn->um); in ksmbd_conn_handler_loop()
391 unload_nls(conn->local_nls); in ksmbd_conn_handler_loop()
393 default_conn_ops.terminate_fn(conn); in ksmbd_conn_handler_loop()
428 struct ksmbd_conn *conn; in stop_sessions() local
433 list_for_each_entry(conn, &conn_list, conns_list) { in stop_sessions()
436 t = conn->transport; in stop_sessions()
441 ksmbd_conn_set_exiting(conn); in stop_sessions()