Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / net / bridge / br_fdb.c
index e6c2200..3a73b8c 100644 (file)
@@ -23,7 +23,7 @@
 #include <asm/atomic.h>
 #include "br_private.h"
 
-static kmem_cache_t *br_fdb_cache;
+static kmem_cache_t *br_fdb_cache __read_mostly;
 static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
                      const unsigned char *addr);
 
@@ -86,8 +86,8 @@ void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr)
                                struct net_bridge_port *op;
                                list_for_each_entry(op, &br->port_list, list) {
                                        if (op != p && 
-                                           !memcmp(op->dev->dev_addr,
-                                                   f->addr.addr, ETH_ALEN)) {
+                                           !compare_ether_addr(op->dev->dev_addr,
+                                                               f->addr.addr)) {
                                                f->dst = op;
                                                goto insert;
                                        }
@@ -151,8 +151,8 @@ void br_fdb_delete_by_port(struct net_bridge *br, struct net_bridge_port *p)
                                struct net_bridge_port *op;
                                list_for_each_entry(op, &br->port_list, list) {
                                        if (op != p && 
-                                           !memcmp(op->dev->dev_addr,
-                                                   f->addr.addr, ETH_ALEN)) {
+                                           !compare_ether_addr(op->dev->dev_addr,
+                                                               f->addr.addr)) {
                                                f->dst = op;
                                                goto skip_delete;
                                        }
@@ -174,7 +174,7 @@ struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
        struct net_bridge_fdb_entry *fdb;
 
        hlist_for_each_entry_rcu(fdb, h, &br->hash[br_mac_hash(addr)], hlist) {
-               if (!memcmp(fdb->addr.addr, addr, ETH_ALEN)) {
+               if (!compare_ether_addr(fdb->addr.addr, addr)) {
                        if (unlikely(has_expired(br, fdb)))
                                break;
                        return fdb;
@@ -264,7 +264,7 @@ static inline struct net_bridge_fdb_entry *fdb_find(struct hlist_head *head,
        struct net_bridge_fdb_entry *fdb;
 
        hlist_for_each_entry_rcu(fdb, h, head, hlist) {
-               if (!memcmp(fdb->addr.addr, addr, ETH_ALEN))
+               if (!compare_ether_addr(fdb->addr.addr, addr))
                        return fdb;
        }
        return NULL;
@@ -341,7 +341,6 @@ 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 */
@@ -356,13 +355,12 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
                        fdb->ageing_timer = jiffies;
                }
        } else {
-               spin_lock_bh(&br->hash_lock);
+               spin_lock(&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_bh(&br->hash_lock);
+               spin_unlock(&br->hash_lock);
        }
-       rcu_read_unlock();
 }