Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs pile #2 from Al Viro: "Next pile (and there'll be one or two more). The large piece in this one is getting rid of /proc/*/ns/* weirdness; among other things, it allows to (finally) make nameidata completely opaque outside of fs/namei.c, making for easier further cleanups in there" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: coda_venus_readdir(): use file_inode() fs/namei.c: fold link_path_walk() call into path_init() path_init(): don't bother with LOOKUP_PARENT in argument fs/namei.c: new helper (path_cleanup()) path_init(): store the "base" pointer to file in nameidata itself make default ->i_fop have ->open() fail with ENXIO make nameidata completely opaque outside of fs/namei.c kill proc_ns completely take the targets of /proc/*/ns/* symlinks to separate fs bury struct proc_ns in fs/proc copy address of proc_ns_ops into ns_common new helpers: ns_alloc_inum/ns_free_inum make proc_ns_operations work with struct ns_common * instead of void * switch the rest of proc_ns_operations to working with &...->ns netns: switch ->get()/->put()/->install()/->inum() to working with &net->ns make mntns ->get()/->put()/->install()/->inum() work with &mnt_ns->ns common object embedded into various struct ....ns
This commit is contained in:
@@ -337,17 +337,17 @@ EXPORT_SYMBOL_GPL(__put_net);
|
||||
|
||||
struct net *get_net_ns_by_fd(int fd)
|
||||
{
|
||||
struct proc_ns *ei;
|
||||
struct file *file;
|
||||
struct ns_common *ns;
|
||||
struct net *net;
|
||||
|
||||
file = proc_ns_fget(fd);
|
||||
if (IS_ERR(file))
|
||||
return ERR_CAST(file);
|
||||
|
||||
ei = get_proc_ns(file_inode(file));
|
||||
if (ei->ns_ops == &netns_operations)
|
||||
net = get_net(ei->ns);
|
||||
ns = get_proc_ns(file_inode(file));
|
||||
if (ns->ops == &netns_operations)
|
||||
net = get_net(container_of(ns, struct net, ns));
|
||||
else
|
||||
net = ERR_PTR(-EINVAL);
|
||||
|
||||
@@ -386,12 +386,15 @@ EXPORT_SYMBOL_GPL(get_net_ns_by_pid);
|
||||
|
||||
static __net_init int net_ns_net_init(struct net *net)
|
||||
{
|
||||
return proc_alloc_inum(&net->proc_inum);
|
||||
#ifdef CONFIG_NET_NS
|
||||
net->ns.ops = &netns_operations;
|
||||
#endif
|
||||
return ns_alloc_inum(&net->ns);
|
||||
}
|
||||
|
||||
static __net_exit void net_ns_net_exit(struct net *net)
|
||||
{
|
||||
proc_free_inum(net->proc_inum);
|
||||
ns_free_inum(&net->ns);
|
||||
}
|
||||
|
||||
static struct pernet_operations __net_initdata net_ns_ops = {
|
||||
@@ -629,7 +632,7 @@ void unregister_pernet_device(struct pernet_operations *ops)
|
||||
EXPORT_SYMBOL_GPL(unregister_pernet_device);
|
||||
|
||||
#ifdef CONFIG_NET_NS
|
||||
static void *netns_get(struct task_struct *task)
|
||||
static struct ns_common *netns_get(struct task_struct *task)
|
||||
{
|
||||
struct net *net = NULL;
|
||||
struct nsproxy *nsproxy;
|
||||
@@ -640,17 +643,22 @@ static void *netns_get(struct task_struct *task)
|
||||
net = get_net(nsproxy->net_ns);
|
||||
task_unlock(task);
|
||||
|
||||
return net;
|
||||
return net ? &net->ns : NULL;
|
||||
}
|
||||
|
||||
static void netns_put(void *ns)
|
||||
static inline struct net *to_net_ns(struct ns_common *ns)
|
||||
{
|
||||
put_net(ns);
|
||||
return container_of(ns, struct net, ns);
|
||||
}
|
||||
|
||||
static int netns_install(struct nsproxy *nsproxy, void *ns)
|
||||
static void netns_put(struct ns_common *ns)
|
||||
{
|
||||
struct net *net = ns;
|
||||
put_net(to_net_ns(ns));
|
||||
}
|
||||
|
||||
static int netns_install(struct nsproxy *nsproxy, struct ns_common *ns)
|
||||
{
|
||||
struct net *net = to_net_ns(ns);
|
||||
|
||||
if (!ns_capable(net->user_ns, CAP_SYS_ADMIN) ||
|
||||
!ns_capable(current_user_ns(), CAP_SYS_ADMIN))
|
||||
@@ -661,18 +669,11 @@ static int netns_install(struct nsproxy *nsproxy, void *ns)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int netns_inum(void *ns)
|
||||
{
|
||||
struct net *net = ns;
|
||||
return net->proc_inum;
|
||||
}
|
||||
|
||||
const struct proc_ns_operations netns_operations = {
|
||||
.name = "net",
|
||||
.type = CLONE_NEWNET,
|
||||
.get = netns_get,
|
||||
.put = netns_put,
|
||||
.install = netns_install,
|
||||
.inum = netns_inum,
|
||||
};
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user