diff options
Diffstat (limited to 'net/netrom/nr_route.c')
-rw-r--r-- | net/netrom/nr_route.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c index bd2b17b219..70480869ad 100644 --- a/net/netrom/nr_route.c +++ b/net/netrom/nr_route.c @@ -285,14 +285,22 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic, return 0; } -static void nr_remove_node_locked(struct nr_node *nr_node) +static inline void __nr_remove_node(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); @@ -331,7 +339,6 @@ 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) { @@ -345,7 +352,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_locked(nr_node); + nr_remove_node(nr_node); } else { switch (i) { case 0: @@ -360,14 +367,12 @@ 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; |