diff options
author | Alexey Dobriyan <adobriyan@gmail.com> | 2009-05-04 11:12:14 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-05-04 11:12:14 -0700 |
commit | 088eb2d905de9518dad913995bb8aef493d4a7c5 (patch) | |
tree | efdd299b3d87cafe05b77ddaa4ecc032c2e27262 /net/core/net_namespace.c | |
parent | 4a84822c60afa2b0e2d3370041f69f9526a34757 (diff) | |
download | lwn-088eb2d905de9518dad913995bb8aef493d4a7c5.tar.gz lwn-088eb2d905de9518dad913995bb8aef493d4a7c5.zip |
netns 2/2: extract net_create()
net_create() will be used by C/R to create fresh netns on restart.
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Acked-by: Serge Hallyn <serue@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/net_namespace.c')
-rw-r--r-- | net/core/net_namespace.c | 44 |
1 files changed, 20 insertions, 24 deletions
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 4488010d5a52..6b3edc9e6f19 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -115,38 +115,34 @@ static void net_free(struct net *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; - int err; - - if (!(flags & CLONE_NEWNET)) - return get_net(old_net); - - err = -ENOMEM; - new_net = net_alloc(); - if (!new_net) - goto out_err; + struct net *net; + int rv; + net = net_alloc(); + if (!net) + return ERR_PTR(-ENOMEM); mutex_lock(&net_mutex); - err = setup_net(new_net); - if (!err) { + rv = setup_net(net); + if (rv == 0) { rtnl_lock(); - list_add_tail(&new_net->list, &net_namespace_list); + list_add_tail(&net->list, &net_namespace_list); rtnl_unlock(); } mutex_unlock(&net_mutex); + if (rv < 0) { + net_free(net); + return ERR_PTR(rv); + } + return net; +} - if (err) - goto out_free; -out: - return new_net; - -out_free: - net_free(new_net); -out_err: - new_net = ERR_PTR(err); - goto out; +struct net *copy_net_ns(unsigned long flags, struct net *old_net) +{ + if (!(flags & CLONE_NEWNET)) + return get_net(old_net); + return net_create(); } static void cleanup_net(struct work_struct *work) |