bond: Be more careful about adding and removing netdevs in the monitor.
authorBen Pfaff <blp@nicira.com>
Thu, 21 Apr 2011 23:34:51 +0000 (16:34 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 21 Apr 2011 23:34:51 +0000 (16:34 -0700)
The code was careless about updating the netdev_monitor.  Newly added
slaves weren't added to the monitor until the next bond_reconfigure() call,
and netdevs were never removed from the monitor.

lib/bond.c

index 4d7d05ab39028e43ff04778237ecefed5551f21f..ed6ed89b887f17ba2300e116c18c6c4f5e240914 100644 (file)
@@ -369,7 +369,16 @@ bond_slave_register(struct bond *bond, void *slave_, uint16_t stb_id,
         bond->bond_revalidate = true;
     }
 
-    slave->netdev = netdev;
+    if (slave->netdev != netdev) {
+        if (bond->monitor) {
+            if (slave->netdev) {
+                netdev_monitor_remove(bond->monitor, slave->netdev);
+            }
+            netdev_monitor_add(bond->monitor, netdev);
+        }
+        slave->netdev = netdev;
+    }
+
     free(slave->name);
     slave->name = xstrdup(netdev_get_name(netdev));
 }
@@ -388,6 +397,10 @@ bond_slave_unregister(struct bond *bond, const void *slave_)
         return;
     }
 
+    if (bond->monitor) {
+        netdev_monitor_remove(bond->monitor, slave->netdev);
+    }
+
     bond_enable_slave(slave, false, NULL);
 
     del_active = bond->active_slave == slave;