@@ -1233,11 +1233,12 @@ static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb)
1233
1233
}
1234
1234
1235
1235
static int bond_master_upper_dev_link (struct net_device * bond_dev ,
1236
- struct net_device * slave_dev )
1236
+ struct net_device * slave_dev ,
1237
+ struct slave * slave )
1237
1238
{
1238
1239
int err ;
1239
1240
1240
- err = netdev_master_upper_dev_link (slave_dev , bond_dev );
1241
+ err = netdev_master_upper_dev_link_private (slave_dev , bond_dev , slave );
1241
1242
if (err )
1242
1243
return err ;
1243
1244
slave_dev -> flags |= IFF_SLAVE ;
@@ -1413,17 +1414,11 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1413
1414
}
1414
1415
}
1415
1416
1416
- res = bond_master_upper_dev_link (bond_dev , slave_dev );
1417
- if (res ) {
1418
- pr_debug ("Error %d calling bond_master_upper_dev_link\n" , res );
1419
- goto err_restore_mac ;
1420
- }
1421
-
1422
1417
/* open the slave since the application closed it */
1423
1418
res = dev_open (slave_dev );
1424
1419
if (res ) {
1425
1420
pr_debug ("Opening slave %s failed\n" , slave_dev -> name );
1426
- goto err_unset_master ;
1421
+ goto err_restore_mac ;
1427
1422
}
1428
1423
1429
1424
new_slave -> bond = bond ;
@@ -1637,6 +1632,13 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1637
1632
goto err_dest_symlinks ;
1638
1633
}
1639
1634
1635
+ res = bond_master_upper_dev_link (bond_dev , slave_dev , new_slave );
1636
+ if (res ) {
1637
+ pr_debug ("Error %d calling bond_master_upper_dev_link\n" , res );
1638
+ goto err_unregister ;
1639
+ }
1640
+
1641
+
1640
1642
pr_info ("%s: enslaving %s as a%s interface with a%s link.\n" ,
1641
1643
bond_dev -> name , slave_dev -> name ,
1642
1644
bond_is_active_slave (new_slave ) ? "n active" : " backup" ,
@@ -1646,6 +1648,9 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1646
1648
return 0 ;
1647
1649
1648
1650
/* Undo stages on error */
1651
+ err_unregister :
1652
+ netdev_rx_handler_unregister (slave_dev );
1653
+
1649
1654
err_dest_symlinks :
1650
1655
bond_destroy_slave_symlinks (bond_dev , slave_dev );
1651
1656
@@ -1675,9 +1680,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1675
1680
slave_dev -> priv_flags &= ~IFF_BONDING ;
1676
1681
dev_close (slave_dev );
1677
1682
1678
- err_unset_master :
1679
- bond_upper_dev_unlink (bond_dev , slave_dev );
1680
-
1681
1683
err_restore_mac :
1682
1684
if (!bond -> params .fail_over_mac ) {
1683
1685
/* XXX TODO - fom follow mode needs to change master's
@@ -1748,6 +1750,8 @@ static int __bond_release_one(struct net_device *bond_dev,
1748
1750
}
1749
1751
1750
1752
write_unlock_bh (& bond -> lock );
1753
+
1754
+ bond_upper_dev_unlink (bond_dev , slave_dev );
1751
1755
/* unregister rx_handler early so bond_handle_frame wouldn't be called
1752
1756
* for this slave anymore.
1753
1757
*/
@@ -1866,8 +1870,6 @@ static int __bond_release_one(struct net_device *bond_dev,
1866
1870
bond_hw_addr_flush (bond_dev , slave_dev );
1867
1871
}
1868
1872
1869
- bond_upper_dev_unlink (bond_dev , slave_dev );
1870
-
1871
1873
slave_disable_netpoll (slave );
1872
1874
1873
1875
/* close slave before restoring its mac address */
0 commit comments