Comments
Patch
@@ -107,7 +107,8 @@ static void destroy_nbp(struct net_bridge_port *p)
p->dev = NULL;
dev_put(dev);
- kobject_put(&p->kobj);
+ if (dev_net(dev) == &init_net)
+ kobject_put(&p->kobj);
}
static void destroy_nbp_rcu(struct rcu_head *head)
@@ -148,7 +149,8 @@ static void del_nbp(struct net_bridge_port *p)
rcu_assign_pointer(dev->br_port, NULL);
kobject_uevent(&p->kobj, KOBJ_REMOVE);
- kobject_del(&p->kobj);
+ if (dev_net(br->dev) == &init_net)
+ kobject_del(&p->kobj);
call_rcu(&p->rcu, destroy_nbp_rcu);
}
@@ -164,7 +166,9 @@ static void del_br(struct net_bridge *br)
del_timer_sync(&br->gc_timer);
- br_sysfs_delbr(br->dev);
+ if (dev_net(br->dev) == &init_net)
+ br_sysfs_delbr(br->dev);
+
unregister_netdevice(br->dev);
}
@@ -283,6 +287,9 @@ int br_add_bridge(struct net *net, const char *name)
if (ret)
goto out_free;
+ if (dev_net(dev) != &init_net)
+ goto out;
+
ret = br_sysfs_addbr(dev);
if (ret)
unregister_netdevice(dev);
@@ -387,18 +394,22 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
if (err)
goto put_back;
- err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj),
- SYSFS_BRIDGE_PORT_ATTR);
- if (err)
- goto err0;
+ if (dev_net(br->dev) == &init_net) {
+ err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj),
+ SYSFS_BRIDGE_PORT_ATTR);
+ if (err)
+ goto err0;
+ }
err = br_fdb_insert(br, p, dev->dev_addr);
if (err)
goto err1;
- err = br_sysfs_addif(p);
- if (err)
- goto err2;
+ if (dev_net(br->dev) == &init_net) {
+ err = br_sysfs_addif(p);
+ if (err)
+ goto err2;
+ }
rcu_assign_pointer(dev->br_port, p);
dev_disable_lro(dev);
@@ -424,7 +435,8 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
err2:
br_fdb_delete_by_port(br, p, 1);
err1:
- kobject_del(&p->kobj);
+ if (dev_net(br->dev) == &init_net)
+ kobject_del(&p->kobj);
err0:
dev_set_promiscuity(dev, -1);
put_back: