} 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)
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;
}
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
/* 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);
}
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;
__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);