diff options
Diffstat (limited to 'net/netrom/nr_route.c')
| -rw-r--r-- | net/netrom/nr_route.c | 19 | 
1 files changed, 7 insertions, 12 deletions
diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c index 70480869ad1c..bd2b17b219ae 100644 --- a/net/netrom/nr_route.c +++ b/net/netrom/nr_route.c @@ -285,22 +285,14 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,  	return 0;  } -static inline void __nr_remove_node(struct nr_node *nr_node) +static void nr_remove_node_locked(struct nr_node *nr_node)  { +	lockdep_assert_held(&nr_node_list_lock); +  	hlist_del_init(&nr_node->node_node);  	nr_node_put(nr_node);  } -#define nr_remove_node_locked(__node) \ -	__nr_remove_node(__node) - -static void nr_remove_node(struct nr_node *nr_node) -{ -	spin_lock_bh(&nr_node_list_lock); -	__nr_remove_node(nr_node); -	spin_unlock_bh(&nr_node_list_lock); -} -  static inline void __nr_remove_neigh(struct nr_neigh *nr_neigh)  {  	hlist_del_init(&nr_neigh->neigh_node); @@ -339,6 +331,7 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n  		return -EINVAL;  	} +	spin_lock_bh(&nr_node_list_lock);  	nr_node_lock(nr_node);  	for (i = 0; i < nr_node->count; i++) {  		if (nr_node->routes[i].neighbour == nr_neigh) { @@ -352,7 +345,7 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n  			nr_node->count--;  			if (nr_node->count == 0) { -				nr_remove_node(nr_node); +				nr_remove_node_locked(nr_node);  			} else {  				switch (i) {  				case 0: @@ -367,12 +360,14 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n  				nr_node_put(nr_node);  			}  			nr_node_unlock(nr_node); +			spin_unlock_bh(&nr_node_list_lock);  			return 0;  		}  	}  	nr_neigh_put(nr_neigh);  	nr_node_unlock(nr_node); +	spin_unlock_bh(&nr_node_list_lock);  	nr_node_put(nr_node);  	return -EINVAL;  |