diff options
Diffstat (limited to 'net/rds/tcp.c')
| -rw-r--r-- | net/rds/tcp.c | 38 | 
1 files changed, 21 insertions, 17 deletions
diff --git a/net/rds/tcp.c b/net/rds/tcp.c index a973d3b4dff0..225690076773 100644 --- a/net/rds/tcp.c +++ b/net/rds/tcp.c @@ -484,9 +484,10 @@ static void __net_exit rds_tcp_exit_net(struct net *net)  	 * we do need to clean up the listen socket here.  	 */  	if (rtn->rds_tcp_listen_sock) { -		rds_tcp_listen_stop(rtn->rds_tcp_listen_sock); +		struct socket *lsock = rtn->rds_tcp_listen_sock; +  		rtn->rds_tcp_listen_sock = NULL; -		flush_work(&rtn->rds_tcp_accept_w); +		rds_tcp_listen_stop(lsock, &rtn->rds_tcp_accept_w);  	}  } @@ -523,13 +524,13 @@ static void rds_tcp_kill_sock(struct net *net)  	struct rds_tcp_connection *tc, *_tc;  	LIST_HEAD(tmp_list);  	struct rds_tcp_net *rtn = net_generic(net, rds_tcp_netid); +	struct socket *lsock = rtn->rds_tcp_listen_sock; -	rds_tcp_listen_stop(rtn->rds_tcp_listen_sock);  	rtn->rds_tcp_listen_sock = NULL; -	flush_work(&rtn->rds_tcp_accept_w); +	rds_tcp_listen_stop(lsock, &rtn->rds_tcp_accept_w);  	spin_lock_irq(&rds_tcp_conn_lock);  	list_for_each_entry_safe(tc, _tc, &rds_tcp_conn_list, t_tcp_node) { -		struct net *c_net = read_pnet(&tc->t_cpath->cp_conn->c_net); +		struct net *c_net = tc->t_cpath->cp_conn->c_net;  		if (net != c_net || !tc->t_sock)  			continue; @@ -546,8 +547,12 @@ static void rds_tcp_kill_sock(struct net *net)  void *rds_tcp_listen_sock_def_readable(struct net *net)  {  	struct rds_tcp_net *rtn = net_generic(net, rds_tcp_netid); +	struct socket *lsock = rtn->rds_tcp_listen_sock; + +	if (!lsock) +		return NULL; -	return rtn->rds_tcp_listen_sock->sk->sk_user_data; +	return lsock->sk->sk_user_data;  }  static int rds_tcp_dev_event(struct notifier_block *this, @@ -584,7 +589,7 @@ static void rds_tcp_sysctl_reset(struct net *net)  	spin_lock_irq(&rds_tcp_conn_lock);  	list_for_each_entry_safe(tc, _tc, &rds_tcp_conn_list, t_tcp_node) { -		struct net *c_net = read_pnet(&tc->t_cpath->cp_conn->c_net); +		struct net *c_net = tc->t_cpath->cp_conn->c_net;  		if (net != c_net || !tc->t_sock)  			continue; @@ -638,19 +643,19 @@ static int rds_tcp_init(void)  		goto out;  	} -	ret = register_netdevice_notifier(&rds_tcp_dev_notifier); -	if (ret) { -		pr_warn("could not register rds_tcp_dev_notifier\n"); +	ret = rds_tcp_recv_init(); +	if (ret)  		goto out_slab; -	}  	ret = register_pernet_subsys(&rds_tcp_net_ops);  	if (ret) -		goto out_notifier; +		goto out_recv; -	ret = rds_tcp_recv_init(); -	if (ret) +	ret = register_netdevice_notifier(&rds_tcp_dev_notifier); +	if (ret) { +		pr_warn("could not register rds_tcp_dev_notifier\n");  		goto out_pernet; +	}  	rds_trans_register(&rds_tcp_transport); @@ -660,9 +665,8 @@ static int rds_tcp_init(void)  out_pernet:  	unregister_pernet_subsys(&rds_tcp_net_ops); -out_notifier: -	if (unregister_netdevice_notifier(&rds_tcp_dev_notifier)) -		pr_warn("could not unregister rds_tcp_dev_notifier\n"); +out_recv: +	rds_tcp_recv_exit();  out_slab:  	kmem_cache_destroy(rds_tcp_conn_slab);  out:  | 
