Commit 088eb2d9 authored by Alexey Dobriyan's avatar Alexey Dobriyan Committed by David S. Miller

netns 2/2: extract net_create()

net_create() will be used by C/R to create fresh netns on restart.
Signed-off-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
Acked-by: default avatarSerge Hallyn <serue@us.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4a84822c
...@@ -115,38 +115,34 @@ static void net_free(struct net *net) ...@@ -115,38 +115,34 @@ static void net_free(struct net *net)
kmem_cache_free(net_cachep, net); kmem_cache_free(net_cachep, net);
} }
struct net *copy_net_ns(unsigned long flags, struct net *old_net) static struct net *net_create(void)
{ {
struct net *new_net = NULL; struct net *net;
int err; int rv;
if (!(flags & CLONE_NEWNET))
return get_net(old_net);
err = -ENOMEM;
new_net = net_alloc();
if (!new_net)
goto out_err;
net = net_alloc();
if (!net)
return ERR_PTR(-ENOMEM);
mutex_lock(&net_mutex); mutex_lock(&net_mutex);
err = setup_net(new_net); rv = setup_net(net);
if (!err) { if (rv == 0) {
rtnl_lock(); rtnl_lock();
list_add_tail(&new_net->list, &net_namespace_list); list_add_tail(&net->list, &net_namespace_list);
rtnl_unlock(); rtnl_unlock();
} }
mutex_unlock(&net_mutex); mutex_unlock(&net_mutex);
if (rv < 0) {
net_free(net);
return ERR_PTR(rv);
}
return net;
}
if (err) struct net *copy_net_ns(unsigned long flags, struct net *old_net)
goto out_free; {
out: if (!(flags & CLONE_NEWNET))
return new_net; return get_net(old_net);
return net_create();
out_free:
net_free(new_net);
out_err:
new_net = ERR_PTR(err);
goto out;
} }
static void cleanup_net(struct work_struct *work) static void cleanup_net(struct work_struct *work)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment