diff options
Diffstat (limited to 'drivers/infiniband/core/addr.c')
| -rw-r--r-- | drivers/infiniband/core/addr.c | 9 | 
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c index 691276bafd7..e9cf51b1343 100644 --- a/drivers/infiniband/core/addr.c +++ b/drivers/infiniband/core/addr.c @@ -216,7 +216,9 @@ static int addr4_resolve(struct sockaddr_in *src_in,  	neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->dst.dev);  	if (!neigh || !(neigh->nud_state & NUD_VALID)) { +		rcu_read_lock();  		neigh_event_send(dst_get_neighbour(&rt->dst), NULL); +		rcu_read_unlock();  		ret = -ENODATA;  		if (neigh)  			goto release; @@ -274,15 +276,16 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,  		goto put;  	} +	rcu_read_lock();  	neigh = dst_get_neighbour(dst);  	if (!neigh || !(neigh->nud_state & NUD_VALID)) {  		if (neigh)  			neigh_event_send(neigh, NULL);  		ret = -ENODATA; -		goto put; +	} else { +		ret = rdma_copy_addr(addr, dst->dev, neigh->ha);  	} - -	ret = rdma_copy_addr(addr, dst->dev, neigh->ha); +	rcu_read_unlock();  put:  	dst_release(dst);  	return ret;  |