@@ -74,14 +74,7 @@ static inline bool check_session_id(struct ksmbd_conn *conn, u64 id)
7474
7575struct channel * lookup_chann_list (struct ksmbd_session * sess , struct ksmbd_conn * conn )
7676{
77- struct channel * chann ;
78-
79- list_for_each_entry (chann , & sess -> ksmbd_chann_list , chann_list ) {
80- if (chann -> conn == conn )
81- return chann ;
82- }
83-
84- return NULL ;
77+ return xa_load (& sess -> ksmbd_chann_list , (long )conn );
8578}
8679
8780/**
@@ -595,6 +588,7 @@ static void destroy_previous_session(struct ksmbd_conn *conn,
595588 struct ksmbd_session * prev_sess = ksmbd_session_lookup_slowpath (id );
596589 struct ksmbd_user * prev_user ;
597590 struct channel * chann ;
591+ long index ;
598592
599593 if (!prev_sess )
600594 return ;
@@ -608,10 +602,8 @@ static void destroy_previous_session(struct ksmbd_conn *conn,
608602 return ;
609603
610604 prev_sess -> state = SMB2_SESSION_EXPIRED ;
611- write_lock (& prev_sess -> chann_lock );
612- list_for_each_entry (chann , & prev_sess -> ksmbd_chann_list , chann_list )
605+ xa_for_each (& prev_sess -> ksmbd_chann_list , index , chann )
613606 chann -> conn -> status = KSMBD_SESS_EXITING ;
614- write_unlock (& prev_sess -> chann_lock );
615607}
616608
617609/**
@@ -1519,19 +1511,14 @@ static int ntlm_authenticate(struct ksmbd_work *work)
15191511
15201512binding_session :
15211513 if (conn -> dialect >= SMB30_PROT_ID ) {
1522- read_lock (& sess -> chann_lock );
15231514 chann = lookup_chann_list (sess , conn );
1524- read_unlock (& sess -> chann_lock );
15251515 if (!chann ) {
15261516 chann = kmalloc (sizeof (struct channel ), GFP_KERNEL );
15271517 if (!chann )
15281518 return - ENOMEM ;
15291519
15301520 chann -> conn = conn ;
1531- INIT_LIST_HEAD (& chann -> chann_list );
1532- write_lock (& sess -> chann_lock );
1533- list_add (& chann -> chann_list , & sess -> ksmbd_chann_list );
1534- write_unlock (& sess -> chann_lock );
1521+ xa_store (& sess -> ksmbd_chann_list , (long )conn , chann , GFP_KERNEL );
15351522 }
15361523 }
15371524
@@ -1606,19 +1593,14 @@ static int krb5_authenticate(struct ksmbd_work *work)
16061593 }
16071594
16081595 if (conn -> dialect >= SMB30_PROT_ID ) {
1609- read_lock (& sess -> chann_lock );
16101596 chann = lookup_chann_list (sess , conn );
1611- read_unlock (& sess -> chann_lock );
16121597 if (!chann ) {
16131598 chann = kmalloc (sizeof (struct channel ), GFP_KERNEL );
16141599 if (!chann )
16151600 return - ENOMEM ;
16161601
16171602 chann -> conn = conn ;
1618- INIT_LIST_HEAD (& chann -> chann_list );
1619- write_lock (& sess -> chann_lock );
1620- list_add (& chann -> chann_list , & sess -> ksmbd_chann_list );
1621- write_unlock (& sess -> chann_lock );
1603+ xa_store (& sess -> ksmbd_chann_list , (long )conn , chann , GFP_KERNEL );
16221604 }
16231605 }
16241606
@@ -8409,14 +8391,11 @@ int smb3_check_sign_req(struct ksmbd_work *work)
84098391 if (le16_to_cpu (hdr -> Command ) == SMB2_SESSION_SETUP_HE ) {
84108392 signing_key = work -> sess -> smb3signingkey ;
84118393 } else {
8412- read_lock (& work -> sess -> chann_lock );
84138394 chann = lookup_chann_list (work -> sess , conn );
84148395 if (!chann ) {
8415- read_unlock (& work -> sess -> chann_lock );
84168396 return 0 ;
84178397 }
84188398 signing_key = chann -> smb3signingkey ;
8419- read_unlock (& work -> sess -> chann_lock );
84208399 }
84218400
84228401 if (!signing_key ) {
@@ -8476,14 +8455,11 @@ void smb3_set_sign_rsp(struct ksmbd_work *work)
84768455 le16_to_cpu (hdr -> Command ) == SMB2_SESSION_SETUP_HE ) {
84778456 signing_key = work -> sess -> smb3signingkey ;
84788457 } else {
8479- read_lock (& work -> sess -> chann_lock );
84808458 chann = lookup_chann_list (work -> sess , work -> conn );
84818459 if (!chann ) {
8482- read_unlock (& work -> sess -> chann_lock );
84838460 return ;
84848461 }
84858462 signing_key = chann -> smb3signingkey ;
8486- read_unlock (& work -> sess -> chann_lock );
84878463 }
84888464
84898465 if (!signing_key )
0 commit comments