From: Sowmini Varadhan Date: Wed, 14 Oct 2015 19:52:23 +0000 (-0400) Subject: RDS: rds_conn_lookup() should factor in the struct net for a match X-Git-Tag: v4.1.12-92~251^2~1^2^2~2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=0831bd10efc373948f04f76a9309608895560c08;p=users%2Fjedix%2Flinux-maple.git RDS: rds_conn_lookup() should factor in the struct net for a match Orabug: 22012202 Backport of upstream commit 8f384c0177a0 ("RDS: rds_conn_lookup() should factor in the struct net for a match") Only return a conn if the rds_conn_net(conn) matches the struct net passed to rds_conn_lookup(). Fixes: 467fa15356ac ("RDS-TCP: Support multiple RDS-TCP listen endpoints, one per netns.") Signed-off-by: Sowmini Varadhan Acked-by: Santosh Shilimkar Signed-off-by: David S. Miller Signed-off-by: Mukesh Kacker --- diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c index bf307eadee0b..2fe68f1871bb 100644 --- a/net/rds/af_rds.c +++ b/net/rds/af_rds.c @@ -325,7 +325,8 @@ static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen) sizeof(struct rds_reset))) return -EFAULT; - conn = rds_conn_find(reset.src.s_addr, reset.dst.s_addr, + conn = rds_conn_find(sock_net(rds_rs_to_sk(rs)), + reset.src.s_addr, reset.dst.s_addr, rs->rs_transport, reset.tos); if (conn) { diff --git a/net/rds/connection.c b/net/rds/connection.c index 0635b2450ef2..a42470a2ec63 100644 --- a/net/rds/connection.c +++ b/net/rds/connection.c @@ -69,7 +69,8 @@ static struct hlist_head *rds_conn_bucket(__be32 laddr, __be32 faddr) } while (0) /* rcu read lock must be held or the connection spinlock */ -static struct rds_connection *rds_conn_lookup(struct hlist_head *head, +static struct rds_connection *rds_conn_lookup(struct net *net, + struct hlist_head *head, __be32 laddr, __be32 faddr, struct rds_transport *trans, u8 tos) @@ -79,7 +80,8 @@ static struct rds_connection *rds_conn_lookup(struct hlist_head *head, hlist_for_each_entry_rcu(conn, head, c_hash_node) { if (conn->c_faddr == faddr && conn->c_laddr == laddr && conn->c_tos == tos && - conn->c_trans == trans) { + conn->c_trans == trans && + net == rds_conn_net(conn)) { ret = conn; break; } @@ -131,7 +133,7 @@ static struct rds_connection *__rds_conn_create(struct net *net, int ret; rcu_read_lock(); - conn = rds_conn_lookup(head, laddr, faddr, trans, tos); + conn = rds_conn_lookup(net, head, laddr, faddr, trans, tos); if (conn && conn->c_loopback && conn->c_trans != &rds_loop_transport @@ -252,7 +254,7 @@ static struct rds_connection *__rds_conn_create(struct net *net, /* Creating normal conn */ struct rds_connection *found; - found = rds_conn_lookup(head, laddr, faddr, trans, tos); + found = rds_conn_lookup(net, head, laddr, faddr, trans, tos); if (found) { trans->conn_free(conn->c_transport_data); kmem_cache_free(rds_conn_slab, conn); @@ -287,14 +289,15 @@ struct rds_connection *rds_conn_create_outgoing(struct net *net, } EXPORT_SYMBOL_GPL(rds_conn_create_outgoing); -struct rds_connection *rds_conn_find(__be32 laddr, __be32 faddr, - struct rds_transport *trans, u8 tos) +struct rds_connection *rds_conn_find(struct net *net, __be32 laddr, + __be32 faddr, struct rds_transport *trans, + u8 tos) { struct rds_connection *conn; struct hlist_head *head = rds_conn_bucket(laddr, faddr); rcu_read_lock(); - conn = rds_conn_lookup(head, laddr, faddr, trans, tos); + conn = rds_conn_lookup(net, head, laddr, faddr, trans, tos); rcu_read_unlock(); return conn; diff --git a/net/rds/rds.h b/net/rds/rds.h index fcbe790e4f67..a634a2bb9271 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -708,7 +708,8 @@ struct rds_connection *rds_conn_create_outgoing(struct net *net, __be32 laddr, __be32 faddr, struct rds_transport *trans, u8 tos, gfp_t gfp); -struct rds_connection *rds_conn_find(__be32 laddr, __be32 faddr, +struct rds_connection *rds_conn_find(struct net *net, __be32 laddr, + __be32 faddr, struct rds_transport *trans, u8 tos); void rds_conn_shutdown(struct rds_connection *conn, int restart); void rds_conn_destroy(struct rds_connection *conn); diff --git a/net/rds/recv.c b/net/rds/recv.c index 5d5296a00c04..23ce423ca7ce 100644 --- a/net/rds/recv.c +++ b/net/rds/recv.c @@ -358,7 +358,8 @@ rds_recv_route(struct rds_connection *conn, struct rds_incoming *inc, nconn = conn; } else { /* reroute to a new conn structure, possibly the same one */ - nconn = rds_conn_find(dst->saddr, dst->daddr, conn->c_trans, + nconn = rds_conn_find(rds_conn_net(conn), + dst->saddr, dst->daddr, conn->c_trans, conn->c_tos); }