162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2018 Samsung Electronics Co., Ltd. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/list.h> 762306a36Sopenharmony_ci#include <linux/slab.h> 862306a36Sopenharmony_ci#include <linux/rwsem.h> 962306a36Sopenharmony_ci#include <linux/xarray.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "ksmbd_ida.h" 1262306a36Sopenharmony_ci#include "user_session.h" 1362306a36Sopenharmony_ci#include "user_config.h" 1462306a36Sopenharmony_ci#include "tree_connect.h" 1562306a36Sopenharmony_ci#include "../transport_ipc.h" 1662306a36Sopenharmony_ci#include "../connection.h" 1762306a36Sopenharmony_ci#include "../vfs_cache.h" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic DEFINE_IDA(session_ida); 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define SESSION_HASH_BITS 3 2262306a36Sopenharmony_cistatic DEFINE_HASHTABLE(sessions_table, SESSION_HASH_BITS); 2362306a36Sopenharmony_cistatic DECLARE_RWSEM(sessions_table_lock); 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistruct ksmbd_session_rpc { 2662306a36Sopenharmony_ci int id; 2762306a36Sopenharmony_ci unsigned int method; 2862306a36Sopenharmony_ci}; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic void free_channel_list(struct ksmbd_session *sess) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci struct channel *chann; 3362306a36Sopenharmony_ci unsigned long index; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci xa_for_each(&sess->ksmbd_chann_list, index, chann) { 3662306a36Sopenharmony_ci xa_erase(&sess->ksmbd_chann_list, index); 3762306a36Sopenharmony_ci kfree(chann); 3862306a36Sopenharmony_ci } 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci xa_destroy(&sess->ksmbd_chann_list); 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic void __session_rpc_close(struct ksmbd_session *sess, 4462306a36Sopenharmony_ci struct ksmbd_session_rpc *entry) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci struct ksmbd_rpc_command *resp; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci resp = ksmbd_rpc_close(sess, entry->id); 4962306a36Sopenharmony_ci if (!resp) 5062306a36Sopenharmony_ci pr_err("Unable to close RPC pipe %d\n", entry->id); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci kvfree(resp); 5362306a36Sopenharmony_ci ksmbd_rpc_id_free(entry->id); 5462306a36Sopenharmony_ci kfree(entry); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic void ksmbd_session_rpc_clear_list(struct ksmbd_session *sess) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci struct ksmbd_session_rpc *entry; 6062306a36Sopenharmony_ci long index; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci xa_for_each(&sess->rpc_handle_list, index, entry) { 6362306a36Sopenharmony_ci xa_erase(&sess->rpc_handle_list, index); 6462306a36Sopenharmony_ci __session_rpc_close(sess, entry); 6562306a36Sopenharmony_ci } 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci xa_destroy(&sess->rpc_handle_list); 6862306a36Sopenharmony_ci} 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistatic int __rpc_method(char *rpc_name) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci if (!strcmp(rpc_name, "\\srvsvc") || !strcmp(rpc_name, "srvsvc")) 7362306a36Sopenharmony_ci return KSMBD_RPC_SRVSVC_METHOD_INVOKE; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci if (!strcmp(rpc_name, "\\wkssvc") || !strcmp(rpc_name, "wkssvc")) 7662306a36Sopenharmony_ci return KSMBD_RPC_WKSSVC_METHOD_INVOKE; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci if (!strcmp(rpc_name, "LANMAN") || !strcmp(rpc_name, "lanman")) 7962306a36Sopenharmony_ci return KSMBD_RPC_RAP_METHOD; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci if (!strcmp(rpc_name, "\\samr") || !strcmp(rpc_name, "samr")) 8262306a36Sopenharmony_ci return KSMBD_RPC_SAMR_METHOD_INVOKE; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci if (!strcmp(rpc_name, "\\lsarpc") || !strcmp(rpc_name, "lsarpc")) 8562306a36Sopenharmony_ci return KSMBD_RPC_LSARPC_METHOD_INVOKE; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci pr_err("Unsupported RPC: %s\n", rpc_name); 8862306a36Sopenharmony_ci return 0; 8962306a36Sopenharmony_ci} 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciint ksmbd_session_rpc_open(struct ksmbd_session *sess, char *rpc_name) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci struct ksmbd_session_rpc *entry; 9462306a36Sopenharmony_ci struct ksmbd_rpc_command *resp; 9562306a36Sopenharmony_ci int method; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci method = __rpc_method(rpc_name); 9862306a36Sopenharmony_ci if (!method) 9962306a36Sopenharmony_ci return -EINVAL; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci entry = kzalloc(sizeof(struct ksmbd_session_rpc), GFP_KERNEL); 10262306a36Sopenharmony_ci if (!entry) 10362306a36Sopenharmony_ci return -ENOMEM; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci entry->method = method; 10662306a36Sopenharmony_ci entry->id = ksmbd_ipc_id_alloc(); 10762306a36Sopenharmony_ci if (entry->id < 0) 10862306a36Sopenharmony_ci goto free_entry; 10962306a36Sopenharmony_ci xa_store(&sess->rpc_handle_list, entry->id, entry, GFP_KERNEL); 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci resp = ksmbd_rpc_open(sess, entry->id); 11262306a36Sopenharmony_ci if (!resp) 11362306a36Sopenharmony_ci goto free_id; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci kvfree(resp); 11662306a36Sopenharmony_ci return entry->id; 11762306a36Sopenharmony_cifree_id: 11862306a36Sopenharmony_ci xa_erase(&sess->rpc_handle_list, entry->id); 11962306a36Sopenharmony_ci ksmbd_rpc_id_free(entry->id); 12062306a36Sopenharmony_cifree_entry: 12162306a36Sopenharmony_ci kfree(entry); 12262306a36Sopenharmony_ci return -EINVAL; 12362306a36Sopenharmony_ci} 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_civoid ksmbd_session_rpc_close(struct ksmbd_session *sess, int id) 12662306a36Sopenharmony_ci{ 12762306a36Sopenharmony_ci struct ksmbd_session_rpc *entry; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci entry = xa_erase(&sess->rpc_handle_list, id); 13062306a36Sopenharmony_ci if (entry) 13162306a36Sopenharmony_ci __session_rpc_close(sess, entry); 13262306a36Sopenharmony_ci} 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ciint ksmbd_session_rpc_method(struct ksmbd_session *sess, int id) 13562306a36Sopenharmony_ci{ 13662306a36Sopenharmony_ci struct ksmbd_session_rpc *entry; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci entry = xa_load(&sess->rpc_handle_list, id); 13962306a36Sopenharmony_ci return entry ? entry->method : 0; 14062306a36Sopenharmony_ci} 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_civoid ksmbd_session_destroy(struct ksmbd_session *sess) 14362306a36Sopenharmony_ci{ 14462306a36Sopenharmony_ci if (!sess) 14562306a36Sopenharmony_ci return; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci if (sess->user) 14862306a36Sopenharmony_ci ksmbd_free_user(sess->user); 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci ksmbd_tree_conn_session_logoff(sess); 15162306a36Sopenharmony_ci ksmbd_destroy_file_table(&sess->file_table); 15262306a36Sopenharmony_ci ksmbd_session_rpc_clear_list(sess); 15362306a36Sopenharmony_ci free_channel_list(sess); 15462306a36Sopenharmony_ci kfree(sess->Preauth_HashValue); 15562306a36Sopenharmony_ci ksmbd_release_id(&session_ida, sess->id); 15662306a36Sopenharmony_ci kfree(sess); 15762306a36Sopenharmony_ci} 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistatic struct ksmbd_session *__session_lookup(unsigned long long id) 16062306a36Sopenharmony_ci{ 16162306a36Sopenharmony_ci struct ksmbd_session *sess; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci hash_for_each_possible(sessions_table, sess, hlist, id) { 16462306a36Sopenharmony_ci if (id == sess->id) { 16562306a36Sopenharmony_ci sess->last_active = jiffies; 16662306a36Sopenharmony_ci return sess; 16762306a36Sopenharmony_ci } 16862306a36Sopenharmony_ci } 16962306a36Sopenharmony_ci return NULL; 17062306a36Sopenharmony_ci} 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_cistatic void ksmbd_expire_session(struct ksmbd_conn *conn) 17362306a36Sopenharmony_ci{ 17462306a36Sopenharmony_ci unsigned long id; 17562306a36Sopenharmony_ci struct ksmbd_session *sess; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci down_write(&conn->session_lock); 17862306a36Sopenharmony_ci xa_for_each(&conn->sessions, id, sess) { 17962306a36Sopenharmony_ci if (sess->state != SMB2_SESSION_VALID || 18062306a36Sopenharmony_ci time_after(jiffies, 18162306a36Sopenharmony_ci sess->last_active + SMB2_SESSION_TIMEOUT)) { 18262306a36Sopenharmony_ci xa_erase(&conn->sessions, sess->id); 18362306a36Sopenharmony_ci hash_del(&sess->hlist); 18462306a36Sopenharmony_ci ksmbd_session_destroy(sess); 18562306a36Sopenharmony_ci continue; 18662306a36Sopenharmony_ci } 18762306a36Sopenharmony_ci } 18862306a36Sopenharmony_ci up_write(&conn->session_lock); 18962306a36Sopenharmony_ci} 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ciint ksmbd_session_register(struct ksmbd_conn *conn, 19262306a36Sopenharmony_ci struct ksmbd_session *sess) 19362306a36Sopenharmony_ci{ 19462306a36Sopenharmony_ci sess->dialect = conn->dialect; 19562306a36Sopenharmony_ci memcpy(sess->ClientGUID, conn->ClientGUID, SMB2_CLIENT_GUID_SIZE); 19662306a36Sopenharmony_ci ksmbd_expire_session(conn); 19762306a36Sopenharmony_ci return xa_err(xa_store(&conn->sessions, sess->id, sess, GFP_KERNEL)); 19862306a36Sopenharmony_ci} 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistatic int ksmbd_chann_del(struct ksmbd_conn *conn, struct ksmbd_session *sess) 20162306a36Sopenharmony_ci{ 20262306a36Sopenharmony_ci struct channel *chann; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci chann = xa_erase(&sess->ksmbd_chann_list, (long)conn); 20562306a36Sopenharmony_ci if (!chann) 20662306a36Sopenharmony_ci return -ENOENT; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci kfree(chann); 20962306a36Sopenharmony_ci return 0; 21062306a36Sopenharmony_ci} 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_civoid ksmbd_sessions_deregister(struct ksmbd_conn *conn) 21362306a36Sopenharmony_ci{ 21462306a36Sopenharmony_ci struct ksmbd_session *sess; 21562306a36Sopenharmony_ci unsigned long id; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci down_write(&sessions_table_lock); 21862306a36Sopenharmony_ci if (conn->binding) { 21962306a36Sopenharmony_ci int bkt; 22062306a36Sopenharmony_ci struct hlist_node *tmp; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci hash_for_each_safe(sessions_table, bkt, tmp, sess, hlist) { 22362306a36Sopenharmony_ci if (!ksmbd_chann_del(conn, sess) && 22462306a36Sopenharmony_ci xa_empty(&sess->ksmbd_chann_list)) { 22562306a36Sopenharmony_ci hash_del(&sess->hlist); 22662306a36Sopenharmony_ci ksmbd_session_destroy(sess); 22762306a36Sopenharmony_ci } 22862306a36Sopenharmony_ci } 22962306a36Sopenharmony_ci } 23062306a36Sopenharmony_ci up_write(&sessions_table_lock); 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci down_write(&conn->session_lock); 23362306a36Sopenharmony_ci xa_for_each(&conn->sessions, id, sess) { 23462306a36Sopenharmony_ci unsigned long chann_id; 23562306a36Sopenharmony_ci struct channel *chann; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci xa_for_each(&sess->ksmbd_chann_list, chann_id, chann) { 23862306a36Sopenharmony_ci if (chann->conn != conn) 23962306a36Sopenharmony_ci ksmbd_conn_set_exiting(chann->conn); 24062306a36Sopenharmony_ci } 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci ksmbd_chann_del(conn, sess); 24362306a36Sopenharmony_ci if (xa_empty(&sess->ksmbd_chann_list)) { 24462306a36Sopenharmony_ci xa_erase(&conn->sessions, sess->id); 24562306a36Sopenharmony_ci hash_del(&sess->hlist); 24662306a36Sopenharmony_ci ksmbd_session_destroy(sess); 24762306a36Sopenharmony_ci } 24862306a36Sopenharmony_ci } 24962306a36Sopenharmony_ci up_write(&conn->session_lock); 25062306a36Sopenharmony_ci} 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_cistruct ksmbd_session *ksmbd_session_lookup(struct ksmbd_conn *conn, 25362306a36Sopenharmony_ci unsigned long long id) 25462306a36Sopenharmony_ci{ 25562306a36Sopenharmony_ci struct ksmbd_session *sess; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci down_read(&conn->session_lock); 25862306a36Sopenharmony_ci sess = xa_load(&conn->sessions, id); 25962306a36Sopenharmony_ci if (sess) 26062306a36Sopenharmony_ci sess->last_active = jiffies; 26162306a36Sopenharmony_ci up_read(&conn->session_lock); 26262306a36Sopenharmony_ci return sess; 26362306a36Sopenharmony_ci} 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistruct ksmbd_session *ksmbd_session_lookup_slowpath(unsigned long long id) 26662306a36Sopenharmony_ci{ 26762306a36Sopenharmony_ci struct ksmbd_session *sess; 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci down_read(&sessions_table_lock); 27062306a36Sopenharmony_ci sess = __session_lookup(id); 27162306a36Sopenharmony_ci if (sess) 27262306a36Sopenharmony_ci sess->last_active = jiffies; 27362306a36Sopenharmony_ci up_read(&sessions_table_lock); 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci return sess; 27662306a36Sopenharmony_ci} 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_cistruct ksmbd_session *ksmbd_session_lookup_all(struct ksmbd_conn *conn, 27962306a36Sopenharmony_ci unsigned long long id) 28062306a36Sopenharmony_ci{ 28162306a36Sopenharmony_ci struct ksmbd_session *sess; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci sess = ksmbd_session_lookup(conn, id); 28462306a36Sopenharmony_ci if (!sess && conn->binding) 28562306a36Sopenharmony_ci sess = ksmbd_session_lookup_slowpath(id); 28662306a36Sopenharmony_ci if (sess && sess->state != SMB2_SESSION_VALID) 28762306a36Sopenharmony_ci sess = NULL; 28862306a36Sopenharmony_ci return sess; 28962306a36Sopenharmony_ci} 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cistruct preauth_session *ksmbd_preauth_session_alloc(struct ksmbd_conn *conn, 29262306a36Sopenharmony_ci u64 sess_id) 29362306a36Sopenharmony_ci{ 29462306a36Sopenharmony_ci struct preauth_session *sess; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci sess = kmalloc(sizeof(struct preauth_session), GFP_KERNEL); 29762306a36Sopenharmony_ci if (!sess) 29862306a36Sopenharmony_ci return NULL; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci sess->id = sess_id; 30162306a36Sopenharmony_ci memcpy(sess->Preauth_HashValue, conn->preauth_info->Preauth_HashValue, 30262306a36Sopenharmony_ci PREAUTH_HASHVALUE_SIZE); 30362306a36Sopenharmony_ci list_add(&sess->preauth_entry, &conn->preauth_sess_table); 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci return sess; 30662306a36Sopenharmony_ci} 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cistatic bool ksmbd_preauth_session_id_match(struct preauth_session *sess, 30962306a36Sopenharmony_ci unsigned long long id) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci return sess->id == id; 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistruct preauth_session *ksmbd_preauth_session_lookup(struct ksmbd_conn *conn, 31562306a36Sopenharmony_ci unsigned long long id) 31662306a36Sopenharmony_ci{ 31762306a36Sopenharmony_ci struct preauth_session *sess = NULL; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci list_for_each_entry(sess, &conn->preauth_sess_table, preauth_entry) { 32062306a36Sopenharmony_ci if (ksmbd_preauth_session_id_match(sess, id)) 32162306a36Sopenharmony_ci return sess; 32262306a36Sopenharmony_ci } 32362306a36Sopenharmony_ci return NULL; 32462306a36Sopenharmony_ci} 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_cistatic int __init_smb2_session(struct ksmbd_session *sess) 32762306a36Sopenharmony_ci{ 32862306a36Sopenharmony_ci int id = ksmbd_acquire_smb2_uid(&session_ida); 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci if (id < 0) 33162306a36Sopenharmony_ci return -EINVAL; 33262306a36Sopenharmony_ci sess->id = id; 33362306a36Sopenharmony_ci return 0; 33462306a36Sopenharmony_ci} 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_cistatic struct ksmbd_session *__session_create(int protocol) 33762306a36Sopenharmony_ci{ 33862306a36Sopenharmony_ci struct ksmbd_session *sess; 33962306a36Sopenharmony_ci int ret; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci if (protocol != CIFDS_SESSION_FLAG_SMB2) 34262306a36Sopenharmony_ci return NULL; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci sess = kzalloc(sizeof(struct ksmbd_session), GFP_KERNEL); 34562306a36Sopenharmony_ci if (!sess) 34662306a36Sopenharmony_ci return NULL; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci if (ksmbd_init_file_table(&sess->file_table)) 34962306a36Sopenharmony_ci goto error; 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci sess->last_active = jiffies; 35262306a36Sopenharmony_ci sess->state = SMB2_SESSION_IN_PROGRESS; 35362306a36Sopenharmony_ci set_session_flag(sess, protocol); 35462306a36Sopenharmony_ci xa_init(&sess->tree_conns); 35562306a36Sopenharmony_ci xa_init(&sess->ksmbd_chann_list); 35662306a36Sopenharmony_ci xa_init(&sess->rpc_handle_list); 35762306a36Sopenharmony_ci sess->sequence_number = 1; 35862306a36Sopenharmony_ci rwlock_init(&sess->tree_conns_lock); 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci ret = __init_smb2_session(sess); 36162306a36Sopenharmony_ci if (ret) 36262306a36Sopenharmony_ci goto error; 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci ida_init(&sess->tree_conn_ida); 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci down_write(&sessions_table_lock); 36762306a36Sopenharmony_ci hash_add(sessions_table, &sess->hlist, sess->id); 36862306a36Sopenharmony_ci up_write(&sessions_table_lock); 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci return sess; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_cierror: 37362306a36Sopenharmony_ci ksmbd_session_destroy(sess); 37462306a36Sopenharmony_ci return NULL; 37562306a36Sopenharmony_ci} 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_cistruct ksmbd_session *ksmbd_smb2_session_create(void) 37862306a36Sopenharmony_ci{ 37962306a36Sopenharmony_ci return __session_create(CIFDS_SESSION_FLAG_SMB2); 38062306a36Sopenharmony_ci} 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ciint ksmbd_acquire_tree_conn_id(struct ksmbd_session *sess) 38362306a36Sopenharmony_ci{ 38462306a36Sopenharmony_ci int id = -EINVAL; 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci if (test_session_flag(sess, CIFDS_SESSION_FLAG_SMB2)) 38762306a36Sopenharmony_ci id = ksmbd_acquire_smb2_tid(&sess->tree_conn_ida); 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci return id; 39062306a36Sopenharmony_ci} 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_civoid ksmbd_release_tree_conn_id(struct ksmbd_session *sess, int id) 39362306a36Sopenharmony_ci{ 39462306a36Sopenharmony_ci if (id >= 0) 39562306a36Sopenharmony_ci ksmbd_release_id(&sess->tree_conn_ida, id); 39662306a36Sopenharmony_ci} 397