summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Horman <simon.horman@netronome.com>2015-03-24 01:31:40 +0100
committerDavid S. Miller <davem@davemloft.net>2015-03-24 19:52:42 +0100
commita6e95cc718c8916a13f1e1e9d33cacbc5db56c0f (patch)
treecff8be6cf13c3e7490bf752fde8f2f01eef32f5b
parentnet: use for_each_netdev_safe() in rtnl_group_changelink() (diff)
downloadlinux-a6e95cc718c8916a13f1e1e9d33cacbc5db56c0f.tar.xz
linux-a6e95cc718c8916a13f1e1e9d33cacbc5db56c0f.zip
rocker: handle non-bridge master change
Master change notifications may occur other than when joining or leaving a bridge, for example when being added to or removed from a bond or Open vSwitch. Previously in those cases rocker_port_bridge_leave() was called which results in a null-pointer dereference as rocker_port->bridge_dev is NULL because there is no bridge device. This patch makes provision for doing nothing in such cases. Fixes: 6c7079450071f ("rocker: implement L2 bridge offloading") Acked-by: Jiri Pirko <jiri@resnulli.us> Acked-by: Scott Feldman <sfeldma@gmail.com> Signed-off-by: Simon Horman <simon.horman@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/rocker/rocker.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/net/ethernet/rocker/rocker.c b/drivers/net/ethernet/rocker/rocker.c
index 9fb6948e14c6..5cecec282aba 100644
--- a/drivers/net/ethernet/rocker/rocker.c
+++ b/drivers/net/ethernet/rocker/rocker.c
@@ -4468,10 +4468,16 @@ static int rocker_port_master_changed(struct net_device *dev)
struct net_device *master = netdev_master_upper_dev_get(dev);
int err = 0;
+ /* There are currently three cases handled here:
+ * 1. Joining a bridge
+ * 2. Leaving a previously joined bridge
+ * 3. Other, e.g. being added to or removed from a bond or openvswitch,
+ * in which case nothing is done
+ */
if (master && master->rtnl_link_ops &&
!strcmp(master->rtnl_link_ops->kind, "bridge"))
err = rocker_port_bridge_join(rocker_port, master);
- else
+ else if (rocker_port_is_bridged(rocker_port))
err = rocker_port_bridge_leave(rocker_port);
return err;