summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2021-09-21 18:04:32 +0200
committerFelix Fietkau <nbd@nbd.name>2021-09-21 18:04:34 +0200
commit08e954e137ffcf7770200bbd6476dc36bbd326f5 (patch)
tree6d1d657a27147b0629fee25e2518af730450dd25
parent06d11bbf1f2b61dcdb1b7088eec539fcd00b28a0 (diff)
downloadnetifd-08e954e137ffcf7770200bbd6476dc36bbd326f5.tar.gz
bonding: claim the port device before creating the bonding device
Avoids create/destroy cycles of the bonding device if the port devices are unavailable Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r--bonding.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/bonding.c b/bonding.c
index 321f819..0bf4f9a 100644
--- 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;