msleep(125);
        if (cifs_rdma_enabled(server))
                smbd_destroy(server);
+
        if (server->ssocket) {
                sock_release(server->ssocket);
                server->ssocket = NULL;
+
+               /* Release netns reference for the socket. */
+               put_net(cifs_net_ns(server));
        }
 
        if (!list_empty(&server->pending_mid_q)) {
                 */
        }
 
+       /* Release netns reference for this server. */
        put_net(cifs_net_ns(server));
        kfree(server->leaf_fullpath);
        kfree(server);
 
        tcp_ses->ops = ctx->ops;
        tcp_ses->vals = ctx->vals;
+
+       /* Grab netns reference for this server. */
        cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
 
        tcp_ses->conn_id = atomic_inc_return(&tcpSesNextId);
 out_err_crypto_release:
        cifs_crypto_secmech_release(tcp_ses);
 
+       /* Release netns reference for this server. */
        put_net(cifs_net_ns(tcp_ses));
 
 out_err:
                        cifs_put_tcp_session(tcp_ses->primary_server, false);
                kfree(tcp_ses->hostname);
                kfree(tcp_ses->leaf_fullpath);
-               if (tcp_ses->ssocket)
+               if (tcp_ses->ssocket) {
                        sock_release(tcp_ses->ssocket);
+                       put_net(cifs_net_ns(tcp_ses));
+               }
                kfree(tcp_ses);
        }
        return ERR_PTR(rc);
                socket = server->ssocket;
        } else {
                struct net *net = cifs_net_ns(server);
-               struct sock *sk;
 
-               rc = __sock_create(net, sfamily, SOCK_STREAM,
-                                  IPPROTO_TCP, &server->ssocket, 1);
+               rc = sock_create_kern(net, sfamily, SOCK_STREAM, IPPROTO_TCP, &server->ssocket);
                if (rc < 0) {
                        cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
                        return rc;
                }
 
-               sk = server->ssocket->sk;
-               __netns_tracker_free(net, &sk->ns_tracker, false);
-               sk->sk_net_refcnt = 1;
-               get_net_track(net, &sk->ns_tracker, GFP_KERNEL);
-               sock_inuse_add(net, 1);
+               /*
+                * Grab netns reference for the socket.
+                *
+                * It'll be released here, on error, or in clean_demultiplex_info() upon server
+                * teardown.
+                */
+               get_net(net);
 
                /* BB other socket options to set KEEPALIVE, NODELAY? */
                cifs_dbg(FYI, "Socket created\n");
        }
 
        rc = bind_socket(server);
-       if (rc < 0)
+       if (rc < 0) {
+               put_net(cifs_net_ns(server));
                return rc;
+       }
 
        /*
         * Eventually check for other socket options to change from
        if (rc < 0) {
                cifs_dbg(FYI, "Error %d connecting to server\n", rc);
                trace_smb3_connect_err(server->hostname, server->conn_id, &server->dstaddr, rc);
+               put_net(cifs_net_ns(server));
                sock_release(socket);
                server->ssocket = NULL;
                return rc;
        if (sport == htons(RFC1001_PORT))
                rc = ip_rfc1001_connect(server);
 
+       if (rc < 0)
+               put_net(cifs_net_ns(server));
+
        return rc;
 }