|
@@ -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:
|