diff options
author | Sowmini Varadhan <sowmini.varadhan@oracle.com> | 2017-03-04 08:57:33 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-03-07 14:09:59 -0800 |
commit | 8edc3affc0770886c7bfb3436b0fdd09bce13167 (patch) | |
tree | cfe3a2ae7348961f4c8872ffd5158d2ba4e35235 /net/rds/tcp.c | |
parent | fa4c7fb2ad2ea5dae57eb875915d0efb1e068543 (diff) | |
download | linux-rpi-8edc3affc0770886c7bfb3436b0fdd09bce13167.tar.gz linux-rpi-8edc3affc0770886c7bfb3436b0fdd09bce13167.tar.bz2 linux-rpi-8edc3affc0770886c7bfb3436b0fdd09bce13167.zip |
rds: tcp: Take explicit refcounts on struct net
It is incorrect for the rds_connection to piggyback on the
sock_net() refcount for the netns because this gives rise to
a chicken-and-egg problem during rds_conn_destroy. Instead explicitly
take a ref on the net, and hold the netns down till the connection
tear-down is complete.
Reported-by: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rds/tcp.c')
-rw-r--r-- | net/rds/tcp.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/rds/tcp.c b/net/rds/tcp.c index a973d3b4dff0..65c8e3b3b710 100644 --- a/net/rds/tcp.c +++ b/net/rds/tcp.c @@ -529,7 +529,7 @@ static void rds_tcp_kill_sock(struct net *net) flush_work(&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; @@ -584,7 +584,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; |