@@ -173,6 +173,7 @@ static void cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server
173173 struct cifs_tcon * tcon ;
174174 struct mid_q_entry * mid , * nmid ;
175175 struct list_head retry_list ;
176+ struct TCP_Server_Info * pserver ;
176177
177178 server -> maxBuf = 0 ;
178179 server -> max_read = 0 ;
@@ -184,8 +185,12 @@ static void cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server
184185 * are not used until reconnected.
185186 */
186187 cifs_dbg (FYI , "%s: marking sessions and tcons for reconnect\n" , __func__ );
188+
189+ /* If server is a channel, select the primary channel */
190+ pserver = CIFS_SERVER_IS_CHAN (server ) ? server -> primary_server : server ;
191+
187192 spin_lock (& cifs_tcp_ses_lock );
188- list_for_each_entry (ses , & server -> smb_ses_list , smb_ses_list ) {
193+ list_for_each_entry (ses , & pserver -> smb_ses_list , smb_ses_list ) {
189194 ses -> need_reconnect = true;
190195 list_for_each_entry (tcon , & ses -> tcon_list , tcon_list )
191196 tcon -> need_reconnect = true;
@@ -1338,7 +1343,7 @@ cifs_find_tcp_session(struct smb3_fs_context *ctx)
13381343 * Skip ses channels since they're only handled in lower layers
13391344 * (e.g. cifs_send_recv).
13401345 */
1341- if (server -> is_channel || !match_server (server , ctx ))
1346+ if (CIFS_SERVER_IS_CHAN ( server ) || !match_server (server , ctx ))
13421347 continue ;
13431348
13441349 ++ server -> srv_count ;
@@ -1369,6 +1374,10 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
13691374 list_del_init (& server -> tcp_ses_list );
13701375 spin_unlock (& cifs_tcp_ses_lock );
13711376
1377+ /* For secondary channels, we pick up ref-count on the primary server */
1378+ if (CIFS_SERVER_IS_CHAN (server ))
1379+ cifs_put_tcp_session (server -> primary_server , from_reconnect );
1380+
13721381 cancel_delayed_work_sync (& server -> echo );
13731382 cancel_delayed_work_sync (& server -> resolve );
13741383
@@ -1401,7 +1410,8 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
14011410}
14021411
14031412struct TCP_Server_Info *
1404- cifs_get_tcp_session (struct smb3_fs_context * ctx )
1413+ cifs_get_tcp_session (struct smb3_fs_context * ctx ,
1414+ struct TCP_Server_Info * primary_server )
14051415{
14061416 struct TCP_Server_Info * tcp_ses = NULL ;
14071417 int rc ;
@@ -1438,6 +1448,10 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx)
14381448 tcp_ses -> in_flight = 0 ;
14391449 tcp_ses -> max_in_flight = 0 ;
14401450 tcp_ses -> credits = 1 ;
1451+ if (primary_server ) {
1452+ ++ primary_server -> srv_count ;
1453+ tcp_ses -> primary_server = primary_server ;
1454+ }
14411455 init_waitqueue_head (& tcp_ses -> response_q );
14421456 init_waitqueue_head (& tcp_ses -> request_q );
14431457 INIT_LIST_HEAD (& tcp_ses -> pending_mid_q );
@@ -1559,6 +1573,8 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx)
15591573
15601574out_err :
15611575 if (tcp_ses ) {
1576+ if (CIFS_SERVER_IS_CHAN (tcp_ses ))
1577+ cifs_put_tcp_session (tcp_ses -> primary_server , false);
15621578 kfree (tcp_ses -> hostname );
15631579 if (tcp_ses -> ssocket )
15641580 sock_release (tcp_ses -> ssocket );
@@ -2960,7 +2976,7 @@ static int mount_get_conns(struct mount_ctx *mnt_ctx)
29602976 xid = get_xid ();
29612977
29622978 /* get a reference to a tcp session */
2963- server = cifs_get_tcp_session (ctx );
2979+ server = cifs_get_tcp_session (ctx , NULL );
29642980 if (IS_ERR (server )) {
29652981 rc = PTR_ERR (server );
29662982 server = NULL ;
0 commit comments