@@ -1293,19 +1293,57 @@ static void bond_upper_dev_unlink(struct bonding *bond, struct slave *slave)
12931293 slave -> dev -> flags &= ~IFF_SLAVE ;
12941294}
12951295
1296- static struct slave * bond_alloc_slave (struct bonding * bond )
1296+ static void slave_kobj_release (struct kobject * kobj )
1297+ {
1298+ struct slave * slave = to_slave (kobj );
1299+ struct bonding * bond = bond_get_bond_by_slave (slave );
1300+
1301+ cancel_delayed_work_sync (& slave -> notify_work );
1302+ if (BOND_MODE (bond ) == BOND_MODE_8023AD )
1303+ kfree (SLAVE_AD_INFO (slave ));
1304+
1305+ kfree (slave );
1306+ }
1307+
1308+ static struct kobj_type slave_ktype = {
1309+ .release = slave_kobj_release ,
1310+ #ifdef CONFIG_SYSFS
1311+ .sysfs_ops = & slave_sysfs_ops ,
1312+ #endif
1313+ };
1314+
1315+ static int bond_kobj_init (struct slave * slave )
1316+ {
1317+ int err ;
1318+
1319+ err = kobject_init_and_add (& slave -> kobj , & slave_ktype ,
1320+ & (slave -> dev -> dev .kobj ), "bonding_slave" );
1321+ if (err )
1322+ kobject_put (& slave -> kobj );
1323+
1324+ return err ;
1325+ }
1326+
1327+ static struct slave * bond_alloc_slave (struct bonding * bond ,
1328+ struct net_device * slave_dev )
12971329{
12981330 struct slave * slave = NULL ;
12991331
13001332 slave = kzalloc (sizeof (* slave ), GFP_KERNEL );
13011333 if (!slave )
13021334 return NULL ;
13031335
1336+ slave -> bond = bond ;
1337+ slave -> dev = slave_dev ;
1338+
1339+ if (bond_kobj_init (slave ))
1340+ return NULL ;
1341+
13041342 if (BOND_MODE (bond ) == BOND_MODE_8023AD ) {
13051343 SLAVE_AD_INFO (slave ) = kzalloc (sizeof (struct ad_slave_info ),
13061344 GFP_KERNEL );
13071345 if (!SLAVE_AD_INFO (slave )) {
1308- kfree ( slave );
1346+ kobject_put ( & slave -> kobj );
13091347 return NULL ;
13101348 }
13111349 }
@@ -1314,17 +1352,6 @@ static struct slave *bond_alloc_slave(struct bonding *bond)
13141352 return slave ;
13151353}
13161354
1317- static void bond_free_slave (struct slave * slave )
1318- {
1319- struct bonding * bond = bond_get_bond_by_slave (slave );
1320-
1321- cancel_delayed_work_sync (& slave -> notify_work );
1322- if (BOND_MODE (bond ) == BOND_MODE_8023AD )
1323- kfree (SLAVE_AD_INFO (slave ));
1324-
1325- kfree (slave );
1326- }
1327-
13281355static void bond_fill_ifbond (struct bonding * bond , struct ifbond * info )
13291356{
13301357 info -> bond_mode = BOND_MODE (bond );
@@ -1508,14 +1535,12 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
15081535 goto err_undo_flags ;
15091536 }
15101537
1511- new_slave = bond_alloc_slave (bond );
1538+ new_slave = bond_alloc_slave (bond , slave_dev );
15121539 if (!new_slave ) {
15131540 res = - ENOMEM ;
15141541 goto err_undo_flags ;
15151542 }
15161543
1517- new_slave -> bond = bond ;
1518- new_slave -> dev = slave_dev ;
15191544 /* Set the new_slave's queue_id to be zero. Queue ID mapping
15201545 * is set via sysfs or module option if desired.
15211546 */
@@ -1837,7 +1862,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
18371862 dev_set_mtu (slave_dev , new_slave -> original_mtu );
18381863
18391864err_free :
1840- bond_free_slave ( new_slave );
1865+ kobject_put ( & new_slave -> kobj );
18411866
18421867err_undo_flags :
18431868 /* Enslave of first slave has failed and we need to fix master's mac */
@@ -2017,7 +2042,7 @@ static int __bond_release_one(struct net_device *bond_dev,
20172042 if (!netif_is_bond_master (slave_dev ))
20182043 slave_dev -> priv_flags &= ~IFF_BONDING ;
20192044
2020- bond_free_slave ( slave );
2045+ kobject_put ( & slave -> kobj );
20212046
20222047 return 0 ;
20232048}
0 commit comments