diff options
| author | Eric W. Biederman <ebiederm@xmission.com> | 2007-02-14 03:33:58 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-14 11:09:58 -0500 |
| commit | 39732acd968a007036ff3c504f1e6748024ef548 (patch) | |
| tree | 91d3ecdd8579559daa6b9d4b25eb688d1bb909a8 /kernel | |
| parent | b04c3afb2b6e2f902b41bb62b73684d92d7e6c34 (diff) | |
[PATCH] sysctl: move utsname sysctls to their own file
This is just a simple cleanup to keep kernel/sysctl.c from getting to crowded
with special cases, and by keeping all of the utsname logic to together it
makes the code a little more readable.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Cc: Serge E. Hallyn <serue@us.ibm.com>
Cc: Herbert Poetzl <herbert@13thfloor.at>
Cc: Kirill Korotaev <dev@sw.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/Makefile | 1 | ||||
| -rw-r--r-- | kernel/sysctl.c | 117 | ||||
| -rw-r--r-- | kernel/utsname_sysctl.c | 146 |
3 files changed, 147 insertions, 117 deletions
diff --git a/kernel/Makefile b/kernel/Makefile index 14f4d45e0ae9..ac6b27abb1ad 100644 --- a/kernel/Makefile +++ b/kernel/Makefile | |||
| @@ -47,6 +47,7 @@ obj-$(CONFIG_GENERIC_HARDIRQS) += irq/ | |||
| 47 | obj-$(CONFIG_SECCOMP) += seccomp.o | 47 | obj-$(CONFIG_SECCOMP) += seccomp.o |
| 48 | obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o | 48 | obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o |
| 49 | obj-$(CONFIG_RELAY) += relay.o | 49 | obj-$(CONFIG_RELAY) += relay.o |
| 50 | obj-$(CONFIG_SYSCTL) += utsname_sysctl.o | ||
| 50 | obj-$(CONFIG_UTS_NS) += utsname.o | 51 | obj-$(CONFIG_UTS_NS) += utsname.o |
| 51 | obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o | 52 | obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o |
| 52 | obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o | 53 | obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 7ba4b0c16d6a..eff1d36c0687 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -135,13 +135,6 @@ static int parse_table(int __user *, int, void __user *, size_t __user *, | |||
| 135 | void __user *, size_t, ctl_table *); | 135 | void __user *, size_t, ctl_table *); |
| 136 | #endif | 136 | #endif |
| 137 | 137 | ||
| 138 | static int proc_do_uts_string(ctl_table *table, int write, struct file *filp, | ||
| 139 | void __user *buffer, size_t *lenp, loff_t *ppos); | ||
| 140 | |||
| 141 | static int sysctl_uts_string(ctl_table *table, int __user *name, int nlen, | ||
| 142 | void __user *oldval, size_t __user *oldlenp, | ||
| 143 | void __user *newval, size_t newlen); | ||
| 144 | |||
| 145 | #ifdef CONFIG_SYSVIPC | 138 | #ifdef CONFIG_SYSVIPC |
| 146 | static int sysctl_ipc_data(ctl_table *table, int __user *name, int nlen, | 139 | static int sysctl_ipc_data(ctl_table *table, int __user *name, int nlen, |
| 147 | void __user *oldval, size_t __user *oldlenp, | 140 | void __user *oldval, size_t __user *oldlenp, |
| @@ -176,29 +169,6 @@ extern ctl_table inotify_table[]; | |||
| 176 | int sysctl_legacy_va_layout; | 169 | int sysctl_legacy_va_layout; |
| 177 | #endif | 170 | #endif |
| 178 | 171 | ||
| 179 | |||
| 180 | static void *get_uts(ctl_table *table, int write) | ||
| 181 | { | ||
| 182 | char *which = table->data; | ||
| 183 | #ifdef CONFIG_UTS_NS | ||
| 184 | struct uts_namespace *uts_ns = current->nsproxy->uts_ns; | ||
| 185 | which = (which - (char *)&init_uts_ns) + (char *)uts_ns; | ||
| 186 | #endif | ||
| 187 | if (!write) | ||
| 188 | down_read(&uts_sem); | ||
| 189 | else | ||
| 190 | down_write(&uts_sem); | ||
| 191 | return which; | ||
| 192 | } | ||
| 193 | |||
| 194 | static void put_uts(ctl_table *table, int write, void *which) | ||
| 195 | { | ||
| 196 | if (!write) | ||
| 197 | up_read(&uts_sem); | ||
| 198 | else | ||
| 199 | up_write(&uts_sem); | ||
| 200 | } | ||
| 201 | |||
| 202 | #ifdef CONFIG_SYSVIPC | 172 | #ifdef CONFIG_SYSVIPC |
| 203 | static void *get_ipc(ctl_table *table, int write) | 173 | static void *get_ipc(ctl_table *table, int write) |
| 204 | { | 174 | { |
| @@ -278,51 +248,6 @@ static ctl_table root_table[] = { | |||
| 278 | 248 | ||
| 279 | static ctl_table kern_table[] = { | 249 | static ctl_table kern_table[] = { |
| 280 | { | 250 | { |
| 281 | .ctl_name = KERN_OSTYPE, | ||
| 282 | .procname = "ostype", | ||
| 283 | .data = init_uts_ns.name.sysname, | ||
| 284 | .maxlen = sizeof(init_uts_ns.name.sysname), | ||
| 285 | .mode = 0444, | ||
| 286 | .proc_handler = &proc_do_uts_string, | ||
| 287 | .strategy = &sysctl_uts_string, | ||
| 288 | }, | ||
| 289 | { | ||
| 290 | .ctl_name = KERN_OSRELEASE, | ||
| 291 | .procname = "osrelease", | ||
| 292 | .data = init_uts_ns.name.release, | ||
| 293 | .maxlen = sizeof(init_uts_ns.name.release), | ||
| 294 | .mode = 0444, | ||
| 295 | .proc_handler = &proc_do_uts_string, | ||
| 296 | .strategy = &sysctl_uts_string, | ||
| 297 | }, | ||
| 298 | { | ||
| 299 | .ctl_name = KERN_VERSION, | ||
| 300 | .procname = "version", | ||
| 301 | .data = init_uts_ns.name.version, | ||
| 302 | .maxlen = sizeof(init_uts_ns.name.version), | ||
| 303 | .mode = 0444, | ||
| 304 | .proc_handler = &proc_do_uts_string, | ||
| 305 | .strategy = &sysctl_uts_string, | ||
| 306 | }, | ||
| 307 | { | ||
| 308 | .ctl_name = KERN_NODENAME, | ||
| 309 | .procname = "hostname", | ||
| 310 | .data = init_uts_ns.name.nodename, | ||
| 311 | .maxlen = sizeof(init_uts_ns.name.nodename), | ||
| 312 | .mode = 0644, | ||
| 313 | .proc_handler = &proc_do_uts_string, | ||
| 314 | .strategy = &sysctl_uts_string, | ||
| 315 | }, | ||
| 316 | { | ||
| 317 | .ctl_name = KERN_DOMAINNAME, | ||
| 318 | .procname = "domainname", | ||
| 319 | .data = init_uts_ns.name.domainname, | ||
| 320 | .maxlen = sizeof(init_uts_ns.name.domainname), | ||
| 321 | .mode = 0644, | ||
| 322 | .proc_handler = &proc_do_uts_string, | ||
| 323 | .strategy = &sysctl_uts_string, | ||
| 324 | }, | ||
| 325 | { | ||
| 326 | .ctl_name = KERN_PANIC, | 251 | .ctl_name = KERN_PANIC, |
| 327 | .procname = "panic", | 252 | .procname = "panic", |
| 328 | .data = &panic_timeout, | 253 | .data = &panic_timeout, |
| @@ -1759,21 +1684,6 @@ int proc_dostring(ctl_table *table, int write, struct file *filp, | |||
| 1759 | buffer, lenp, ppos); | 1684 | buffer, lenp, ppos); |
| 1760 | } | 1685 | } |
| 1761 | 1686 | ||
| 1762 | /* | ||
| 1763 | * Special case of dostring for the UTS structure. This has locks | ||
| 1764 | * to observe. Should this be in kernel/sys.c ???? | ||
| 1765 | */ | ||
| 1766 | |||
| 1767 | static int proc_do_uts_string(ctl_table *table, int write, struct file *filp, | ||
| 1768 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
| 1769 | { | ||
| 1770 | int r; | ||
| 1771 | void *which; | ||
| 1772 | which = get_uts(table, write); | ||
| 1773 | r = _proc_do_string(which, table->maxlen,write,filp,buffer,lenp, ppos); | ||
| 1774 | put_uts(table, write, which); | ||
| 1775 | return r; | ||
| 1776 | } | ||
| 1777 | 1687 | ||
| 1778 | static int do_proc_dointvec_conv(int *negp, unsigned long *lvalp, | 1688 | static int do_proc_dointvec_conv(int *negp, unsigned long *lvalp, |
| 1779 | int *valp, | 1689 | int *valp, |
| @@ -2410,12 +2320,6 @@ int proc_dostring(ctl_table *table, int write, struct file *filp, | |||
| 2410 | return -ENOSYS; | 2320 | return -ENOSYS; |
| 2411 | } | 2321 | } |
| 2412 | 2322 | ||
| 2413 | static int proc_do_uts_string(ctl_table *table, int write, struct file *filp, | ||
| 2414 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
| 2415 | { | ||
| 2416 | return -ENOSYS; | ||
| 2417 | } | ||
| 2418 | |||
| 2419 | #ifdef CONFIG_SYSVIPC | 2323 | #ifdef CONFIG_SYSVIPC |
| 2420 | static int proc_do_ipc_string(ctl_table *table, int write, struct file *filp, | 2324 | static int proc_do_ipc_string(ctl_table *table, int write, struct file *filp, |
| 2421 | void __user *buffer, size_t *lenp, loff_t *ppos) | 2325 | void __user *buffer, size_t *lenp, loff_t *ppos) |
| @@ -2645,21 +2549,6 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen, | |||
| 2645 | } | 2549 | } |
| 2646 | 2550 | ||
| 2647 | 2551 | ||
| 2648 | /* The generic string strategy routine: */ | ||
| 2649 | static int sysctl_uts_string(ctl_table *table, int __user *name, int nlen, | ||
| 2650 | void __user *oldval, size_t __user *oldlenp, | ||
| 2651 | void __user *newval, size_t newlen) | ||
| 2652 | { | ||
| 2653 | struct ctl_table uts_table; | ||
| 2654 | int r, write; | ||
| 2655 | write = newval && newlen; | ||
| 2656 | memcpy(&uts_table, table, sizeof(uts_table)); | ||
| 2657 | uts_table.data = get_uts(table, write); | ||
| 2658 | r = sysctl_string(&uts_table, name, nlen, | ||
| 2659 | oldval, oldlenp, newval, newlen); | ||
| 2660 | put_uts(table, write, uts_table.data); | ||
| 2661 | return r; | ||
| 2662 | } | ||
| 2663 | 2552 | ||
| 2664 | #ifdef CONFIG_SYSVIPC | 2553 | #ifdef CONFIG_SYSVIPC |
| 2665 | /* The generic sysctl ipc data routine. */ | 2554 | /* The generic sysctl ipc data routine. */ |
| @@ -2766,12 +2655,6 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen, | |||
| 2766 | return -ENOSYS; | 2655 | return -ENOSYS; |
| 2767 | } | 2656 | } |
| 2768 | 2657 | ||
| 2769 | static int sysctl_uts_string(ctl_table *table, int __user *name, int nlen, | ||
| 2770 | void __user *oldval, size_t __user *oldlenp, | ||
| 2771 | void __user *newval, size_t newlen) | ||
| 2772 | { | ||
| 2773 | return -ENOSYS; | ||
| 2774 | } | ||
| 2775 | #ifdef CONFIG_SYSVIPC | 2658 | #ifdef CONFIG_SYSVIPC |
| 2776 | static int sysctl_ipc_data(ctl_table *table, int __user *name, int nlen, | 2659 | static int sysctl_ipc_data(ctl_table *table, int __user *name, int nlen, |
| 2777 | void __user *oldval, size_t __user *oldlenp, | 2660 | void __user *oldval, size_t __user *oldlenp, |
diff --git a/kernel/utsname_sysctl.c b/kernel/utsname_sysctl.c new file mode 100644 index 000000000000..324aa1341b5f --- /dev/null +++ b/kernel/utsname_sysctl.c | |||
| @@ -0,0 +1,146 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2007 | ||
| 3 | * | ||
| 4 | * Author: Eric Biederman <ebiederm@xmision.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License as | ||
| 8 | * published by the Free Software Foundation, version 2 of the | ||
| 9 | * License. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/module.h> | ||
| 13 | #include <linux/uts.h> | ||
| 14 | #include <linux/utsname.h> | ||
| 15 | #include <linux/version.h> | ||
| 16 | #include <linux/sysctl.h> | ||
| 17 | |||
| 18 | static void *get_uts(ctl_table *table, int write) | ||
| 19 | { | ||
| 20 | char *which = table->data; | ||
| 21 | #ifdef CONFIG_UTS_NS | ||
| 22 | struct uts_namespace *uts_ns = current->nsproxy->uts_ns; | ||
| 23 | which = (which - (char *)&init_uts_ns) + (char *)uts_ns; | ||
| 24 | #endif | ||
| 25 | if (!write) | ||
| 26 | down_read(&uts_sem); | ||
| 27 | else | ||
| 28 | down_write(&uts_sem); | ||
| 29 | return which; | ||
| 30 | } | ||
| 31 | |||
| 32 | static void put_uts(ctl_table *table, int write, void *which) | ||
| 33 | { | ||
| 34 | if (!write) | ||
| 35 | up_read(&uts_sem); | ||
| 36 | else | ||
| 37 | up_write(&uts_sem); | ||
| 38 | } | ||
| 39 | |||
| 40 | #ifdef CONFIG_PROC_FS | ||
| 41 | /* | ||
| 42 | * Special case of dostring for the UTS structure. This has locks | ||
| 43 | * to observe. Should this be in kernel/sys.c ???? | ||
| 44 | */ | ||
| 45 | static int proc_do_uts_string(ctl_table *table, int write, struct file *filp, | ||
| 46 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
| 47 | { | ||
| 48 | struct ctl_table uts_table; | ||
| 49 | int r; | ||
| 50 | memcpy(&uts_table, table, sizeof(uts_table)); | ||
| 51 | uts_table.data = get_uts(table, write); | ||
| 52 | r = proc_dostring(&uts_table,write,filp,buffer,lenp, ppos); | ||
| 53 | put_uts(table, write, uts_table.data); | ||
| 54 | return r; | ||
| 55 | } | ||
| 56 | #else | ||
| 57 | #define proc_do_uts_string NULL | ||
| 58 | #endif | ||
| 59 | |||
| 60 | |||
| 61 | #ifdef CONFIG_SYSCTL_SYSCALL | ||
| 62 | /* The generic string strategy routine: */ | ||
| 63 | static int sysctl_uts_string(ctl_table *table, int __user *name, int nlen, | ||
| 64 | void __user *oldval, size_t __user *oldlenp, | ||
| 65 | void __user *newval, size_t newlen) | ||
| 66 | { | ||
| 67 | struct ctl_table uts_table; | ||
| 68 | int r, write; | ||
| 69 | write = newval && newlen; | ||
| 70 | memcpy(&uts_table, table, sizeof(uts_table)); | ||
| 71 | uts_table.data = get_uts(table, write); | ||
| 72 | r = sysctl_string(&uts_table, name, nlen, | ||
| 73 | oldval, oldlenp, newval, newlen); | ||
| 74 | put_uts(table, write, uts_table.data); | ||
| 75 | return r; | ||
| 76 | } | ||
| 77 | #else | ||
| 78 | #define sysctl_uts_string NULL | ||
| 79 | #endif | ||
| 80 | |||
| 81 | static struct ctl_table uts_kern_table[] = { | ||
| 82 | { | ||
| 83 | .ctl_name = KERN_OSTYPE, | ||
| 84 | .procname = "ostype", | ||
| 85 | .data = init_uts_ns.name.sysname, | ||
| 86 | .maxlen = sizeof(init_uts_ns.name.sysname), | ||
| 87 | .mode = 0444, | ||
| 88 | .proc_handler = proc_do_uts_string, | ||
| 89 | .strategy = sysctl_uts_string, | ||
| 90 | }, | ||
| 91 | { | ||
| 92 | .ctl_name = KERN_OSRELEASE, | ||
| 93 | .procname = "osrelease", | ||
| 94 | .data = init_uts_ns.name.release, | ||
| 95 | .maxlen = sizeof(init_uts_ns.name.release), | ||
| 96 | .mode = 0444, | ||
| 97 | .proc_handler = proc_do_uts_string, | ||
| 98 | .strategy = sysctl_uts_string, | ||
| 99 | }, | ||
| 100 | { | ||
| 101 | .ctl_name = KERN_VERSION, | ||
| 102 | .procname = "version", | ||
| 103 | .data = init_uts_ns.name.version, | ||
| 104 | .maxlen = sizeof(init_uts_ns.name.version), | ||
| 105 | .mode = 0444, | ||
| 106 | .proc_handler = proc_do_uts_string, | ||
| 107 | .strategy = sysctl_uts_string, | ||
| 108 | }, | ||
| 109 | { | ||
| 110 | .ctl_name = KERN_NODENAME, | ||
| 111 | .procname = "hostname", | ||
| 112 | .data = init_uts_ns.name.nodename, | ||
| 113 | .maxlen = sizeof(init_uts_ns.name.nodename), | ||
| 114 | .mode = 0644, | ||
| 115 | .proc_handler = proc_do_uts_string, | ||
| 116 | .strategy = sysctl_uts_string, | ||
| 117 | }, | ||
| 118 | { | ||
| 119 | .ctl_name = KERN_DOMAINNAME, | ||
| 120 | .procname = "domainname", | ||
| 121 | .data = init_uts_ns.name.domainname, | ||
| 122 | .maxlen = sizeof(init_uts_ns.name.domainname), | ||
| 123 | .mode = 0644, | ||
| 124 | .proc_handler = proc_do_uts_string, | ||
| 125 | .strategy = sysctl_uts_string, | ||
| 126 | }, | ||
| 127 | {} | ||
| 128 | }; | ||
| 129 | |||
| 130 | static struct ctl_table uts_root_table[] = { | ||
| 131 | { | ||
| 132 | .ctl_name = CTL_KERN, | ||
| 133 | .procname = "kernel", | ||
| 134 | .mode = 0555, | ||
| 135 | .child = uts_kern_table, | ||
| 136 | }, | ||
| 137 | {} | ||
| 138 | }; | ||
| 139 | |||
| 140 | static int __init utsname_sysctl_init(void) | ||
| 141 | { | ||
| 142 | register_sysctl_table(uts_root_table, 0); | ||
| 143 | return 0; | ||
| 144 | } | ||
| 145 | |||
| 146 | __initcall(utsname_sysctl_init); | ||
