diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-15 10:33:07 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-15 10:33:07 -0500 |
commit | f6866fecd6fd8e44a6715da09844a4fd1b8484da (patch) | |
tree | a166c399ddb37a48035589ffda29ef05d236c4b4 /net/core/rtnetlink.c | |
parent | 4ee29f6a52158cea526b16a44ae38643946103ec (diff) | |
parent | 997b37da1515c1620692521786a74af271664eb7 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (82 commits)
[NET]: Make sure sockets implement splice_read
netconsole: avoid null pointer dereference at show_local_mac()
[IPV6]: Fix reversed local_df test in ip6_fragment
[XFRM]: Avoid bogus BUG() when throwing new policy away.
[AF_KEY]: Fix bug in spdadd
[NETFILTER] nf_conntrack_proto_tcp.c: Mistyped state corrected.
net: xfrm statistics depend on INET
[NETFILTER]: make secmark_tg_destroy() static
[INET]: Unexport inet_listen_wlock
[INET]: Unexport __inet_hash_connect
[NET]: Improve cache line coherency of ingress qdisc
[NET]: Fix race in dev_close(). (Bug 9750)
[IPSEC]: Fix bogus usage of u64 on input sequence number
[RTNETLINK]: Send a single notification on device state changes.
[NETLABLE]: Hide netlbl_unlabel_audit_addr6 under ifdef CONFIG_IPV6.
[NETLABEL]: Don't produce unused variables when IPv6 is off.
[NETLABEL]: Compilation for CONFIG_AUDIT=n case.
[GENETLINK]: Relax dances with genl_lock.
[NETLABEL]: Fix lookup logic of netlbl_domhsh_search_def.
[IPV6]: remove unused method declaration (net/ndisc.h).
...
Diffstat (limited to 'net/core/rtnetlink.c')
-rw-r--r-- | net/core/rtnetlink.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 61ac8d06292c..ecb02afd52dc 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -504,7 +504,7 @@ int rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst, u32 id, | |||
504 | 504 | ||
505 | EXPORT_SYMBOL_GPL(rtnl_put_cacheinfo); | 505 | EXPORT_SYMBOL_GPL(rtnl_put_cacheinfo); |
506 | 506 | ||
507 | static void set_operstate(struct net_device *dev, unsigned char transition) | 507 | static int set_operstate(struct net_device *dev, unsigned char transition, bool send_notification) |
508 | { | 508 | { |
509 | unsigned char operstate = dev->operstate; | 509 | unsigned char operstate = dev->operstate; |
510 | 510 | ||
@@ -527,8 +527,12 @@ static void set_operstate(struct net_device *dev, unsigned char transition) | |||
527 | write_lock_bh(&dev_base_lock); | 527 | write_lock_bh(&dev_base_lock); |
528 | dev->operstate = operstate; | 528 | dev->operstate = operstate; |
529 | write_unlock_bh(&dev_base_lock); | 529 | write_unlock_bh(&dev_base_lock); |
530 | netdev_state_change(dev); | 530 | |
531 | } | 531 | if (send_notification) |
532 | netdev_state_change(dev); | ||
533 | return 1; | ||
534 | } else | ||
535 | return 0; | ||
532 | } | 536 | } |
533 | 537 | ||
534 | static void copy_rtnl_link_stats(struct rtnl_link_stats *a, | 538 | static void copy_rtnl_link_stats(struct rtnl_link_stats *a, |
@@ -822,6 +826,7 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | |||
822 | if (tb[IFLA_BROADCAST]) { | 826 | if (tb[IFLA_BROADCAST]) { |
823 | nla_memcpy(dev->broadcast, tb[IFLA_BROADCAST], dev->addr_len); | 827 | nla_memcpy(dev->broadcast, tb[IFLA_BROADCAST], dev->addr_len); |
824 | send_addr_notify = 1; | 828 | send_addr_notify = 1; |
829 | modified = 1; | ||
825 | } | 830 | } |
826 | 831 | ||
827 | if (ifm->ifi_flags || ifm->ifi_change) { | 832 | if (ifm->ifi_flags || ifm->ifi_change) { |
@@ -834,16 +839,23 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | |||
834 | dev_change_flags(dev, flags); | 839 | dev_change_flags(dev, flags); |
835 | } | 840 | } |
836 | 841 | ||
837 | if (tb[IFLA_TXQLEN]) | 842 | if (tb[IFLA_TXQLEN]) { |
838 | dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]); | 843 | if (dev->tx_queue_len != nla_get_u32(tb[IFLA_TXQLEN])) { |
844 | dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]); | ||
845 | modified = 1; | ||
846 | } | ||
847 | } | ||
839 | 848 | ||
840 | if (tb[IFLA_OPERSTATE]) | 849 | if (tb[IFLA_OPERSTATE]) |
841 | set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE])); | 850 | modified |= set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE]), false); |
842 | 851 | ||
843 | if (tb[IFLA_LINKMODE]) { | 852 | if (tb[IFLA_LINKMODE]) { |
844 | write_lock_bh(&dev_base_lock); | 853 | if (dev->link_mode != nla_get_u8(tb[IFLA_LINKMODE])) { |
845 | dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]); | 854 | write_lock_bh(&dev_base_lock); |
846 | write_unlock_bh(&dev_base_lock); | 855 | dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]); |
856 | write_lock_bh(&dev_base_lock); | ||
857 | modified = 1; | ||
858 | } | ||
847 | } | 859 | } |
848 | 860 | ||
849 | err = 0; | 861 | err = 0; |
@@ -857,6 +869,10 @@ errout: | |||
857 | 869 | ||
858 | if (send_addr_notify) | 870 | if (send_addr_notify) |
859 | call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); | 871 | call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); |
872 | |||
873 | if (modified) | ||
874 | netdev_state_change(dev); | ||
875 | |||
860 | return err; | 876 | return err; |
861 | } | 877 | } |
862 | 878 | ||
@@ -974,7 +990,7 @@ struct net_device *rtnl_create_link(struct net *net, char *ifname, | |||
974 | if (tb[IFLA_TXQLEN]) | 990 | if (tb[IFLA_TXQLEN]) |
975 | dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]); | 991 | dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]); |
976 | if (tb[IFLA_OPERSTATE]) | 992 | if (tb[IFLA_OPERSTATE]) |
977 | set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE])); | 993 | set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE]), true); |
978 | if (tb[IFLA_LINKMODE]) | 994 | if (tb[IFLA_LINKMODE]) |
979 | dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]); | 995 | dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]); |
980 | 996 | ||