aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/team/team.c
diff options
context:
space:
mode:
authorJiri Pirko <jpirko@redhat.com>2012-06-19 01:54:19 -0400
committerDavid S. Miller <davem@davemloft.net>2012-06-19 18:00:24 -0400
commit35b384bd14f91c74e358e02969ee7bb2542e6d78 (patch)
tree16769a147cbd78d620e9d6fcbe62c89660570132 /drivers/net/team/team.c
parent9b00cf2d1024d683cb2e206109e356dcac968568 (diff)
team: ensure correct order of netlink messages delivery
currently, when port is created and per-port options are present, there options are sent to userspace with ifindex of port which userspace does not know about. Port add message goes right after. This patch corrects message ordering so userspace would not be confused. Signed-off-by: Jiri Pirko <jpirko@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/team/team.c')
-rw-r--r--drivers/net/team/team.c25
1 files changed, 5 insertions, 20 deletions
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
index 9e9d3e57a2f6..a7b391dfb3b0 100644
--- a/drivers/net/team/team.c
+++ b/drivers/net/team/team.c
@@ -347,24 +347,6 @@ void team_options_unregister(struct team *team,
347} 347}
348EXPORT_SYMBOL(team_options_unregister); 348EXPORT_SYMBOL(team_options_unregister);
349 349
350static int team_option_port_add(struct team *team, struct team_port *port)
351{
352 int err;
353
354 err = __team_option_inst_add_port(team, port);
355 if (err)
356 return err;
357 __team_options_change_check(team);
358 return 0;
359}
360
361static void team_option_port_del(struct team *team, struct team_port *port)
362{
363 __team_option_inst_mark_removed_port(team, port);
364 __team_options_change_check(team);
365 __team_option_inst_del_port(team, port);
366}
367
368static int team_option_get(struct team *team, 350static int team_option_get(struct team *team,
369 struct team_option_inst *opt_inst, 351 struct team_option_inst *opt_inst,
370 struct team_gsetter_ctx *ctx) 352 struct team_gsetter_ctx *ctx)
@@ -891,7 +873,7 @@ static int team_port_add(struct team *team, struct net_device *port_dev)
891 goto err_handler_register; 873 goto err_handler_register;
892 } 874 }
893 875
894 err = team_option_port_add(team, port); 876 err = __team_option_inst_add_port(team, port);
895 if (err) { 877 if (err) {
896 netdev_err(dev, "Device %s failed to add per-port options\n", 878 netdev_err(dev, "Device %s failed to add per-port options\n",
897 portname); 879 portname);
@@ -904,6 +886,7 @@ static int team_port_add(struct team *team, struct net_device *port_dev)
904 team_adjust_ops(team); 886 team_adjust_ops(team);
905 __team_compute_features(team); 887 __team_compute_features(team);
906 __team_port_change_check(port, !!netif_carrier_ok(port_dev)); 888 __team_port_change_check(port, !!netif_carrier_ok(port_dev));
889 __team_options_change_check(team);
907 890
908 netdev_info(dev, "Port device %s added\n", portname); 891 netdev_info(dev, "Port device %s added\n", portname);
909 892
@@ -947,12 +930,14 @@ static int team_port_del(struct team *team, struct net_device *port_dev)
947 return -ENOENT; 930 return -ENOENT;
948 } 931 }
949 932
933 __team_option_inst_mark_removed_port(team, port);
934 __team_options_change_check(team);
935 __team_option_inst_del_port(team, port);
950 port->removed = true; 936 port->removed = true;
951 __team_port_change_check(port, false); 937 __team_port_change_check(port, false);
952 team_port_disable(team, port); 938 team_port_disable(team, port);
953 list_del_rcu(&port->list); 939 list_del_rcu(&port->list);
954 team_adjust_ops(team); 940 team_adjust_ops(team);
955 team_option_port_del(team, port);
956 netdev_rx_handler_unregister(port_dev); 941 netdev_rx_handler_unregister(port_dev);
957 netdev_set_master(port_dev, NULL); 942 netdev_set_master(port_dev, NULL);
958 vlan_vids_del_by_dev(port_dev, dev); 943 vlan_vids_del_by_dev(port_dev, dev);