diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/Makefile | 2 | ||||
| -rw-r--r-- | net/core/net_namespace.c | 39 | ||||
| -rw-r--r-- | net/nonet.c | 26 | ||||
| -rw-r--r-- | net/socket.c | 19 |
4 files changed, 20 insertions, 66 deletions
diff --git a/net/Makefile b/net/Makefile index 95fc694e4ddc..38704bdf941a 100644 --- a/net/Makefile +++ b/net/Makefile | |||
| @@ -5,8 +5,6 @@ | |||
| 5 | # Rewritten to use lists instead of if-statements. | 5 | # Rewritten to use lists instead of if-statements. |
| 6 | # | 6 | # |
| 7 | 7 | ||
| 8 | obj-y := nonet.o | ||
| 9 | |||
| 10 | obj-$(CONFIG_NET) := socket.o core/ | 8 | obj-$(CONFIG_NET) := socket.o core/ |
| 11 | 9 | ||
| 12 | tmp-$(CONFIG_COMPAT) := compat.o | 10 | tmp-$(CONFIG_COMPAT) := compat.o |
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 7f155175bba8..ce780c722e48 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
| @@ -337,17 +337,17 @@ EXPORT_SYMBOL_GPL(__put_net); | |||
| 337 | 337 | ||
| 338 | struct net *get_net_ns_by_fd(int fd) | 338 | struct net *get_net_ns_by_fd(int fd) |
| 339 | { | 339 | { |
| 340 | struct proc_ns *ei; | ||
| 341 | struct file *file; | 340 | struct file *file; |
| 341 | struct ns_common *ns; | ||
| 342 | struct net *net; | 342 | struct net *net; |
| 343 | 343 | ||
| 344 | file = proc_ns_fget(fd); | 344 | file = proc_ns_fget(fd); |
| 345 | if (IS_ERR(file)) | 345 | if (IS_ERR(file)) |
| 346 | return ERR_CAST(file); | 346 | return ERR_CAST(file); |
| 347 | 347 | ||
| 348 | ei = get_proc_ns(file_inode(file)); | 348 | ns = get_proc_ns(file_inode(file)); |
| 349 | if (ei->ns_ops == &netns_operations) | 349 | if (ns->ops == &netns_operations) |
| 350 | net = get_net(ei->ns); | 350 | net = get_net(container_of(ns, struct net, ns)); |
| 351 | else | 351 | else |
| 352 | net = ERR_PTR(-EINVAL); | 352 | net = ERR_PTR(-EINVAL); |
| 353 | 353 | ||
| @@ -386,12 +386,15 @@ EXPORT_SYMBOL_GPL(get_net_ns_by_pid); | |||
| 386 | 386 | ||
| 387 | static __net_init int net_ns_net_init(struct net *net) | 387 | static __net_init int net_ns_net_init(struct net *net) |
| 388 | { | 388 | { |
| 389 | return proc_alloc_inum(&net->proc_inum); | 389 | #ifdef CONFIG_NET_NS |
| 390 | net->ns.ops = &netns_operations; | ||
| 391 | #endif | ||
| 392 | return ns_alloc_inum(&net->ns); | ||
| 390 | } | 393 | } |
| 391 | 394 | ||
| 392 | static __net_exit void net_ns_net_exit(struct net *net) | 395 | static __net_exit void net_ns_net_exit(struct net *net) |
| 393 | { | 396 | { |
| 394 | proc_free_inum(net->proc_inum); | 397 | ns_free_inum(&net->ns); |
| 395 | } | 398 | } |
| 396 | 399 | ||
| 397 | static struct pernet_operations __net_initdata net_ns_ops = { | 400 | static struct pernet_operations __net_initdata net_ns_ops = { |
| @@ -629,7 +632,7 @@ void unregister_pernet_device(struct pernet_operations *ops) | |||
| 629 | EXPORT_SYMBOL_GPL(unregister_pernet_device); | 632 | EXPORT_SYMBOL_GPL(unregister_pernet_device); |
| 630 | 633 | ||
| 631 | #ifdef CONFIG_NET_NS | 634 | #ifdef CONFIG_NET_NS |
| 632 | static void *netns_get(struct task_struct *task) | 635 | static struct ns_common *netns_get(struct task_struct *task) |
| 633 | { | 636 | { |
| 634 | struct net *net = NULL; | 637 | struct net *net = NULL; |
| 635 | struct nsproxy *nsproxy; | 638 | struct nsproxy *nsproxy; |
| @@ -640,17 +643,22 @@ static void *netns_get(struct task_struct *task) | |||
| 640 | net = get_net(nsproxy->net_ns); | 643 | net = get_net(nsproxy->net_ns); |
| 641 | task_unlock(task); | 644 | task_unlock(task); |
| 642 | 645 | ||
| 643 | return net; | 646 | return net ? &net->ns : NULL; |
| 644 | } | 647 | } |
| 645 | 648 | ||
| 646 | static void netns_put(void *ns) | 649 | static inline struct net *to_net_ns(struct ns_common *ns) |
| 647 | { | 650 | { |
| 648 | put_net(ns); | 651 | return container_of(ns, struct net, ns); |
| 649 | } | 652 | } |
| 650 | 653 | ||
| 651 | static int netns_install(struct nsproxy *nsproxy, void *ns) | 654 | static void netns_put(struct ns_common *ns) |
| 652 | { | 655 | { |
| 653 | struct net *net = ns; | 656 | put_net(to_net_ns(ns)); |
| 657 | } | ||
| 658 | |||
| 659 | static int netns_install(struct nsproxy *nsproxy, struct ns_common *ns) | ||
| 660 | { | ||
| 661 | struct net *net = to_net_ns(ns); | ||
| 654 | 662 | ||
| 655 | if (!ns_capable(net->user_ns, CAP_SYS_ADMIN) || | 663 | if (!ns_capable(net->user_ns, CAP_SYS_ADMIN) || |
| 656 | !ns_capable(current_user_ns(), CAP_SYS_ADMIN)) | 664 | !ns_capable(current_user_ns(), CAP_SYS_ADMIN)) |
| @@ -661,18 +669,11 @@ static int netns_install(struct nsproxy *nsproxy, void *ns) | |||
| 661 | return 0; | 669 | return 0; |
| 662 | } | 670 | } |
| 663 | 671 | ||
| 664 | static unsigned int netns_inum(void *ns) | ||
| 665 | { | ||
| 666 | struct net *net = ns; | ||
| 667 | return net->proc_inum; | ||
| 668 | } | ||
| 669 | |||
| 670 | const struct proc_ns_operations netns_operations = { | 672 | const struct proc_ns_operations netns_operations = { |
| 671 | .name = "net", | 673 | .name = "net", |
| 672 | .type = CLONE_NEWNET, | 674 | .type = CLONE_NEWNET, |
| 673 | .get = netns_get, | 675 | .get = netns_get, |
| 674 | .put = netns_put, | 676 | .put = netns_put, |
| 675 | .install = netns_install, | 677 | .install = netns_install, |
| 676 | .inum = netns_inum, | ||
| 677 | }; | 678 | }; |
| 678 | #endif | 679 | #endif |
diff --git a/net/nonet.c b/net/nonet.c deleted file mode 100644 index b1a73fda9c12..000000000000 --- a/net/nonet.c +++ /dev/null | |||
| @@ -1,26 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * net/nonet.c | ||
| 3 | * | ||
| 4 | * Dummy functions to allow us to configure network support entirely | ||
| 5 | * out of the kernel. | ||
| 6 | * | ||
| 7 | * Distributed under the terms of the GNU GPL version 2. | ||
| 8 | * Copyright (c) Matthew Wilcox 2003 | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/module.h> | ||
| 12 | #include <linux/errno.h> | ||
| 13 | #include <linux/fs.h> | ||
| 14 | #include <linux/init.h> | ||
| 15 | #include <linux/kernel.h> | ||
| 16 | |||
| 17 | static int sock_no_open(struct inode *irrelevant, struct file *dontcare) | ||
| 18 | { | ||
| 19 | return -ENXIO; | ||
| 20 | } | ||
| 21 | |||
| 22 | const struct file_operations bad_sock_fops = { | ||
| 23 | .owner = THIS_MODULE, | ||
| 24 | .open = sock_no_open, | ||
| 25 | .llseek = noop_llseek, | ||
| 26 | }; | ||
diff --git a/net/socket.c b/net/socket.c index 8809afccf7fa..70bbde65e4ca 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -113,7 +113,6 @@ unsigned int sysctl_net_busy_read __read_mostly; | |||
| 113 | unsigned int sysctl_net_busy_poll __read_mostly; | 113 | unsigned int sysctl_net_busy_poll __read_mostly; |
| 114 | #endif | 114 | #endif |
| 115 | 115 | ||
| 116 | static int sock_no_open(struct inode *irrelevant, struct file *dontcare); | ||
| 117 | static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov, | 116 | static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov, |
| 118 | unsigned long nr_segs, loff_t pos); | 117 | unsigned long nr_segs, loff_t pos); |
| 119 | static ssize_t sock_aio_write(struct kiocb *iocb, const struct iovec *iov, | 118 | static ssize_t sock_aio_write(struct kiocb *iocb, const struct iovec *iov, |
| @@ -151,7 +150,6 @@ static const struct file_operations socket_file_ops = { | |||
| 151 | .compat_ioctl = compat_sock_ioctl, | 150 | .compat_ioctl = compat_sock_ioctl, |
| 152 | #endif | 151 | #endif |
| 153 | .mmap = sock_mmap, | 152 | .mmap = sock_mmap, |
| 154 | .open = sock_no_open, /* special open code to disallow open via /proc */ | ||
| 155 | .release = sock_close, | 153 | .release = sock_close, |
| 156 | .fasync = sock_fasync, | 154 | .fasync = sock_fasync, |
| 157 | .sendpage = sock_sendpage, | 155 | .sendpage = sock_sendpage, |
| @@ -559,23 +557,6 @@ static struct socket *sock_alloc(void) | |||
| 559 | return sock; | 557 | return sock; |
| 560 | } | 558 | } |
| 561 | 559 | ||
| 562 | /* | ||
| 563 | * In theory you can't get an open on this inode, but /proc provides | ||
| 564 | * a back door. Remember to keep it shut otherwise you'll let the | ||
| 565 | * creepy crawlies in. | ||
| 566 | */ | ||
| 567 | |||
| 568 | static int sock_no_open(struct inode *irrelevant, struct file *dontcare) | ||
| 569 | { | ||
| 570 | return -ENXIO; | ||
| 571 | } | ||
| 572 | |||
| 573 | const struct file_operations bad_sock_fops = { | ||
| 574 | .owner = THIS_MODULE, | ||
| 575 | .open = sock_no_open, | ||
| 576 | .llseek = noop_llseek, | ||
| 577 | }; | ||
| 578 | |||
| 579 | /** | 560 | /** |
| 580 | * sock_release - close a socket | 561 | * sock_release - close a socket |
| 581 | * @sock: socket to close | 562 | * @sock: socket to close |
