aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Dichtel <nicolas.dichtel@6wind.com>2014-09-01 10:07:29 -0400
committerDavid S. Miller <davem@davemloft.net>2014-09-02 15:57:04 -0400
commitba9989069f4e426b1e0ed7018eacc9e1ba607095 (patch)
treea31001f42e367eac32e74c69ab2d48e571a14645
parent90c325e3bfe14ef360de6650fa2a2e92685e5cee (diff)
rtnl/do_setlink(): notify when a netdev is modified
Depending on which parameters were updated, the changes were not propagated via the notifier chain and netlink. The new flag has been set only when the change did not cause a call to the notifier chain and/or to the netlink notification functions. Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/core/rtnetlink.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 7d84db3e0597..a6882686ca3a 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1482,6 +1482,8 @@ static int do_set_master(struct net_device *dev, int ifindex)
1482} 1482}
1483 1483
1484#define DO_SETLINK_MODIFIED 0x01 1484#define DO_SETLINK_MODIFIED 0x01
1485/* notify flag means notify + modified. */
1486#define DO_SETLINK_NOTIFY 0x03
1485static int do_setlink(const struct sk_buff *skb, 1487static int do_setlink(const struct sk_buff *skb,
1486 struct net_device *dev, struct ifinfomsg *ifm, 1488 struct net_device *dev, struct ifinfomsg *ifm,
1487 struct nlattr **tb, char *ifname, int status) 1489 struct nlattr **tb, char *ifname, int status)
@@ -1532,7 +1534,7 @@ static int do_setlink(const struct sk_buff *skb,
1532 if (err < 0) 1534 if (err < 0)
1533 goto errout; 1535 goto errout;
1534 1536
1535 status |= DO_SETLINK_MODIFIED; 1537 status |= DO_SETLINK_NOTIFY;
1536 } 1538 }
1537 1539
1538 if (tb[IFLA_ADDRESS]) { 1540 if (tb[IFLA_ADDRESS]) {
@@ -1564,7 +1566,7 @@ static int do_setlink(const struct sk_buff *skb,
1564 1566
1565 if (tb[IFLA_GROUP]) { 1567 if (tb[IFLA_GROUP]) {
1566 dev_set_group(dev, nla_get_u32(tb[IFLA_GROUP])); 1568 dev_set_group(dev, nla_get_u32(tb[IFLA_GROUP]));
1567 status |= DO_SETLINK_MODIFIED; 1569 status |= DO_SETLINK_NOTIFY;
1568 } 1570 }
1569 1571
1570 /* 1572 /*
@@ -1584,7 +1586,7 @@ static int do_setlink(const struct sk_buff *skb,
1584 nla_len(tb[IFLA_IFALIAS])); 1586 nla_len(tb[IFLA_IFALIAS]));
1585 if (err < 0) 1587 if (err < 0)
1586 goto errout; 1588 goto errout;
1587 status |= DO_SETLINK_MODIFIED; 1589 status |= DO_SETLINK_NOTIFY;
1588 } 1590 }
1589 1591
1590 if (tb[IFLA_BROADCAST]) { 1592 if (tb[IFLA_BROADCAST]) {
@@ -1616,7 +1618,7 @@ static int do_setlink(const struct sk_buff *skb,
1616 unsigned long value = nla_get_u32(tb[IFLA_TXQLEN]); 1618 unsigned long value = nla_get_u32(tb[IFLA_TXQLEN]);
1617 1619
1618 if (dev->tx_queue_len ^ value) 1620 if (dev->tx_queue_len ^ value)
1619 status |= DO_SETLINK_MODIFIED; 1621 status |= DO_SETLINK_NOTIFY;
1620 1622
1621 dev->tx_queue_len = value; 1623 dev->tx_queue_len = value;
1622 } 1624 }
@@ -1629,7 +1631,7 @@ static int do_setlink(const struct sk_buff *skb,
1629 1631
1630 write_lock_bh(&dev_base_lock); 1632 write_lock_bh(&dev_base_lock);
1631 if (dev->link_mode ^ value) 1633 if (dev->link_mode ^ value)
1632 status |= DO_SETLINK_MODIFIED; 1634 status |= DO_SETLINK_NOTIFY;
1633 dev->link_mode = value; 1635 dev->link_mode = value;
1634 write_unlock_bh(&dev_base_lock); 1636 write_unlock_bh(&dev_base_lock);
1635 } 1637 }
@@ -1645,7 +1647,7 @@ static int do_setlink(const struct sk_buff *skb,
1645 err = do_setvfinfo(dev, attr); 1647 err = do_setvfinfo(dev, attr);
1646 if (err < 0) 1648 if (err < 0)
1647 goto errout; 1649 goto errout;
1648 status |= DO_SETLINK_MODIFIED; 1650 status |= DO_SETLINK_NOTIFY;
1649 } 1651 }
1650 } 1652 }
1651 err = 0; 1653 err = 0;
@@ -1675,7 +1677,7 @@ static int do_setlink(const struct sk_buff *skb,
1675 err = ops->ndo_set_vf_port(dev, vf, port); 1677 err = ops->ndo_set_vf_port(dev, vf, port);
1676 if (err < 0) 1678 if (err < 0)
1677 goto errout; 1679 goto errout;
1678 status |= DO_SETLINK_MODIFIED; 1680 status |= DO_SETLINK_NOTIFY;
1679 } 1681 }
1680 } 1682 }
1681 err = 0; 1683 err = 0;
@@ -1693,7 +1695,7 @@ static int do_setlink(const struct sk_buff *skb,
1693 err = ops->ndo_set_vf_port(dev, PORT_SELF_VF, port); 1695 err = ops->ndo_set_vf_port(dev, PORT_SELF_VF, port);
1694 if (err < 0) 1696 if (err < 0)
1695 goto errout; 1697 goto errout;
1696 status |= DO_SETLINK_MODIFIED; 1698 status |= DO_SETLINK_NOTIFY;
1697 } 1699 }
1698 1700
1699 if (tb[IFLA_AF_SPEC]) { 1701 if (tb[IFLA_AF_SPEC]) {
@@ -1710,15 +1712,20 @@ static int do_setlink(const struct sk_buff *skb,
1710 if (err < 0) 1712 if (err < 0)
1711 goto errout; 1713 goto errout;
1712 1714
1713 status |= DO_SETLINK_MODIFIED; 1715 status |= DO_SETLINK_NOTIFY;
1714 } 1716 }
1715 } 1717 }
1716 err = 0; 1718 err = 0;
1717 1719
1718errout: 1720errout:
1719 if (err < 0 && status & DO_SETLINK_MODIFIED) 1721 if (status & DO_SETLINK_MODIFIED) {
1720 net_warn_ratelimited("A link change request failed with some changes committed already. Interface %s may have been left with an inconsistent configuration, please check.\n", 1722 if (status & DO_SETLINK_NOTIFY)
1721 dev->name); 1723 netdev_state_change(dev);
1724
1725 if (err < 0)
1726 net_warn_ratelimited("A link change request failed with some changes committed already. Interface %s may have been left with an inconsistent configuration, please check.\n",
1727 dev->name);
1728 }
1722 1729
1723 return err; 1730 return err;
1724} 1731}
@@ -2015,7 +2022,7 @@ replay:
2015 err = ops->changelink(dev, tb, data); 2022 err = ops->changelink(dev, tb, data);
2016 if (err < 0) 2023 if (err < 0)
2017 return err; 2024 return err;
2018 status |= DO_SETLINK_MODIFIED; 2025 status |= DO_SETLINK_NOTIFY;
2019 } 2026 }
2020 2027
2021 if (linkinfo[IFLA_INFO_SLAVE_DATA]) { 2028 if (linkinfo[IFLA_INFO_SLAVE_DATA]) {
@@ -2026,7 +2033,7 @@ replay:
2026 tb, slave_data); 2033 tb, slave_data);
2027 if (err < 0) 2034 if (err < 0)
2028 return err; 2035 return err;
2029 status |= DO_SETLINK_MODIFIED; 2036 status |= DO_SETLINK_NOTIFY;
2030 } 2037 }
2031 2038
2032 return do_setlink(skb, dev, ifm, tb, ifname, status); 2039 return do_setlink(skb, dev, ifm, tb, ifname, status);