]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
RDS: rds_conn_lookup() should factor in the struct net for a match
authorSowmini Varadhan <sowmini.varadhan@oracle.com>
Wed, 14 Oct 2015 19:52:23 +0000 (15:52 -0400)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Wed, 21 Oct 2015 16:08:58 +0000 (09:08 -0700)
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 <sowmini.varadhan@oracle.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Mukesh Kacker <mukesh.kacker@oracle.com>
net/rds/af_rds.c
net/rds/connection.c
net/rds/rds.h
net/rds/recv.c

index bf307eadee0bce7a455c767544de85ef9905a9d1..2fe68f1871bb6c27da6ef8dd0bc449d96d03f165 100644 (file)
@@ -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) {
index 0635b2450ef255df01f7911d5d069db693152c18..a42470a2ec63c436142b1e73da289723f0083fcd 100644 (file)
@@ -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;
index fcbe790e4f6787be2d7390b42a58437fb412a1a5..a634a2bb927173727c9586e1becf757c45fd4096 100644 (file)
@@ -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);
index 5d5296a00c04660a525cb5aadc5cd0924eb4e5da..23ce423ca7ce8449b00caf613a92fd6e95cc5740 100644 (file)
@@ -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);
        }