diff options
author | Jiri Pirko <jpirko@redhat.com> | 2012-06-26 06:52:46 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-06-26 21:09:39 -0700 |
commit | 52a4fd77808662a16cd17ad3b0e1ad75e0162d8b (patch) | |
tree | cc0303069053fe0f15f4b0e0e6c652216895eb66 | |
parent | 122bb046bcfb8f3d2d94d9f7f6b74da187a740f2 (diff) |
team: do not allow to map disabled ports
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/team/team.c | 5 | ||||
-rw-r--r-- | drivers/net/team/team_mode_loadbalance.c | 3 | ||||
-rw-r--r-- | include/linux/if_team.h | 2 |
3 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 6b4cf6eca23..5350eeaa22c 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c @@ -614,8 +614,6 @@ static int team_change_mode(struct team *team, const char *kind) * Rx path frame handler ************************/ -static bool team_port_enabled(struct team_port *port); - /* note: already called with rcu_read_lock */ static rx_handler_result_t team_handle_frame(struct sk_buff **pskb) { @@ -673,10 +671,11 @@ static bool team_port_find(const struct team *team, return false; } -static bool team_port_enabled(struct team_port *port) +bool team_port_enabled(struct team_port *port) { return port->index != -1; } +EXPORT_SYMBOL(team_port_enabled); /* * Enable/disable port by adding to enabled port hashlist and setting diff --git a/drivers/net/team/team_mode_loadbalance.c b/drivers/net/team/team_mode_loadbalance.c index c92fa02d6a6..51a4b199c75 100644 --- a/drivers/net/team/team_mode_loadbalance.c +++ b/drivers/net/team/team_mode_loadbalance.c @@ -359,7 +359,8 @@ static int lb_tx_hash_to_port_mapping_set(struct team *team, unsigned char hash = ctx->info->array_index; list_for_each_entry(port, &team->port_list, list) { - if (ctx->data.u32_val == port->dev->ifindex) { + if (ctx->data.u32_val == port->dev->ifindex && + team_port_enabled(port)) { rcu_assign_pointer(LB_HTPM_PORT_BY_HASH(lb_priv, hash), port); return 0; diff --git a/include/linux/if_team.h b/include/linux/if_team.h index c1938869191..e636a54e7a7 100644 --- a/include/linux/if_team.h +++ b/include/linux/if_team.h @@ -64,6 +64,8 @@ struct team_port { long mode_priv[0]; }; +extern bool team_port_enabled(struct team_port *port); + struct team_mode_ops { int (*init)(struct team *team); void (*exit)(struct team *team); |