Fri, Apr 12, 2019 at 03:04:10PM CEST, s...@queasysnail.net wrote: >When a bond is enslaved to another bond, bond_netdev_event() only >handles the event as if the bond is a master, and skips treating the >bond as a slave. > >This leads to a refcount leak on the slave, since we don't remove the >adjacency to its master and the master holds a reference on the slave. > >Reproducer: > ip link add bondL type bond > ip link add bondU type bond > ip link set bondL master bondU > ip link del bondL
Out of curiosity, what is a usecase of stacked bonds? I don't see any. > >No "Fixes:" tag, this code is older than git history. > >Signed-off-by: Sabrina Dubroca <s...@queasysnail.net> >--- >I also spotted some lockdep warnings when I started stacking random >devices on top of random devices, I'm trying to clean that up too, but >this fix is independent of that. > > drivers/net/bonding/bond_main.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > >diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c >index b59708c35faf..ee610721098e 100644 >--- a/drivers/net/bonding/bond_main.c >+++ b/drivers/net/bonding/bond_main.c >@@ -3213,8 +3213,12 @@ static int bond_netdev_event(struct notifier_block >*this, > return NOTIFY_DONE; > > if (event_dev->flags & IFF_MASTER) { >+ int ret; >+ > netdev_dbg(event_dev, "IFF_MASTER\n"); >- return bond_master_netdev_event(event, event_dev); >+ ret = bond_master_netdev_event(event, event_dev); >+ if (ret != NOTIFY_DONE) >+ return ret; > } > > if (event_dev->flags & IFF_SLAVE) { >-- >2.21.0 >