bonding: convert queue_id to use the new option API
authorNikolay Aleksandrov <nikolay@redhat.com>
Wed, 22 Jan 2014 13:53:36 +0000 (14:53 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 22 Jan 2014 23:38:44 +0000 (15:38 -0800)
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>
drivers/net/bonding/bond_options.c
drivers/net/bonding/bond_options.h
drivers/net/bonding/bond_sysfs.c

index 2315104de8c00b7a219d2d01ca6f55400a144cd5..8775c724c700127f8395f4e0be374f10f437d1f9 100644 (file)
@@ -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;
+
+}
index 1f486a7d1e14725c2c0091fc27132f50efe1a4fe..396d504214e498398baf93cda32e49dbbf476f16 100644 (file)
@@ -57,6 +57,7 @@ enum {
        BOND_OPT_PRIMARY_RESELECT,
        BOND_OPT_USE_CARRIER,
        BOND_OPT_ACTIVE_SLAVE,
+       BOND_OPT_QUEUE_ID,
        BOND_OPT_LAST
 };
 
@@ -153,4 +154,6 @@ int bond_option_use_carrier_set(struct bonding *bond,
                                struct bond_opt_value *newval);
 int bond_option_active_slave_set(struct bonding *bond,
                                 struct bond_opt_value *newval);
+int bond_option_queue_id_set(struct bonding *bond,
+                            struct bond_opt_value *newval);
 #endif /* _BOND_OPTIONS_H */
index 181a59d7241e0933af97ca32b97a9221633e9a1b..a9cd3f514c8ccf5d4e7fb177902600db4dcdb4d7 100644 (file)
@@ -985,72 +985,15 @@ static ssize_t bonding_store_queue_id(struct device *d,
                                      struct device_attribute *attr,
                                      const char *buffer, size_t count)
 {
-       struct slave *slave, *update_slave;
        struct bonding *bond = to_bond(d);
-       struct list_head *iter;
-       u16 qid;
-       int ret = count;
-       char *delim;
-       struct net_device *sdev = NULL;
-
-       if (!rtnl_trylock())
-               return restart_syscall();
-
-       /* delim will point to queue id if successful */
-       delim = strchr(buffer, ':');
-       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(buffer) > IFNAMSIZ ||
-           !dev_valid_name(buffer) ||
-           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), buffer);
-       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;
+       int ret;
 
-       /* Actually set the qids for the slave */
-       update_slave->queue_id = qid;
+       ret = bond_opt_tryset_rtnl(bond, BOND_OPT_QUEUE_ID, (char *)buffer);
+       if (!ret)
+               ret = count;
 
-out:
-       rtnl_unlock();
        return ret;
-
-err_no_cmd:
-       pr_info("invalid input for queue_id set for %s.\n",
-               bond->dev->name);
-       ret = -EPERM;
-       goto out;
 }
-
 static DEVICE_ATTR(queue_id, S_IRUGO | S_IWUSR, bonding_show_queue_id,
                   bonding_store_queue_id);