diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2014-11-01 00:37:32 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-12-04 14:34:17 -0500 |
| commit | 64964528b24ea390824f0e5ce9d34b8d39b28cde (patch) | |
| tree | 2de66d75468ad4ddecc7e175f86f1dbaae47ea9a | |
| parent | 3c0411846118a578de3a979faf2da3ab5fb81179 (diff) | |
make proc_ns_operations work with struct ns_common * instead of void *
We can do that now. And kill ->inum(), while we are at it - all instances
are identical.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| -rw-r--r-- | fs/namespace.c | 13 | ||||
| -rw-r--r-- | fs/proc/inode.c | 2 | ||||
| -rw-r--r-- | fs/proc/namespaces.c | 8 | ||||
| -rw-r--r-- | include/linux/proc_ns.h | 10 | ||||
| -rw-r--r-- | ipc/namespace.c | 12 | ||||
| -rw-r--r-- | kernel/pid_namespace.c | 12 | ||||
| -rw-r--r-- | kernel/user_namespace.c | 12 | ||||
| -rw-r--r-- | kernel/utsname.c | 12 | ||||
| -rw-r--r-- | net/core/net_namespace.c | 12 |
9 files changed, 28 insertions, 65 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index 5c21fdadabe4..b9c16c3f63f5 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
| @@ -3149,7 +3149,7 @@ found: | |||
| 3149 | return visible; | 3149 | return visible; |
| 3150 | } | 3150 | } |
| 3151 | 3151 | ||
| 3152 | static void *mntns_get(struct task_struct *task) | 3152 | static struct ns_common *mntns_get(struct task_struct *task) |
| 3153 | { | 3153 | { |
| 3154 | struct ns_common *ns = NULL; | 3154 | struct ns_common *ns = NULL; |
| 3155 | struct nsproxy *nsproxy; | 3155 | struct nsproxy *nsproxy; |
| @@ -3165,12 +3165,12 @@ static void *mntns_get(struct task_struct *task) | |||
| 3165 | return ns; | 3165 | return ns; |
| 3166 | } | 3166 | } |
| 3167 | 3167 | ||
| 3168 | static void mntns_put(void *ns) | 3168 | static void mntns_put(struct ns_common *ns) |
| 3169 | { | 3169 | { |
| 3170 | put_mnt_ns(to_mnt_ns(ns)); | 3170 | put_mnt_ns(to_mnt_ns(ns)); |
| 3171 | } | 3171 | } |
| 3172 | 3172 | ||
| 3173 | static int mntns_install(struct nsproxy *nsproxy, void *ns) | 3173 | static int mntns_install(struct nsproxy *nsproxy, struct ns_common *ns) |
| 3174 | { | 3174 | { |
| 3175 | struct fs_struct *fs = current->fs; | 3175 | struct fs_struct *fs = current->fs; |
| 3176 | struct mnt_namespace *mnt_ns = to_mnt_ns(ns); | 3176 | struct mnt_namespace *mnt_ns = to_mnt_ns(ns); |
| @@ -3203,17 +3203,10 @@ static int mntns_install(struct nsproxy *nsproxy, void *ns) | |||
| 3203 | return 0; | 3203 | return 0; |
| 3204 | } | 3204 | } |
| 3205 | 3205 | ||
| 3206 | static unsigned int mntns_inum(void *ns) | ||
| 3207 | { | ||
| 3208 | struct ns_common *p = ns; | ||
| 3209 | return p->inum; | ||
| 3210 | } | ||
| 3211 | |||
| 3212 | const struct proc_ns_operations mntns_operations = { | 3206 | const struct proc_ns_operations mntns_operations = { |
| 3213 | .name = "mnt", | 3207 | .name = "mnt", |
| 3214 | .type = CLONE_NEWNS, | 3208 | .type = CLONE_NEWNS, |
| 3215 | .get = mntns_get, | 3209 | .get = mntns_get, |
| 3216 | .put = mntns_put, | 3210 | .put = mntns_put, |
| 3217 | .install = mntns_install, | 3211 | .install = mntns_install, |
| 3218 | .inum = mntns_inum, | ||
| 3219 | }; | 3212 | }; |
diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 333080d7a671..43b703c6cd3b 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c | |||
| @@ -33,7 +33,7 @@ static void proc_evict_inode(struct inode *inode) | |||
| 33 | struct proc_dir_entry *de; | 33 | struct proc_dir_entry *de; |
| 34 | struct ctl_table_header *head; | 34 | struct ctl_table_header *head; |
| 35 | const struct proc_ns_operations *ns_ops; | 35 | const struct proc_ns_operations *ns_ops; |
| 36 | void *ns; | 36 | struct ns_common *ns; |
| 37 | 37 | ||
| 38 | truncate_inode_pages_final(&inode->i_data); | 38 | truncate_inode_pages_final(&inode->i_data); |
| 39 | clear_inode(inode); | 39 | clear_inode(inode); |
diff --git a/fs/proc/namespaces.c b/fs/proc/namespaces.c index 89026095f2b5..995e8e98237d 100644 --- a/fs/proc/namespaces.c +++ b/fs/proc/namespaces.c | |||
| @@ -64,7 +64,7 @@ static struct dentry *proc_ns_get_dentry(struct super_block *sb, | |||
| 64 | struct inode *inode; | 64 | struct inode *inode; |
| 65 | struct proc_inode *ei; | 65 | struct proc_inode *ei; |
| 66 | struct qstr qname = { .name = "", }; | 66 | struct qstr qname = { .name = "", }; |
| 67 | void *ns; | 67 | struct ns_common *ns; |
| 68 | 68 | ||
| 69 | ns = ns_ops->get(task); | 69 | ns = ns_ops->get(task); |
| 70 | if (!ns) | 70 | if (!ns) |
| @@ -76,7 +76,7 @@ static struct dentry *proc_ns_get_dentry(struct super_block *sb, | |||
| 76 | return ERR_PTR(-ENOMEM); | 76 | return ERR_PTR(-ENOMEM); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | inode = iget_locked(sb, ns_ops->inum(ns)); | 79 | inode = iget_locked(sb, ns->inum); |
| 80 | if (!inode) { | 80 | if (!inode) { |
| 81 | dput(dentry); | 81 | dput(dentry); |
| 82 | ns_ops->put(ns); | 82 | ns_ops->put(ns); |
| @@ -144,7 +144,7 @@ static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int bufl | |||
| 144 | struct proc_inode *ei = PROC_I(inode); | 144 | struct proc_inode *ei = PROC_I(inode); |
| 145 | const struct proc_ns_operations *ns_ops = ei->ns.ns_ops; | 145 | const struct proc_ns_operations *ns_ops = ei->ns.ns_ops; |
| 146 | struct task_struct *task; | 146 | struct task_struct *task; |
| 147 | void *ns; | 147 | struct ns_common *ns; |
| 148 | char name[50]; | 148 | char name[50]; |
| 149 | int res = -EACCES; | 149 | int res = -EACCES; |
| 150 | 150 | ||
| @@ -160,7 +160,7 @@ static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int bufl | |||
| 160 | if (!ns) | 160 | if (!ns) |
| 161 | goto out_put_task; | 161 | goto out_put_task; |
| 162 | 162 | ||
| 163 | snprintf(name, sizeof(name), "%s:[%u]", ns_ops->name, ns_ops->inum(ns)); | 163 | snprintf(name, sizeof(name), "%s:[%u]", ns_ops->name, ns->inum); |
| 164 | res = readlink_copy(buffer, buflen, name); | 164 | res = readlink_copy(buffer, buflen, name); |
| 165 | ns_ops->put(ns); | 165 | ns_ops->put(ns); |
| 166 | out_put_task: | 166 | out_put_task: |
diff --git a/include/linux/proc_ns.h b/include/linux/proc_ns.h index 34a1e105bef4..f284959391fd 100644 --- a/include/linux/proc_ns.h +++ b/include/linux/proc_ns.h | |||
| @@ -6,18 +6,18 @@ | |||
| 6 | 6 | ||
| 7 | struct pid_namespace; | 7 | struct pid_namespace; |
| 8 | struct nsproxy; | 8 | struct nsproxy; |
| 9 | struct ns_common; | ||
| 9 | 10 | ||
| 10 | struct proc_ns_operations { | 11 | struct proc_ns_operations { |
| 11 | const char *name; | 12 | const char *name; |
| 12 | int type; | 13 | int type; |
| 13 | void *(*get)(struct task_struct *task); | 14 | struct ns_common *(*get)(struct task_struct *task); |
| 14 | void (*put)(void *ns); | 15 | void (*put)(struct ns_common *ns); |
| 15 | int (*install)(struct nsproxy *nsproxy, void *ns); | 16 | int (*install)(struct nsproxy *nsproxy, struct ns_common *ns); |
| 16 | unsigned int (*inum)(void *ns); | ||
| 17 | }; | 17 | }; |
| 18 | 18 | ||
| 19 | struct proc_ns { | 19 | struct proc_ns { |
| 20 | void *ns; | 20 | struct ns_common *ns; |
| 21 | const struct proc_ns_operations *ns_ops; | 21 | const struct proc_ns_operations *ns_ops; |
| 22 | }; | 22 | }; |
| 23 | 23 | ||
diff --git a/ipc/namespace.c b/ipc/namespace.c index 3c1e8d3bd7d3..531029a67fef 100644 --- a/ipc/namespace.c +++ b/ipc/namespace.c | |||
| @@ -154,7 +154,7 @@ static inline struct ipc_namespace *to_ipc_ns(struct ns_common *ns) | |||
| 154 | return container_of(ns, struct ipc_namespace, ns); | 154 | return container_of(ns, struct ipc_namespace, ns); |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | static void *ipcns_get(struct task_struct *task) | 157 | static struct ns_common *ipcns_get(struct task_struct *task) |
| 158 | { | 158 | { |
| 159 | struct ipc_namespace *ns = NULL; | 159 | struct ipc_namespace *ns = NULL; |
| 160 | struct nsproxy *nsproxy; | 160 | struct nsproxy *nsproxy; |
| @@ -168,12 +168,12 @@ static void *ipcns_get(struct task_struct *task) | |||
| 168 | return ns ? &ns->ns : NULL; | 168 | return ns ? &ns->ns : NULL; |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | static void ipcns_put(void *ns) | 171 | static void ipcns_put(struct ns_common *ns) |
| 172 | { | 172 | { |
| 173 | return put_ipc_ns(to_ipc_ns(ns)); | 173 | return put_ipc_ns(to_ipc_ns(ns)); |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | static int ipcns_install(struct nsproxy *nsproxy, void *new) | 176 | static int ipcns_install(struct nsproxy *nsproxy, struct ns_common *new) |
| 177 | { | 177 | { |
| 178 | struct ipc_namespace *ns = to_ipc_ns(new); | 178 | struct ipc_namespace *ns = to_ipc_ns(new); |
| 179 | if (!ns_capable(ns->user_ns, CAP_SYS_ADMIN) || | 179 | if (!ns_capable(ns->user_ns, CAP_SYS_ADMIN) || |
| @@ -187,16 +187,10 @@ static int ipcns_install(struct nsproxy *nsproxy, void *new) | |||
| 187 | return 0; | 187 | return 0; |
| 188 | } | 188 | } |
| 189 | 189 | ||
| 190 | static unsigned int ipcns_inum(void *vp) | ||
| 191 | { | ||
| 192 | return ((struct ns_common *)vp)->inum; | ||
| 193 | } | ||
| 194 | |||
| 195 | const struct proc_ns_operations ipcns_operations = { | 190 | const struct proc_ns_operations ipcns_operations = { |
| 196 | .name = "ipc", | 191 | .name = "ipc", |
| 197 | .type = CLONE_NEWIPC, | 192 | .type = CLONE_NEWIPC, |
| 198 | .get = ipcns_get, | 193 | .get = ipcns_get, |
| 199 | .put = ipcns_put, | 194 | .put = ipcns_put, |
| 200 | .install = ipcns_install, | 195 | .install = ipcns_install, |
| 201 | .inum = ipcns_inum, | ||
| 202 | }; | 196 | }; |
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index dd961ad86fbd..79aabce49a85 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c | |||
| @@ -318,7 +318,7 @@ static inline struct pid_namespace *to_pid_ns(struct ns_common *ns) | |||
| 318 | return container_of(ns, struct pid_namespace, ns); | 318 | return container_of(ns, struct pid_namespace, ns); |
| 319 | } | 319 | } |
| 320 | 320 | ||
| 321 | static void *pidns_get(struct task_struct *task) | 321 | static struct ns_common *pidns_get(struct task_struct *task) |
| 322 | { | 322 | { |
| 323 | struct pid_namespace *ns; | 323 | struct pid_namespace *ns; |
| 324 | 324 | ||
| @@ -331,12 +331,12 @@ static void *pidns_get(struct task_struct *task) | |||
| 331 | return ns ? &ns->ns : NULL; | 331 | return ns ? &ns->ns : NULL; |
| 332 | } | 332 | } |
| 333 | 333 | ||
| 334 | static void pidns_put(void *ns) | 334 | static void pidns_put(struct ns_common *ns) |
| 335 | { | 335 | { |
| 336 | put_pid_ns(to_pid_ns(ns)); | 336 | put_pid_ns(to_pid_ns(ns)); |
| 337 | } | 337 | } |
| 338 | 338 | ||
| 339 | static int pidns_install(struct nsproxy *nsproxy, void *ns) | 339 | static int pidns_install(struct nsproxy *nsproxy, struct ns_common *ns) |
| 340 | { | 340 | { |
| 341 | struct pid_namespace *active = task_active_pid_ns(current); | 341 | struct pid_namespace *active = task_active_pid_ns(current); |
| 342 | struct pid_namespace *ancestor, *new = to_pid_ns(ns); | 342 | struct pid_namespace *ancestor, *new = to_pid_ns(ns); |
| @@ -367,18 +367,12 @@ static int pidns_install(struct nsproxy *nsproxy, void *ns) | |||
| 367 | return 0; | 367 | return 0; |
| 368 | } | 368 | } |
| 369 | 369 | ||
| 370 | static unsigned int pidns_inum(void *ns) | ||
| 371 | { | ||
| 372 | return ((struct ns_common *)ns)->inum; | ||
| 373 | } | ||
| 374 | |||
| 375 | const struct proc_ns_operations pidns_operations = { | 370 | const struct proc_ns_operations pidns_operations = { |
| 376 | .name = "pid", | 371 | .name = "pid", |
| 377 | .type = CLONE_NEWPID, | 372 | .type = CLONE_NEWPID, |
| 378 | .get = pidns_get, | 373 | .get = pidns_get, |
| 379 | .put = pidns_put, | 374 | .put = pidns_put, |
| 380 | .install = pidns_install, | 375 | .install = pidns_install, |
| 381 | .inum = pidns_inum, | ||
| 382 | }; | 376 | }; |
| 383 | 377 | ||
| 384 | static __init int pid_namespaces_init(void) | 378 | static __init int pid_namespaces_init(void) |
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c index 1ab2209228ff..29cd5ccfc37a 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c | |||
| @@ -846,7 +846,7 @@ static inline struct user_namespace *to_user_ns(struct ns_common *ns) | |||
| 846 | return container_of(ns, struct user_namespace, ns); | 846 | return container_of(ns, struct user_namespace, ns); |
| 847 | } | 847 | } |
| 848 | 848 | ||
| 849 | static void *userns_get(struct task_struct *task) | 849 | static struct ns_common *userns_get(struct task_struct *task) |
| 850 | { | 850 | { |
| 851 | struct user_namespace *user_ns; | 851 | struct user_namespace *user_ns; |
| 852 | 852 | ||
| @@ -857,12 +857,12 @@ static void *userns_get(struct task_struct *task) | |||
| 857 | return user_ns ? &user_ns->ns : NULL; | 857 | return user_ns ? &user_ns->ns : NULL; |
| 858 | } | 858 | } |
| 859 | 859 | ||
| 860 | static void userns_put(void *ns) | 860 | static void userns_put(struct ns_common *ns) |
| 861 | { | 861 | { |
| 862 | put_user_ns(to_user_ns(ns)); | 862 | put_user_ns(to_user_ns(ns)); |
| 863 | } | 863 | } |
| 864 | 864 | ||
| 865 | static int userns_install(struct nsproxy *nsproxy, void *ns) | 865 | static int userns_install(struct nsproxy *nsproxy, struct ns_common *ns) |
| 866 | { | 866 | { |
| 867 | struct user_namespace *user_ns = to_user_ns(ns); | 867 | struct user_namespace *user_ns = to_user_ns(ns); |
| 868 | struct cred *cred; | 868 | struct cred *cred; |
| @@ -893,18 +893,12 @@ static int userns_install(struct nsproxy *nsproxy, void *ns) | |||
| 893 | return commit_creds(cred); | 893 | return commit_creds(cred); |
| 894 | } | 894 | } |
| 895 | 895 | ||
| 896 | static unsigned int userns_inum(void *ns) | ||
| 897 | { | ||
| 898 | return ((struct ns_common *)ns)->inum; | ||
| 899 | } | ||
| 900 | |||
| 901 | const struct proc_ns_operations userns_operations = { | 896 | const struct proc_ns_operations userns_operations = { |
| 902 | .name = "user", | 897 | .name = "user", |
| 903 | .type = CLONE_NEWUSER, | 898 | .type = CLONE_NEWUSER, |
| 904 | .get = userns_get, | 899 | .get = userns_get, |
| 905 | .put = userns_put, | 900 | .put = userns_put, |
| 906 | .install = userns_install, | 901 | .install = userns_install, |
| 907 | .inum = userns_inum, | ||
| 908 | }; | 902 | }; |
| 909 | 903 | ||
| 910 | static __init int user_namespaces_init(void) | 904 | static __init int user_namespaces_init(void) |
diff --git a/kernel/utsname.c b/kernel/utsname.c index 1917f74be8ec..20697befe466 100644 --- a/kernel/utsname.c +++ b/kernel/utsname.c | |||
| @@ -93,7 +93,7 @@ static inline struct uts_namespace *to_uts_ns(struct ns_common *ns) | |||
| 93 | return container_of(ns, struct uts_namespace, ns); | 93 | return container_of(ns, struct uts_namespace, ns); |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | static void *utsns_get(struct task_struct *task) | 96 | static struct ns_common *utsns_get(struct task_struct *task) |
| 97 | { | 97 | { |
| 98 | struct uts_namespace *ns = NULL; | 98 | struct uts_namespace *ns = NULL; |
| 99 | struct nsproxy *nsproxy; | 99 | struct nsproxy *nsproxy; |
| @@ -109,12 +109,12 @@ static void *utsns_get(struct task_struct *task) | |||
| 109 | return ns ? &ns->ns : NULL; | 109 | return ns ? &ns->ns : NULL; |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | static void utsns_put(void *ns) | 112 | static void utsns_put(struct ns_common *ns) |
| 113 | { | 113 | { |
| 114 | put_uts_ns(to_uts_ns(ns)); | 114 | put_uts_ns(to_uts_ns(ns)); |
| 115 | } | 115 | } |
| 116 | 116 | ||
| 117 | static int utsns_install(struct nsproxy *nsproxy, void *new) | 117 | static int utsns_install(struct nsproxy *nsproxy, struct ns_common *new) |
| 118 | { | 118 | { |
| 119 | struct uts_namespace *ns = to_uts_ns(new); | 119 | struct uts_namespace *ns = to_uts_ns(new); |
| 120 | 120 | ||
| @@ -128,16 +128,10 @@ static int utsns_install(struct nsproxy *nsproxy, void *new) | |||
| 128 | return 0; | 128 | return 0; |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | static unsigned int utsns_inum(void *vp) | ||
| 132 | { | ||
| 133 | return ((struct ns_common *)vp)->inum; | ||
| 134 | } | ||
| 135 | |||
| 136 | const struct proc_ns_operations utsns_operations = { | 131 | const struct proc_ns_operations utsns_operations = { |
| 137 | .name = "uts", | 132 | .name = "uts", |
| 138 | .type = CLONE_NEWUTS, | 133 | .type = CLONE_NEWUTS, |
| 139 | .get = utsns_get, | 134 | .get = utsns_get, |
| 140 | .put = utsns_put, | 135 | .put = utsns_put, |
| 141 | .install = utsns_install, | 136 | .install = utsns_install, |
| 142 | .inum = utsns_inum, | ||
| 143 | }; | 137 | }; |
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 97f4dc2132ad..2161f0979fce 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
| @@ -629,7 +629,7 @@ void unregister_pernet_device(struct pernet_operations *ops) | |||
| 629 | EXPORT_SYMBOL_GPL(unregister_pernet_device); | 629 | EXPORT_SYMBOL_GPL(unregister_pernet_device); |
| 630 | 630 | ||
| 631 | #ifdef CONFIG_NET_NS | 631 | #ifdef CONFIG_NET_NS |
| 632 | static void *netns_get(struct task_struct *task) | 632 | static struct ns_common *netns_get(struct task_struct *task) |
| 633 | { | 633 | { |
| 634 | struct net *net = NULL; | 634 | struct net *net = NULL; |
| 635 | struct nsproxy *nsproxy; | 635 | struct nsproxy *nsproxy; |
| @@ -648,12 +648,12 @@ static inline struct net *to_net_ns(struct ns_common *ns) | |||
| 648 | return container_of(ns, struct net, ns); | 648 | return container_of(ns, struct net, ns); |
| 649 | } | 649 | } |
| 650 | 650 | ||
| 651 | static void netns_put(void *ns) | 651 | static void netns_put(struct ns_common *ns) |
| 652 | { | 652 | { |
| 653 | put_net(to_net_ns(ns)); | 653 | put_net(to_net_ns(ns)); |
| 654 | } | 654 | } |
| 655 | 655 | ||
| 656 | static int netns_install(struct nsproxy *nsproxy, void *ns) | 656 | static int netns_install(struct nsproxy *nsproxy, struct ns_common *ns) |
| 657 | { | 657 | { |
| 658 | struct net *net = to_net_ns(ns); | 658 | struct net *net = to_net_ns(ns); |
| 659 | 659 | ||
| @@ -666,17 +666,11 @@ static int netns_install(struct nsproxy *nsproxy, void *ns) | |||
| 666 | return 0; | 666 | return 0; |
| 667 | } | 667 | } |
| 668 | 668 | ||
| 669 | static unsigned int netns_inum(void *ns) | ||
| 670 | { | ||
| 671 | return ((struct ns_common *)ns)->inum; | ||
| 672 | } | ||
| 673 | |||
| 674 | const struct proc_ns_operations netns_operations = { | 669 | const struct proc_ns_operations netns_operations = { |
| 675 | .name = "net", | 670 | .name = "net", |
| 676 | .type = CLONE_NEWNET, | 671 | .type = CLONE_NEWNET, |
| 677 | .get = netns_get, | 672 | .get = netns_get, |
| 678 | .put = netns_put, | 673 | .put = netns_put, |
| 679 | .install = netns_install, | 674 | .install = netns_install, |
| 680 | .inum = netns_inum, | ||
| 681 | }; | 675 | }; |
| 682 | #endif | 676 | #endif |
