@@ -1293,19 +1293,57 @@ static void bond_upper_dev_unlink(struct bonding *bond, struct slave *slave)
1293
1293
slave -> dev -> flags &= ~IFF_SLAVE ;
1294
1294
}
1295
1295
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 )
1297
1329
{
1298
1330
struct slave * slave = NULL ;
1299
1331
1300
1332
slave = kzalloc (sizeof (* slave ), GFP_KERNEL );
1301
1333
if (!slave )
1302
1334
return NULL ;
1303
1335
1336
+ slave -> bond = bond ;
1337
+ slave -> dev = slave_dev ;
1338
+
1339
+ if (bond_kobj_init (slave ))
1340
+ return NULL ;
1341
+
1304
1342
if (BOND_MODE (bond ) == BOND_MODE_8023AD ) {
1305
1343
SLAVE_AD_INFO (slave ) = kzalloc (sizeof (struct ad_slave_info ),
1306
1344
GFP_KERNEL );
1307
1345
if (!SLAVE_AD_INFO (slave )) {
1308
- kfree ( slave );
1346
+ kobject_put ( & slave -> kobj );
1309
1347
return NULL ;
1310
1348
}
1311
1349
}
@@ -1314,17 +1352,6 @@ static struct slave *bond_alloc_slave(struct bonding *bond)
1314
1352
return slave ;
1315
1353
}
1316
1354
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
-
1328
1355
static void bond_fill_ifbond (struct bonding * bond , struct ifbond * info )
1329
1356
{
1330
1357
info -> bond_mode = BOND_MODE (bond );
@@ -1508,14 +1535,12 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
1508
1535
goto err_undo_flags ;
1509
1536
}
1510
1537
1511
- new_slave = bond_alloc_slave (bond );
1538
+ new_slave = bond_alloc_slave (bond , slave_dev );
1512
1539
if (!new_slave ) {
1513
1540
res = - ENOMEM ;
1514
1541
goto err_undo_flags ;
1515
1542
}
1516
1543
1517
- new_slave -> bond = bond ;
1518
- new_slave -> dev = slave_dev ;
1519
1544
/* Set the new_slave's queue_id to be zero. Queue ID mapping
1520
1545
* is set via sysfs or module option if desired.
1521
1546
*/
@@ -1837,7 +1862,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
1837
1862
dev_set_mtu (slave_dev , new_slave -> original_mtu );
1838
1863
1839
1864
err_free :
1840
- bond_free_slave ( new_slave );
1865
+ kobject_put ( & new_slave -> kobj );
1841
1866
1842
1867
err_undo_flags :
1843
1868
/* 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,
2017
2042
if (!netif_is_bond_master (slave_dev ))
2018
2043
slave_dev -> priv_flags &= ~IFF_BONDING ;
2019
2044
2020
- bond_free_slave ( slave );
2045
+ kobject_put ( & slave -> kobj );
2021
2046
2022
2047
return 0 ;
2023
2048
}
0 commit comments