[NET]: Add network namespace clone & unshare support.
This patch allows you to create a new network namespace using sys_clone, or sys_unshare. As the network namespace is still experimental and under development clone and unshare support is only made available when CONFIG_NET_NS is selected at compile time. As this patch introduces network namespace support into code paths that exist when the CONFIG_NET is not selected there are a few additions made to net_namespace.h to allow a few more functions to be used when the networking stack is not compiled in. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
8b41d1887d
commit
9dd776b6d7
@@ -4,6 +4,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/sched.h>
|
||||
#include <net/net_namespace.h>
|
||||
|
||||
/*
|
||||
@@ -32,12 +33,10 @@ void net_unlock(void)
|
||||
mutex_unlock(&net_list_mutex);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static struct net *net_alloc(void)
|
||||
{
|
||||
return kmem_cache_alloc(net_cachep, GFP_KERNEL);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void net_free(struct net *net)
|
||||
{
|
||||
@@ -128,6 +127,46 @@ out_undo:
|
||||
goto out;
|
||||
}
|
||||
|
||||
struct net *copy_net_ns(unsigned long flags, struct net *old_net)
|
||||
{
|
||||
struct net *new_net = NULL;
|
||||
int err;
|
||||
|
||||
get_net(old_net);
|
||||
|
||||
if (!(flags & CLONE_NEWNET))
|
||||
return old_net;
|
||||
|
||||
#ifndef CONFIG_NET_NS
|
||||
return ERR_PTR(-EINVAL);
|
||||
#endif
|
||||
|
||||
err = -ENOMEM;
|
||||
new_net = net_alloc();
|
||||
if (!new_net)
|
||||
goto out;
|
||||
|
||||
mutex_lock(&net_mutex);
|
||||
err = setup_net(new_net);
|
||||
if (err)
|
||||
goto out_unlock;
|
||||
|
||||
net_lock();
|
||||
list_add_tail(&new_net->list, &net_namespace_list);
|
||||
net_unlock();
|
||||
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&net_mutex);
|
||||
out:
|
||||
put_net(old_net);
|
||||
if (err) {
|
||||
net_free(new_net);
|
||||
new_net = ERR_PTR(err);
|
||||
}
|
||||
return new_net;
|
||||
}
|
||||
|
||||
static int __init net_ns_init(void)
|
||||
{
|
||||
int err;
|
||||
|
Reference in New Issue
Block a user