diff options
author | Nikolay Aleksandrov <nikolay@redhat.com> | 2014-01-22 14:53:36 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-01-22 15:38:44 -0800 |
commit | 24089ba1026a684d64bc0eeb6af634e26c9501c4 (patch) | |
tree | 6e9f4c0539262c56e6f0fb2b0e17a5e01a9e1090 /drivers/net/bonding/bond_options.c | |
parent | d1fbd3ed9366904b58b1c0c30b22d51dc793de99 (diff) | |
download | linux-24089ba1026a684d64bc0eeb6af634e26c9501c4.tar.gz linux-24089ba1026a684d64bc0eeb6af634e26c9501c4.tar.bz2 linux-24089ba1026a684d64bc0eeb6af634e26c9501c4.zip |
bonding: convert queue_id to use the new option API
This patch adds the necessary changes so queue_id would use
the new bonding option API. Also move it to its own set function in
bond_options.c and fix some style errors.
Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/bonding/bond_options.c')
-rw-r--r-- | drivers/net/bonding/bond_options.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c index 2315104de8c0..8775c724c700 100644 --- a/drivers/net/bonding/bond_options.c +++ b/drivers/net/bonding/bond_options.c @@ -254,6 +254,13 @@ static struct bond_option bond_opts[] = { BIT(BOND_MODE_ALB)), .set = bond_option_active_slave_set }, + [BOND_OPT_QUEUE_ID] = { + .id = BOND_OPT_QUEUE_ID, + .name = "queue_id", + .desc = "Set queue id of a slave", + .flags = BOND_OPTFLAG_RAWVAL, + .set = bond_option_queue_id_set + }, { } }; @@ -1130,3 +1137,66 @@ int bond_option_ad_select_set(struct bonding *bond, return 0; } + +int bond_option_queue_id_set(struct bonding *bond, + struct bond_opt_value *newval) +{ + struct slave *slave, *update_slave; + struct net_device *sdev; + struct list_head *iter; + char *delim; + int ret = 0; + u16 qid; + + /* delim will point to queue id if successful */ + delim = strchr(newval->string, ':'); + if (!delim) + goto err_no_cmd; + + /* Terminate string that points to device name and bump it + * up one, so we can read the queue id there. + */ + *delim = '\0'; + if (sscanf(++delim, "%hd\n", &qid) != 1) + goto err_no_cmd; + + /* Check buffer length, valid ifname and queue id */ + if (strlen(newval->string) > IFNAMSIZ || + !dev_valid_name(newval->string) || + qid > bond->dev->real_num_tx_queues) + goto err_no_cmd; + + /* Get the pointer to that interface if it exists */ + sdev = __dev_get_by_name(dev_net(bond->dev), newval->string); + if (!sdev) + goto err_no_cmd; + + /* Search for thes slave and check for duplicate qids */ + update_slave = NULL; + bond_for_each_slave(bond, slave, iter) { + if (sdev == slave->dev) + /* We don't need to check the matching + * slave for dups, since we're overwriting it + */ + update_slave = slave; + else if (qid && qid == slave->queue_id) { + goto err_no_cmd; + } + } + + if (!update_slave) + goto err_no_cmd; + + /* Actually set the qids for the slave */ + update_slave->queue_id = qid; + +out: + return ret; + +err_no_cmd: + pr_info("invalid input for queue_id set for %s.\n", + bond->dev->name); + ret = -EPERM; + goto out; + +} |