linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / net / bridge / br_fdb.c
index 3a73b8c..1f08a59 100644 (file)
@@ -341,6 +341,7 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
        if (hold_time(br) == 0)
                return;
 
+       rcu_read_lock();
        fdb = fdb_find(head, addr);
        if (likely(fdb)) {
                /* attempt to update an entry for a local interface */
@@ -355,12 +356,13 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
                        fdb->ageing_timer = jiffies;
                }
        } else {
-               spin_lock(&br->hash_lock);
+               spin_lock_bh(&br->hash_lock);
                if (!fdb_find(head, addr))
                        fdb_create(head, source, addr, 0);
                /* else  we lose race and someone else inserts
                 * it first, don't bother updating
                 */
-               spin_unlock(&br->hash_lock);
+               spin_unlock_bh(&br->hash_lock);
        }
+       rcu_read_unlock();
 }