bonding: claim the port device before creating the bonding device
authorFelix Fietkau <nbd@nbd.name>
Tue, 21 Sep 2021 16:04:32 +0000 (18:04 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 21 Sep 2021 16:04:34 +0000 (18:04 +0200)
Avoids create/destroy cycles of the bonding device if the port devices are unavailable

Signed-off-by: Felix Fietkau <nbd@nbd.name>
bonding.c

index 321f819a6f4b9ea0c2845e8a75a76e70840979d5..0bf4f9a331efe3dfd8a0a5105667bf424b3e9eee 100644 (file)
--- a/bonding.c
+++ b/bonding.c
@@ -221,10 +221,6 @@ bonding_enable_port(struct bonding_port *bp)
        if (!bp->present)
                return 0;
 
-       ret = bonding_set_active(bdev, true);
-       if (ret)
-               goto error;
-
        /* Disable IPv6 for bonding ports */
        if (!(bp->dev.dev->settings.flags & DEV_OPT_IPV6)) {
                bp->dev.dev->settings.ipv6 = 0;
@@ -233,7 +229,11 @@ bonding_enable_port(struct bonding_port *bp)
 
        ret = device_claim(&bp->dev);
        if (ret < 0)
-               goto error;
+               return ret;
+
+       ret = bonding_set_active(bdev, true);
+       if (ret)
+               goto release;
 
        dev = bp->dev.dev;
        if (dev->settings.auth && !dev->auth_status)
@@ -257,6 +257,7 @@ error:
        bdev->n_failed++;
        bp->present = false;
        bdev->n_present--;
+release:
        device_release(&bp->dev);
 
        return ret;