diff options
Diffstat (limited to 'drivers/net/team/team.c')
| -rw-r--r-- | drivers/net/team/team.c | 31 |
1 files changed, 7 insertions, 24 deletions
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index afd9d25d1992..6ce3f666d142 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
| @@ -256,17 +256,6 @@ static void __team_option_inst_mark_removed_port(struct team *team, | |||
| 256 | } | 256 | } |
| 257 | } | 257 | } |
| 258 | 258 | ||
| 259 | static bool __team_option_inst_tmp_find(const struct list_head *opts, | ||
| 260 | const struct team_option_inst *needle) | ||
| 261 | { | ||
| 262 | struct team_option_inst *opt_inst; | ||
| 263 | |||
| 264 | list_for_each_entry(opt_inst, opts, tmp_list) | ||
| 265 | if (opt_inst == needle) | ||
| 266 | return true; | ||
| 267 | return false; | ||
| 268 | } | ||
| 269 | |||
| 270 | static int __team_options_register(struct team *team, | 259 | static int __team_options_register(struct team *team, |
| 271 | const struct team_option *option, | 260 | const struct team_option *option, |
| 272 | size_t option_count) | 261 | size_t option_count) |
| @@ -1267,7 +1256,7 @@ static int team_port_add(struct team *team, struct net_device *port_dev, | |||
| 1267 | list_add_tail_rcu(&port->list, &team->port_list); | 1256 | list_add_tail_rcu(&port->list, &team->port_list); |
| 1268 | team_port_enable(team, port); | 1257 | team_port_enable(team, port); |
| 1269 | __team_compute_features(team); | 1258 | __team_compute_features(team); |
| 1270 | __team_port_change_port_added(port, !!netif_carrier_ok(port_dev)); | 1259 | __team_port_change_port_added(port, !!netif_oper_up(port_dev)); |
| 1271 | __team_options_change_check(team); | 1260 | __team_options_change_check(team); |
| 1272 | 1261 | ||
| 1273 | netdev_info(dev, "Port device %s added\n", portname); | 1262 | netdev_info(dev, "Port device %s added\n", portname); |
| @@ -2460,7 +2449,6 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info) | |||
| 2460 | int err = 0; | 2449 | int err = 0; |
| 2461 | int i; | 2450 | int i; |
| 2462 | struct nlattr *nl_option; | 2451 | struct nlattr *nl_option; |
| 2463 | LIST_HEAD(opt_inst_list); | ||
| 2464 | 2452 | ||
| 2465 | rtnl_lock(); | 2453 | rtnl_lock(); |
| 2466 | 2454 | ||
| @@ -2480,6 +2468,7 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info) | |||
| 2480 | struct nlattr *opt_attrs[TEAM_ATTR_OPTION_MAX + 1]; | 2468 | struct nlattr *opt_attrs[TEAM_ATTR_OPTION_MAX + 1]; |
| 2481 | struct nlattr *attr; | 2469 | struct nlattr *attr; |
| 2482 | struct nlattr *attr_data; | 2470 | struct nlattr *attr_data; |
| 2471 | LIST_HEAD(opt_inst_list); | ||
| 2483 | enum team_option_type opt_type; | 2472 | enum team_option_type opt_type; |
| 2484 | int opt_port_ifindex = 0; /* != 0 for per-port options */ | 2473 | int opt_port_ifindex = 0; /* != 0 for per-port options */ |
| 2485 | u32 opt_array_index = 0; | 2474 | u32 opt_array_index = 0; |
| @@ -2584,23 +2573,17 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info) | |||
| 2584 | if (err) | 2573 | if (err) |
| 2585 | goto team_put; | 2574 | goto team_put; |
| 2586 | opt_inst->changed = true; | 2575 | opt_inst->changed = true; |
| 2587 | |||
| 2588 | /* dumb/evil user-space can send us duplicate opt, | ||
| 2589 | * keep only the last one | ||
| 2590 | */ | ||
| 2591 | if (__team_option_inst_tmp_find(&opt_inst_list, | ||
| 2592 | opt_inst)) | ||
| 2593 | continue; | ||
| 2594 | |||
| 2595 | list_add(&opt_inst->tmp_list, &opt_inst_list); | 2576 | list_add(&opt_inst->tmp_list, &opt_inst_list); |
| 2596 | } | 2577 | } |
| 2597 | if (!opt_found) { | 2578 | if (!opt_found) { |
| 2598 | err = -ENOENT; | 2579 | err = -ENOENT; |
| 2599 | goto team_put; | 2580 | goto team_put; |
| 2600 | } | 2581 | } |
| 2601 | } | ||
| 2602 | 2582 | ||
| 2603 | err = team_nl_send_event_options_get(team, &opt_inst_list); | 2583 | err = team_nl_send_event_options_get(team, &opt_inst_list); |
| 2584 | if (err) | ||
| 2585 | break; | ||
| 2586 | } | ||
| 2604 | 2587 | ||
| 2605 | team_put: | 2588 | team_put: |
| 2606 | team_nl_team_put(team); | 2589 | team_nl_team_put(team); |
| @@ -2932,7 +2915,7 @@ static int team_device_event(struct notifier_block *unused, | |||
| 2932 | 2915 | ||
| 2933 | switch (event) { | 2916 | switch (event) { |
| 2934 | case NETDEV_UP: | 2917 | case NETDEV_UP: |
| 2935 | if (netif_carrier_ok(dev)) | 2918 | if (netif_oper_up(dev)) |
| 2936 | team_port_change_check(port, true); | 2919 | team_port_change_check(port, true); |
| 2937 | break; | 2920 | break; |
| 2938 | case NETDEV_DOWN: | 2921 | case NETDEV_DOWN: |
