mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-03-11 23:27:42 +07:00
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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
1f119f9038
@ -114,6 +114,7 @@ static int rds_add_bound(struct rds_sock *rs, __be32 addr, __be16 *port)
|
||||
rs, &addr, (int)ntohs(*port));
|
||||
break;
|
||||
} else {
|
||||
rs->rs_bound_addr = 0;
|
||||
rds_sock_put(rs);
|
||||
ret = -ENOMEM;
|
||||
break;
|
||||
|
@ -270,16 +270,33 @@ static int rds_tcp_laddr_check(struct net *net, __be32 addr)
|
||||
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)
|
||||
{
|
||||
struct rds_tcp_connection *tc;
|
||||
int i;
|
||||
int i, j;
|
||||
int ret = 0;
|
||||
|
||||
for (i = 0; i < RDS_MPATH_WORKERS; i++) {
|
||||
tc = kmem_cache_alloc(rds_tcp_conn_slab, gfp);
|
||||
if (!tc)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!tc) {
|
||||
ret = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
mutex_init(&tc->t_conn_path_lock);
|
||||
tc->t_sock = NULL;
|
||||
tc->t_tinc = NULL;
|
||||
@ -290,27 +307,17 @@ static int rds_tcp_conn_alloc(struct rds_connection *conn, gfp_t gfp)
|
||||
tc->t_cpath = &conn->c_path[i];
|
||||
|
||||
spin_lock_irq(&rds_tcp_conn_lock);
|
||||
tc->t_tcp_node_detached = false;
|
||||
list_add_tail(&tc->t_tcp_node, &rds_tcp_conn_list);
|
||||
spin_unlock_irq(&rds_tcp_conn_lock);
|
||||
rdsdebug("rds_conn_path [%d] tc %p\n", i,
|
||||
conn->c_path[i].cp_transport_data);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
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);
|
||||
if (ret) {
|
||||
for (j = 0; j < i; j++)
|
||||
rds_tcp_conn_free(conn->c_path[j].cp_transport_data);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool list_has_conn(struct list_head *list, struct rds_connection *conn)
|
||||
|
Loading…
Reference in New Issue
Block a user