@@ -300,7 +300,6 @@ cifs_abort_connection(struct TCP_Server_Info *server)
300
300
server -> ssocket -> flags );
301
301
sock_release (server -> ssocket );
302
302
server -> ssocket = NULL ;
303
- put_net (cifs_net_ns (server ));
304
303
}
305
304
server -> sequence_number = 0 ;
306
305
server -> session_estab = false;
@@ -1074,13 +1073,9 @@ clean_demultiplex_info(struct TCP_Server_Info *server)
1074
1073
msleep (125 );
1075
1074
if (cifs_rdma_enabled (server ))
1076
1075
smbd_destroy (server );
1077
-
1078
1076
if (server -> ssocket ) {
1079
1077
sock_release (server -> ssocket );
1080
1078
server -> ssocket = NULL ;
1081
-
1082
- /* Release netns reference for the socket. */
1083
- put_net (cifs_net_ns (server ));
1084
1079
}
1085
1080
1086
1081
if (!list_empty (& server -> pending_mid_q )) {
@@ -1128,7 +1123,6 @@ clean_demultiplex_info(struct TCP_Server_Info *server)
1128
1123
*/
1129
1124
}
1130
1125
1131
- /* Release netns reference for this server. */
1132
1126
put_net (cifs_net_ns (server ));
1133
1127
kfree (server -> leaf_fullpath );
1134
1128
kfree (server -> hostname );
@@ -1774,8 +1768,6 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
1774
1768
1775
1769
tcp_ses -> ops = ctx -> ops ;
1776
1770
tcp_ses -> vals = ctx -> vals ;
1777
-
1778
- /* Grab netns reference for this server. */
1779
1771
cifs_set_net_ns (tcp_ses , get_net (current -> nsproxy -> net_ns ));
1780
1772
1781
1773
tcp_ses -> sign = ctx -> sign ;
@@ -1903,7 +1895,6 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
1903
1895
out_err_crypto_release :
1904
1896
cifs_crypto_secmech_release (tcp_ses );
1905
1897
1906
- /* Release netns reference for this server. */
1907
1898
put_net (cifs_net_ns (tcp_ses ));
1908
1899
1909
1900
out_err :
@@ -1912,10 +1903,8 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
1912
1903
cifs_put_tcp_session (tcp_ses -> primary_server , false);
1913
1904
kfree (tcp_ses -> hostname );
1914
1905
kfree (tcp_ses -> leaf_fullpath );
1915
- if (tcp_ses -> ssocket ) {
1906
+ if (tcp_ses -> ssocket )
1916
1907
sock_release (tcp_ses -> ssocket );
1917
- put_net (cifs_net_ns (tcp_ses ));
1918
- }
1919
1908
kfree (tcp_ses );
1920
1909
}
1921
1910
return ERR_PTR (rc );
@@ -3359,24 +3348,20 @@ generic_ip_connect(struct TCP_Server_Info *server)
3359
3348
socket = server -> ssocket ;
3360
3349
} else {
3361
3350
struct net * net = cifs_net_ns (server );
3351
+ struct sock * sk ;
3362
3352
3363
- rc = sock_create_kern (net , sfamily , SOCK_STREAM , IPPROTO_TCP , & server -> ssocket );
3353
+ rc = __sock_create (net , sfamily , SOCK_STREAM ,
3354
+ IPPROTO_TCP , & server -> ssocket , 1 );
3364
3355
if (rc < 0 ) {
3365
3356
cifs_server_dbg (VFS , "Error %d creating socket\n" , rc );
3366
3357
return rc ;
3367
3358
}
3368
3359
3369
- /*
3370
- * Grab netns reference for the socket.
3371
- *
3372
- * This reference will be released in several situations:
3373
- * - In the failure path before the cifsd thread is started.
3374
- * - In the all place where server->socket is released, it is
3375
- * also set to NULL.
3376
- * - Ultimately in clean_demultiplex_info(), during the final
3377
- * teardown.
3378
- */
3379
- get_net (net );
3360
+ sk = server -> ssocket -> sk ;
3361
+ __netns_tracker_free (net , & sk -> ns_tracker , false);
3362
+ sk -> sk_net_refcnt = 1 ;
3363
+ get_net_track (net , & sk -> ns_tracker , GFP_KERNEL );
3364
+ sock_inuse_add (net , 1 );
3380
3365
3381
3366
/* BB other socket options to set KEEPALIVE, NODELAY? */
3382
3367
cifs_dbg (FYI , "Socket created\n" );
@@ -3428,7 +3413,6 @@ generic_ip_connect(struct TCP_Server_Info *server)
3428
3413
if (rc < 0 ) {
3429
3414
cifs_dbg (FYI , "Error %d connecting to server\n" , rc );
3430
3415
trace_smb3_connect_err (server -> hostname , server -> conn_id , & server -> dstaddr , rc );
3431
- put_net (cifs_net_ns (server ));
3432
3416
sock_release (socket );
3433
3417
server -> ssocket = NULL ;
3434
3418
return rc ;
0 commit comments