In do_setlink the device changes are atomic and notifications will be sent at the end of the function once if any modification occured and once if address has been changed. Signed-off-by: Laszlo Attila Toth <panther@xxxxxxxxxx> --- net/core/rtnetlink.c | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 4756d58..53af13f 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -819,6 +819,7 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, if (tb[IFLA_BROADCAST]) { nla_memcpy(dev->broadcast, tb[IFLA_BROADCAST], dev->addr_len); send_addr_notify = 1; + modified = 1; } if (ifm->ifi_flags || ifm->ifi_change) { @@ -829,21 +830,35 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, flags = (flags & ifm->ifi_change) | (dev->flags & ~ifm->ifi_change); dev_change_flags(dev, flags); + modified = 1; } - if (tb[IFLA_TXQLEN]) + if (tb[IFLA_TXQLEN]) { + write_lock_bh(&dev_base_lock); dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]); + write_unlock_bh(&dev_base_lock); + modified = 1; + } - if (tb[IFLA_WEIGHT]) + if (tb[IFLA_WEIGHT]) { + write_lock_bh(&dev_base_lock); dev->weight = nla_get_u32(tb[IFLA_WEIGHT]); + write_unlock_bh(&dev_base_lock); + modified = 1; + } - if (tb[IFLA_OPERSTATE]) + if (tb[IFLA_OPERSTATE]) { + write_lock_bh(&dev_base_lock); set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE])); + write_unlock_bh(&dev_base_lock); + modified = 1; + } if (tb[IFLA_LINKMODE]) { write_lock_bh(&dev_base_lock); dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]); write_unlock_bh(&dev_base_lock); + modified = 1; } err = 0; @@ -857,6 +872,8 @@ errout: if (send_addr_notify) call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); + if (modified) + rtmsg_ifinfo(RTM_NEWLINK, dev, 0); return err; } -- 1.5.2.5 - To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html