bonding: Export skip slave logic to function
authorMaor Gottlieb <maorg@mellanox.com>
Thu, 30 Apr 2020 19:21:32 +0000 (22:21 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 1 May 2020 19:15:37 +0000 (12:15 -0700)
As a preparation for following change that add array of
all slaves, extract code that skip slave to function.

Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Jay Vosburgh <jay.vosburgh@canonical.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/bonding/bond_main.c

index 2e70e43..f7aded0 100644 (file)
@@ -4087,6 +4087,29 @@ err:
        bond_slave_arr_work_rearm(bond, 1);
 }
 
+static void bond_skip_slave(struct bond_up_slave *slaves,
+                           struct slave *skipslave)
+{
+       int idx;
+
+       /* Rare situation where caller has asked to skip a specific
+        * slave but allocation failed (most likely!). BTW this is
+        * only possible when the call is initiated from
+        * __bond_release_one(). In this situation; overwrite the
+        * skipslave entry in the array with the last entry from the
+        * array to avoid a situation where the xmit path may choose
+        * this to-be-skipped slave to send a packet out.
+        */
+       for (idx = 0; slaves && idx < slaves->count; idx++) {
+               if (skipslave == slaves->arr[idx]) {
+                       slaves->arr[idx] =
+                               slaves->arr[slaves->count - 1];
+                       slaves->count--;
+                       break;
+               }
+       }
+}
+
 /* Build the usable slaves array in control path for modes that use xmit-hash
  * to determine the slave interface -
  * (a) BOND_MODE_8023AD
@@ -4156,27 +4179,9 @@ int bond_update_slave_arr(struct bonding *bond, struct slave *skipslave)
        if (old_arr)
                kfree_rcu(old_arr, rcu);
 out:
-       if (ret != 0 && skipslave) {
-               int idx;
-
-               /* Rare situation where caller has asked to skip a specific
-                * slave but allocation failed (most likely!). BTW this is
-                * only possible when the call is initiated from
-                * __bond_release_one(). In this situation; overwrite the
-                * skipslave entry in the array with the last entry from the
-                * array to avoid a situation where the xmit path may choose
-                * this to-be-skipped slave to send a packet out.
-                */
-               old_arr = rtnl_dereference(bond->slave_arr);
-               for (idx = 0; old_arr != NULL && idx < old_arr->count; idx++) {
-                       if (skipslave == old_arr->arr[idx]) {
-                               old_arr->arr[idx] =
-                                   old_arr->arr[old_arr->count-1];
-                               old_arr->count--;
-                               break;
-                       }
-               }
-       }
+       if (ret != 0 && skipslave)
+               bond_skip_slave(rtnl_dereference(bond->slave_arr), skipslave);
+
        return ret;
 }