@@ -987,9 +987,13 @@ clean_demultiplex_info(struct TCP_Server_Info *server)
987
987
msleep (125 );
988
988
if (cifs_rdma_enabled (server ))
989
989
smbd_destroy (server );
990
+
990
991
if (server -> ssocket ) {
991
992
sock_release (server -> ssocket );
992
993
server -> ssocket = NULL ;
994
+
995
+ /* Release netns reference for the socket. */
996
+ put_net (cifs_net_ns (server ));
993
997
}
994
998
995
999
if (!list_empty (& server -> pending_mid_q )) {
@@ -1037,6 +1041,7 @@ clean_demultiplex_info(struct TCP_Server_Info *server)
1037
1041
*/
1038
1042
}
1039
1043
1044
+ /* Release netns reference for this server. */
1040
1045
put_net (cifs_net_ns (server ));
1041
1046
kfree (server -> leaf_fullpath );
1042
1047
kfree (server );
@@ -1713,6 +1718,8 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
1713
1718
1714
1719
tcp_ses -> ops = ctx -> ops ;
1715
1720
tcp_ses -> vals = ctx -> vals ;
1721
+
1722
+ /* Grab netns reference for this server. */
1716
1723
cifs_set_net_ns (tcp_ses , get_net (current -> nsproxy -> net_ns ));
1717
1724
1718
1725
tcp_ses -> conn_id = atomic_inc_return (& tcpSesNextId );
@@ -1844,6 +1851,7 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
1844
1851
out_err_crypto_release :
1845
1852
cifs_crypto_secmech_release (tcp_ses );
1846
1853
1854
+ /* Release netns reference for this server. */
1847
1855
put_net (cifs_net_ns (tcp_ses ));
1848
1856
1849
1857
out_err :
@@ -1852,8 +1860,10 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
1852
1860
cifs_put_tcp_session (tcp_ses -> primary_server , false);
1853
1861
kfree (tcp_ses -> hostname );
1854
1862
kfree (tcp_ses -> leaf_fullpath );
1855
- if (tcp_ses -> ssocket )
1863
+ if (tcp_ses -> ssocket ) {
1856
1864
sock_release (tcp_ses -> ssocket );
1865
+ put_net (cifs_net_ns (tcp_ses ));
1866
+ }
1857
1867
kfree (tcp_ses );
1858
1868
}
1859
1869
return ERR_PTR (rc );
@@ -3131,20 +3141,20 @@ generic_ip_connect(struct TCP_Server_Info *server)
3131
3141
socket = server -> ssocket ;
3132
3142
} else {
3133
3143
struct net * net = cifs_net_ns (server );
3134
- struct sock * sk ;
3135
3144
3136
- rc = __sock_create (net , sfamily , SOCK_STREAM ,
3137
- IPPROTO_TCP , & server -> ssocket , 1 );
3145
+ rc = sock_create_kern (net , sfamily , SOCK_STREAM , IPPROTO_TCP , & server -> ssocket );
3138
3146
if (rc < 0 ) {
3139
3147
cifs_server_dbg (VFS , "Error %d creating socket\n" , rc );
3140
3148
return rc ;
3141
3149
}
3142
3150
3143
- sk = server -> ssocket -> sk ;
3144
- __netns_tracker_free (net , & sk -> ns_tracker , false);
3145
- sk -> sk_net_refcnt = 1 ;
3146
- get_net_track (net , & sk -> ns_tracker , GFP_KERNEL );
3147
- sock_inuse_add (net , 1 );
3151
+ /*
3152
+ * Grab netns reference for the socket.
3153
+ *
3154
+ * It'll be released here, on error, or in clean_demultiplex_info() upon server
3155
+ * teardown.
3156
+ */
3157
+ get_net (net );
3148
3158
3149
3159
/* BB other socket options to set KEEPALIVE, NODELAY? */
3150
3160
cifs_dbg (FYI , "Socket created\n" );
@@ -3158,8 +3168,10 @@ generic_ip_connect(struct TCP_Server_Info *server)
3158
3168
}
3159
3169
3160
3170
rc = bind_socket (server );
3161
- if (rc < 0 )
3171
+ if (rc < 0 ) {
3172
+ put_net (cifs_net_ns (server ));
3162
3173
return rc ;
3174
+ }
3163
3175
3164
3176
/*
3165
3177
* Eventually check for other socket options to change from
@@ -3196,6 +3208,7 @@ generic_ip_connect(struct TCP_Server_Info *server)
3196
3208
if (rc < 0 ) {
3197
3209
cifs_dbg (FYI , "Error %d connecting to server\n" , rc );
3198
3210
trace_smb3_connect_err (server -> hostname , server -> conn_id , & server -> dstaddr , rc );
3211
+ put_net (cifs_net_ns (server ));
3199
3212
sock_release (socket );
3200
3213
server -> ssocket = NULL ;
3201
3214
return rc ;
@@ -3204,6 +3217,9 @@ generic_ip_connect(struct TCP_Server_Info *server)
3204
3217
if (sport == htons (RFC1001_PORT ))
3205
3218
rc = ip_rfc1001_connect (server );
3206
3219
3220
+ if (rc < 0 )
3221
+ put_net (cifs_net_ns (server ));
3222
+
3207
3223
return rc ;
3208
3224
}
3209
3225
0 commit comments