Commit 1f119f90 authored by David S. Miller's avatar David S. Miller

Merge branch 'rds-bug-fixes'

Sowmini Varadhan says:

====================
rds bug fixes

Ran into pre-existing bugs when working on the fix for
   https://www.spinics.net/lists/netdev/msg472849.html

The bugs fixed in this patchset are unrelated to the syzbot
failure (which I'm still testing and trying to reproduce) but
meanwhile, let's get these fixes out of the way.

V2: target net-next (rds:tcp patches have a dependancy on
changes that are in net-next, but not yet in net)
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 3c149091 66261da1
...@@ -114,6 +114,7 @@ static int rds_add_bound(struct rds_sock *rs, __be32 addr, __be16 *port) ...@@ -114,6 +114,7 @@ static int rds_add_bound(struct rds_sock *rs, __be32 addr, __be16 *port)
rs, &addr, (int)ntohs(*port)); rs, &addr, (int)ntohs(*port));
break; break;
} else { } else {
rs->rs_bound_addr = 0;
rds_sock_put(rs); rds_sock_put(rs);
ret = -ENOMEM; ret = -ENOMEM;
break; break;
......
...@@ -270,16 +270,33 @@ static int rds_tcp_laddr_check(struct net *net, __be32 addr) ...@@ -270,16 +270,33 @@ static int rds_tcp_laddr_check(struct net *net, __be32 addr)
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
} }
static void rds_tcp_conn_free(void *arg)
{
struct rds_tcp_connection *tc = arg;
unsigned long flags;
rdsdebug("freeing tc %p\n", tc);
spin_lock_irqsave(&rds_tcp_conn_lock, flags);
if (!tc->t_tcp_node_detached)
list_del(&tc->t_tcp_node);
spin_unlock_irqrestore(&rds_tcp_conn_lock, flags);
kmem_cache_free(rds_tcp_conn_slab, tc);
}
static int rds_tcp_conn_alloc(struct rds_connection *conn, gfp_t gfp) static int rds_tcp_conn_alloc(struct rds_connection *conn, gfp_t gfp)
{ {
struct rds_tcp_connection *tc; struct rds_tcp_connection *tc;
int i; int i, j;
int ret = 0;
for (i = 0; i < RDS_MPATH_WORKERS; i++) { for (i = 0; i < RDS_MPATH_WORKERS; i++) {
tc = kmem_cache_alloc(rds_tcp_conn_slab, gfp); tc = kmem_cache_alloc(rds_tcp_conn_slab, gfp);
if (!tc) if (!tc) {
return -ENOMEM; ret = -ENOMEM;
break;
}
mutex_init(&tc->t_conn_path_lock); mutex_init(&tc->t_conn_path_lock);
tc->t_sock = NULL; tc->t_sock = NULL;
tc->t_tinc = NULL; tc->t_tinc = NULL;
...@@ -290,27 +307,17 @@ static int rds_tcp_conn_alloc(struct rds_connection *conn, gfp_t gfp) ...@@ -290,27 +307,17 @@ static int rds_tcp_conn_alloc(struct rds_connection *conn, gfp_t gfp)
tc->t_cpath = &conn->c_path[i]; tc->t_cpath = &conn->c_path[i];
spin_lock_irq(&rds_tcp_conn_lock); spin_lock_irq(&rds_tcp_conn_lock);
tc->t_tcp_node_detached = false;
list_add_tail(&tc->t_tcp_node, &rds_tcp_conn_list); list_add_tail(&tc->t_tcp_node, &rds_tcp_conn_list);
spin_unlock_irq(&rds_tcp_conn_lock); spin_unlock_irq(&rds_tcp_conn_lock);
rdsdebug("rds_conn_path [%d] tc %p\n", i, rdsdebug("rds_conn_path [%d] tc %p\n", i,
conn->c_path[i].cp_transport_data); conn->c_path[i].cp_transport_data);
} }
if (ret) {
return 0; for (j = 0; j < i; j++)
} rds_tcp_conn_free(conn->c_path[j].cp_transport_data);
}
static void rds_tcp_conn_free(void *arg) return ret;
{
struct rds_tcp_connection *tc = arg;
unsigned long flags;
rdsdebug("freeing tc %p\n", tc);
spin_lock_irqsave(&rds_tcp_conn_lock, flags);
if (!tc->t_tcp_node_detached)
list_del(&tc->t_tcp_node);
spin_unlock_irqrestore(&rds_tcp_conn_lock, flags);
kmem_cache_free(rds_tcp_conn_slab, tc);
} }
static bool list_has_conn(struct list_head *list, struct rds_connection *conn) static bool list_has_conn(struct list_head *list, struct rds_connection *conn)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment