On Tue, Sep 22, 2015 at 02:38:45PM +0200, Stanislav Kinsburskiy wrote: > > > 22.09.2015 13:28, Andrew Vagin пишет: > >On Tue, Sep 22, 2015 at 01:20:11PM +0200, Stanislav Kinsburskiy wrote: > >> > >>22.09.2015 13:15, Andrew Vagin пишет: > >>>On Tue, Sep 22, 2015 at 11:40:03AM +0200, Stanislav Kinsburskiy wrote: > >>>>22.09.2015 11:36, Andrew Vagin пишет: > >>>>>On Mon, Sep 21, 2015 at 07:44:31PM +0400, Stanislav Kinsburskiy wrote: > >>>>>>From: Stanislav Kinsburskiy <skinsbur...@parallels.com> > >>>>>> > >>>>>>This functions are mostly duplicating existent code in per-net hooks, > >>>>>>except > >>>>>>some initialization and locking, which are performed in rtnetlink layer. > >>>>>> > >>>>>>https://jira.sw.ru/browse/PSBM-23441 > >>>>>> > >>>>>>Signed-off-by: Stanislav Kinsburskiy <skinsbur...@parallels.com> > >>>>>>--- > >>>>>> drivers/net/venetdev.c | 49 > >>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++ > >>>>>> 1 file changed, 49 insertions(+) > >>>>>> > >>>>>>diff --git a/drivers/net/venetdev.c b/drivers/net/venetdev.c > >>>>>>index 50b3c91..261be76 100644 > >>>>>>--- a/drivers/net/venetdev.c > >>>>>>+++ b/drivers/net/venetdev.c > >>>>>>@@ -749,6 +749,53 @@ static void venet_setup(struct net_device *dev) > >>>>>> SET_ETHTOOL_OPS(dev, &venet_ethtool_ops); > >>>>>> } > >>>>>>+static void venet_dellink(struct net_device *dev, struct list_head > >>>>>>*head) > >>>>>>+{ > >>>>>>+ struct ve_struct *env = dev->nd_net->owner_ve; > >>>>>>+ > >>>>>>+ venet_ext_clean(env); > >>>>>>+ veip_stop(env); > >>>>>>+ > >>>>>>+ env->_venet_dev = NULL; > >>>>>>+ unregister_netdevice_queue(dev, head); > >>>>>>+} > >>>>>>+ > >>>>>>+static int venet_newlink(struct net *src_net, struct net_device *dev, > >>>>>>+ struct nlattr *tb[], struct nlattr *data[]) > >>>>>>+{ > >>>>>>+ struct ve_struct *env = src_net->owner_ve; > >>>>>>+ int err; > >>>>>>+ > >>>>>>+ if (env->ve_netns && src_net != env->ve_netns) { > >>>>>>+ /* Don't create venet-s in sub net namespaces */ > >>>>>>+ return 0; > >>>Are you sure that we can return 0 here? Looks like EEXIST. > >> > >>It's a former logic, so I preserved it. > >>Introduced by Andrew Vagin here: > >>4504338aaf4c7deb2285fc192ddfebf711f10129 > >I don't return 0 from venet_newlink... > > Makes sense. Should I return -ENOTSUPP?
ENOTSUPP maybe even better that EEXIST > > > > >>>>>>+ } > >>>>>>+ > >>>>>>+ if (env->veip) > >>>>>Where is env->veip set to NULL, when venet is removed? > >>>>> > >>>>This is missing, thanks. I'll add. > >>>> > >>>>>>+ return -EEXIST; > >>>>>>+ > >>>>>>+ env->ve_netns = src_net; > >>>>>Why do we set ve_netns here? > >>>>To prevent venet creation in nested network namespaces within containers. > >>>> > >>>>>>+ > >>>>>>+ err = veip_start(env); > >>>>>>+ if (err) > >>>>>>+ goto err; > >>>>>>+ > >>>>>>+ dev->features |= NETIF_F_NETNS_LOCAL; > >>>>>>+ > >>>>>>+ err = register_netdevice(dev); > >>>>>>+ if (err) > >>>>>>+ goto err_stop; > >>>>>>+ > >>>>>>+ env->_venet_dev = dev; > >>>>>>+ return 0; > >>>>>>+ > >>>>>>+err_stop: > >>>>>>+ veip_stop(env); > >>>>>>+err: > >>>>>>+ env->ve_netns = NULL; > >>>>>>+ return err; > >>>>>>+} > >>>>>>+ > >>>>>> #ifdef CONFIG_PROC_FS > >>>>>> static void veaddr_seq_print(struct seq_file *m, struct ve_struct *ve) > >>>>>> { > >>>>>>@@ -1207,6 +1254,8 @@ static const struct nla_policy > >>>>>>venet_policy[VENET_INFO_MAX + 1] = { > >>>>>> static struct rtnl_link_ops venet_link_ops = { > >>>>>> .kind = "venet", > >>>>>> .priv_size = sizeof(struct veip_struct), > >>>>>>+ .newlink = venet_newlink, > >>>>>>+ .dellink = venet_dellink, > >>>>>> .setup = venet_setup, > >>>>>> .changelink = venet_changelink, > >>>>>> .policy = venet_policy, > >>>>>> > >>>>>>_______________________________________________ > >>>>>>Devel mailing list > >>>>>>Devel@openvz.org > >>>>>>https://lists.openvz.org/mailman/listinfo/devel > _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel