linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / net / rose / rose_route.c
index a22542f..8631b65 100644 (file)
@@ -48,6 +48,8 @@ static DEFINE_SPINLOCK(rose_route_list_lock);
 
 struct rose_neigh *rose_loopback_neigh;
 
+static void rose_remove_neigh(struct rose_neigh *);
+
 /*
  *     Add a new route to a node, and in the process add the node and the
  *     neighbour if it is new.
@@ -233,8 +235,11 @@ static void rose_remove_neigh(struct rose_neigh *rose_neigh)
 
        skb_queue_purge(&rose_neigh->queue);
 
+       spin_lock_bh(&rose_neigh_list_lock);
+
        if ((s = rose_neigh_list) == rose_neigh) {
                rose_neigh_list = rose_neigh->next;
+               spin_unlock_bh(&rose_neigh_list_lock);
                kfree(rose_neigh->digipeat);
                kfree(rose_neigh);
                return;
@@ -243,6 +248,7 @@ static void rose_remove_neigh(struct rose_neigh *rose_neigh)
        while (s != NULL && s->next != NULL) {
                if (s->next == rose_neigh) {
                        s->next = rose_neigh->next;
+                       spin_unlock_bh(&rose_neigh_list_lock);
                        kfree(rose_neigh->digipeat);
                        kfree(rose_neigh);
                        return;
@@ -250,6 +256,7 @@ static void rose_remove_neigh(struct rose_neigh *rose_neigh)
 
                s = s->next;
        }
+       spin_unlock_bh(&rose_neigh_list_lock);
 }
 
 /*