team: allow to send multiple set events in one message

When multiple sets are done, event message is generated for each. This
patch accumulates these messages into one.

Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Jiri Pirko 2012-06-19 05:54:20 +00:00 committed by David S. Miller
parent 35b384bd14
commit 2fcdb2c9e6
1 changed files with 9 additions and 24 deletions

View File

@ -320,8 +320,6 @@ static void __team_options_unregister(struct team *team,
}
static void __team_options_change_check(struct team *team);
static void __team_option_inst_change(struct team *team,
struct team_option_inst *opt_inst);
int team_options_register(struct team *team,
const struct team_option *option,
@ -360,16 +358,9 @@ static int team_option_set(struct team *team,
struct team_option_inst *opt_inst,
struct team_gsetter_ctx *ctx)
{
int err;
if (!opt_inst->option->setter)
return -EOPNOTSUPP;
err = opt_inst->option->setter(team, ctx);
if (err)
return err;
__team_option_inst_change(team, opt_inst);
return err;
return opt_inst->option->setter(team, ctx);
}
void team_option_inst_set_change(struct team_option_inst_info *opt_inst_info)
@ -1750,12 +1741,16 @@ static int team_nl_cmd_options_get(struct sk_buff *skb, struct genl_info *info)
return err;
}
static int team_nl_send_event_options_get(struct team *team,
struct list_head *sel_opt_inst_list);
static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info)
{
struct team *team;
int err = 0;
int i;
struct nlattr *nl_option;
LIST_HEAD(opt_inst_list);
team = team_nl_team_get(info);
if (!team)
@ -1867,6 +1862,8 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info)
err = team_option_set(team, opt_inst, &ctx);
if (err)
goto team_put;
opt_inst->changed = true;
list_add(&opt_inst->tmp_list, &opt_inst_list);
}
if (!opt_found) {
err = -ENOENT;
@ -1874,6 +1871,8 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info)
}
}
err = team_nl_send_event_options_get(team, &opt_inst_list);
team_put:
team_nl_team_put(team);
@ -2074,20 +2073,6 @@ static void __team_options_change_check(struct team *team)
err);
}
static void __team_option_inst_change(struct team *team,
struct team_option_inst *sel_opt_inst)
{
int err;
LIST_HEAD(sel_opt_inst_list);
sel_opt_inst->changed = true;
list_add(&sel_opt_inst->tmp_list, &sel_opt_inst_list);
err = team_nl_send_event_options_get(team, &sel_opt_inst_list);
if (err)
netdev_warn(team->dev, "Failed to send option change via netlink (err %d)\n",
err);
}
/* rtnl lock is held */
static void __team_port_change_check(struct team_port *port, bool linkup)
{