bonding: convert miimon to use the new option API
authorNikolay Aleksandrov <nikolay@redhat.com>
Wed, 22 Jan 2014 13:53:31 +0000 (14:53 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 22 Jan 2014 23:38:43 +0000 (15:38 -0800)
This patch adds the necessary changes so miimon would use
the new bonding option API. The "default" definition has been removed as
it was 0.

Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bonding/bond_main.c
drivers/net/bonding/bond_netlink.c
drivers/net/bonding/bond_options.c
drivers/net/bonding/bond_options.h
drivers/net/bonding/bond_sysfs.c
drivers/net/bonding/bonding.h

index 8f3f9f046f1c6b62e4e2f5dbef06d213f58472f5..f606e2c3724cc3cf9b66db0c4b411a5daf6fd572 100644 (file)
 /*---------------------------- Module parameters ----------------------------*/
 
 /* monitor all links that often (in milliseconds). <=0 disables monitoring */
-#define BOND_LINK_MON_INTERV   0
 
 static int max_bonds   = BOND_DEFAULT_MAX_BONDS;
 static int tx_queues   = BOND_DEFAULT_TX_QUEUES;
 static int num_peer_notif = 1;
-static int miimon      = BOND_LINK_MON_INTERV;
+static int miimon;
 static int updelay;
 static int downdelay;
 static int use_carrier = 1;
@@ -4046,9 +4045,9 @@ static int bond_check_params(struct bond_params *params)
        }
 
        if (miimon < 0) {
-               pr_warning("Warning: miimon module parameter (%d), not in range 0-%d, so it was reset to %d\n",
-                          miimon, INT_MAX, BOND_LINK_MON_INTERV);
-               miimon = BOND_LINK_MON_INTERV;
+               pr_warning("Warning: miimon module parameter (%d), not in range 0-%d, so it was reset to 0\n",
+                          miimon, INT_MAX);
+               miimon = 0;
        }
 
        if (updelay < 0) {
index 6855f28ac780814317a81cd00648c671ed1f1ab6..64e45c97c24447b076c5b8c13474de39fe87fe45 100644 (file)
@@ -132,7 +132,8 @@ static int bond_changelink(struct net_device *bond_dev,
        if (data[IFLA_BOND_MIIMON]) {
                miimon = nla_get_u32(data[IFLA_BOND_MIIMON]);
 
-               err = bond_option_miimon_set(bond, miimon);
+               bond_opt_initval(&newval, miimon);
+               err = __bond_opt_set(bond, BOND_OPT_MIIMON, &newval);
                if (err)
                        return err;
        }
index 1bd19f1f1af25f4d54d1b5280e68477f5192815b..cb515d94864d704528f0bd07bd98634d437071d7 100644 (file)
@@ -200,6 +200,13 @@ static struct bond_option bond_opts[] = {
                .values = bond_num_peer_notif_tbl,
                .set = bond_option_num_peer_notif_set
        },
+       [BOND_OPT_MIIMON] = {
+               .id = BOND_OPT_MIIMON,
+               .name = "miimon",
+               .desc = "Link check interval in milliseconds",
+               .values = bond_intmax_tbl,
+               .set = bond_option_miimon_set
+       },
        { }
 };
 
@@ -575,16 +582,11 @@ int bond_option_active_slave_set(struct bonding *bond,
        return ret;
 }
 
-int bond_option_miimon_set(struct bonding *bond, int miimon)
+int bond_option_miimon_set(struct bonding *bond, struct bond_opt_value *newval)
 {
-       if (miimon < 0) {
-               pr_err("%s: Invalid miimon value %d not in range %d-%d; rejected.\n",
-                      bond->dev->name, miimon, 0, INT_MAX);
-               return -EINVAL;
-       }
-       pr_info("%s: Setting MII monitoring interval to %d.\n",
-               bond->dev->name, miimon);
-       bond->params.miimon = miimon;
+       pr_info("%s: Setting MII monitoring interval to %llu.\n",
+               bond->dev->name, newval->value);
+       bond->params.miimon = newval->value;
        if (bond->params.updelay)
                pr_info("%s: Note: Updating updelay (to %d) since it is a multiple of the miimon value.\n",
                        bond->dev->name,
@@ -593,7 +595,7 @@ int bond_option_miimon_set(struct bonding *bond, int miimon)
                pr_info("%s: Note: Updating downdelay (to %d) since it is a multiple of the miimon value.\n",
                        bond->dev->name,
                        bond->params.downdelay * bond->params.miimon);
-       if (miimon && bond->params.arp_interval) {
+       if (newval->value && bond->params.arp_interval) {
                pr_info("%s: MII monitoring cannot be used with ARP monitoring. Disabling ARP monitoring...\n",
                        bond->dev->name);
                bond->params.arp_interval = 0;
@@ -606,13 +608,14 @@ int bond_option_miimon_set(struct bonding *bond, int miimon)
                 * timer will get fired off when the open function
                 * is called.
                 */
-               if (!miimon) {
+               if (!newval->value) {
                        cancel_delayed_work_sync(&bond->mii_work);
                } else {
                        cancel_delayed_work_sync(&bond->arp_work);
                        queue_delayed_work(bond->wq, &bond->mii_work, 0);
                }
        }
+
        return 0;
 }
 
index 014a359460e566ade21d688992be18337840a168..90f00c64030c2bb7a7a461d2c5da1072006251d7 100644 (file)
@@ -52,6 +52,7 @@ enum {
        BOND_OPT_MINLINKS,
        BOND_OPT_AD_SELECT,
        BOND_OPT_NUM_PEER_NOTIF,
+       BOND_OPT_MIIMON,
        BOND_OPT_LAST
 };
 
@@ -139,4 +140,5 @@ int bond_option_ad_select_set(struct bonding *bond,
                              struct bond_opt_value *newval);
 int bond_option_num_peer_notif_set(struct bonding *bond,
                                   struct bond_opt_value *newval);
+int bond_option_miimon_set(struct bonding *bond, struct bond_opt_value *newval);
 #endif /* _BOND_OPTIONS_H */
index e1c99db134a9cd2fe28840239492f5637cbb909d..3f6e4d614a474ad2d6d222162bda72bdfac16e1c 100644 (file)
@@ -673,23 +673,13 @@ static ssize_t bonding_store_miimon(struct device *d,
                                    struct device_attribute *attr,
                                    const char *buf, size_t count)
 {
-       int new_value, ret;
        struct bonding *bond = to_bond(d);
+       int ret;
 
-       if (sscanf(buf, "%d", &new_value) != 1) {
-               pr_err("%s: no miimon value specified.\n",
-                      bond->dev->name);
-               return -EINVAL;
-       }
-
-       if (!rtnl_trylock())
-               return restart_syscall();
-
-       ret = bond_option_miimon_set(bond, new_value);
+       ret = bond_opt_tryset_rtnl(bond, BOND_OPT_MIIMON, (char *)buf);
        if (!ret)
                ret = count;
 
-       rtnl_unlock();
        return ret;
 }
 static DEVICE_ATTR(miimon, S_IRUGO | S_IWUSR,
index 4554a16a0f3edf77f7662e034342d034cefffb7d..4d04619593570d286faaa4eab2220fe1027d63b0 100644 (file)
@@ -453,7 +453,6 @@ unsigned int bond_get_num_tx_queues(void);
 int bond_netlink_init(void);
 void bond_netlink_fini(void);
 int bond_option_active_slave_set(struct bonding *bond, struct net_device *slave_dev);
-int bond_option_miimon_set(struct bonding *bond, int miimon);
 int bond_option_use_carrier_set(struct bonding *bond, int use_carrier);
 int bond_option_arp_ip_target_add(struct bonding *bond, __be32 target);
 int bond_option_arp_ip_target_rem(struct bonding *bond, __be32 target);