|
@@ -55,8 +55,8 @@ static ssize_t bonding_show_bonds(struct class *cls,
|
|
|
struct class_attribute *attr,
|
|
|
char *buf)
|
|
|
{
|
|
|
- struct net *net = current->nsproxy->net_ns;
|
|
|
- struct bond_net *bn = net_generic(net, bond_net_id);
|
|
|
+ struct bond_net *bn =
|
|
|
+ container_of(attr, struct bond_net, class_attr_bonding_masters);
|
|
|
int res = 0;
|
|
|
struct bonding *bond;
|
|
|
|
|
@@ -79,9 +79,8 @@ static ssize_t bonding_show_bonds(struct class *cls,
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
-static struct net_device *bond_get_by_name(struct net *net, const char *ifname)
|
|
|
+static struct net_device *bond_get_by_name(struct bond_net *bn, const char *ifname)
|
|
|
{
|
|
|
- struct bond_net *bn = net_generic(net, bond_net_id);
|
|
|
struct bonding *bond;
|
|
|
|
|
|
list_for_each_entry(bond, &bn->dev_list, bond_list) {
|
|
@@ -103,7 +102,8 @@ static ssize_t bonding_store_bonds(struct class *cls,
|
|
|
struct class_attribute *attr,
|
|
|
const char *buffer, size_t count)
|
|
|
{
|
|
|
- struct net *net = current->nsproxy->net_ns;
|
|
|
+ struct bond_net *bn =
|
|
|
+ container_of(attr, struct bond_net, class_attr_bonding_masters);
|
|
|
char command[IFNAMSIZ + 1] = {0, };
|
|
|
char *ifname;
|
|
|
int rv, res = count;
|
|
@@ -116,7 +116,7 @@ static ssize_t bonding_store_bonds(struct class *cls,
|
|
|
|
|
|
if (command[0] == '+') {
|
|
|
pr_info("%s is being created...\n", ifname);
|
|
|
- rv = bond_create(net, ifname);
|
|
|
+ rv = bond_create(bn->net, ifname);
|
|
|
if (rv) {
|
|
|
if (rv == -EEXIST)
|
|
|
pr_info("%s already exists.\n", ifname);
|
|
@@ -128,7 +128,7 @@ static ssize_t bonding_store_bonds(struct class *cls,
|
|
|
struct net_device *bond_dev;
|
|
|
|
|
|
rtnl_lock();
|
|
|
- bond_dev = bond_get_by_name(net, ifname);
|
|
|
+ bond_dev = bond_get_by_name(bn, ifname);
|
|
|
if (bond_dev) {
|
|
|
pr_info("%s is being deleted...\n", ifname);
|
|
|
unregister_netdevice(bond_dev);
|
|
@@ -150,9 +150,24 @@ err_no_cmd:
|
|
|
return -EPERM;
|
|
|
}
|
|
|
|
|
|
+static const void *bonding_namespace(struct class *cls,
|
|
|
+ const struct class_attribute *attr)
|
|
|
+{
|
|
|
+ const struct bond_net *bn =
|
|
|
+ container_of(attr, struct bond_net, class_attr_bonding_masters);
|
|
|
+ return bn->net;
|
|
|
+}
|
|
|
+
|
|
|
/* class attribute for bond_masters file. This ends up in /sys/class/net */
|
|
|
-static CLASS_ATTR(bonding_masters, S_IWUSR | S_IRUGO,
|
|
|
- bonding_show_bonds, bonding_store_bonds);
|
|
|
+static const struct class_attribute class_attr_bonding_masters = {
|
|
|
+ .attr = {
|
|
|
+ .name = "bonding_masters",
|
|
|
+ .mode = S_IWUSR | S_IRUGO,
|
|
|
+ },
|
|
|
+ .show = bonding_show_bonds,
|
|
|
+ .store = bonding_store_bonds,
|
|
|
+ .namespace = bonding_namespace,
|
|
|
+};
|
|
|
|
|
|
int bond_create_slave_symlinks(struct net_device *master,
|
|
|
struct net_device *slave)
|
|
@@ -1655,11 +1670,13 @@ static struct attribute_group bonding_group = {
|
|
|
* Initialize sysfs. This sets up the bonding_masters file in
|
|
|
* /sys/class/net.
|
|
|
*/
|
|
|
-int bond_create_sysfs(void)
|
|
|
+int bond_create_sysfs(struct bond_net *bn)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- ret = netdev_class_create_file(&class_attr_bonding_masters);
|
|
|
+ bn->class_attr_bonding_masters = class_attr_bonding_masters;
|
|
|
+
|
|
|
+ ret = netdev_class_create_file(&bn->class_attr_bonding_masters);
|
|
|
/*
|
|
|
* Permit multiple loads of the module by ignoring failures to
|
|
|
* create the bonding_masters sysfs file. Bonding devices
|
|
@@ -1673,7 +1690,7 @@ int bond_create_sysfs(void)
|
|
|
*/
|
|
|
if (ret == -EEXIST) {
|
|
|
/* Is someone being kinky and naming a device bonding_master? */
|
|
|
- if (__dev_get_by_name(&init_net,
|
|
|
+ if (__dev_get_by_name(bn->net,
|
|
|
class_attr_bonding_masters.attr.name))
|
|
|
pr_err("network device named %s already exists in sysfs",
|
|
|
class_attr_bonding_masters.attr.name);
|
|
@@ -1687,9 +1704,9 @@ int bond_create_sysfs(void)
|
|
|
/*
|
|
|
* Remove /sys/class/net/bonding_masters.
|
|
|
*/
|
|
|
-void bond_destroy_sysfs(void)
|
|
|
+void bond_destroy_sysfs(struct bond_net *bn)
|
|
|
{
|
|
|
- netdev_class_remove_file(&class_attr_bonding_masters);
|
|
|
+ netdev_class_remove_file(&bn->class_attr_bonding_masters);
|
|
|
}
|
|
|
|
|
|
/*
|