diff options
author | Serge E. Hallyn <serue@us.ibm.com> | 2009-04-06 22:01:11 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-07 11:31:09 -0400 |
commit | bdc8e5f85f9abe2e7c78dcf39d81f9a97178788b (patch) | |
tree | a25a9d10f3686c4cb309d2477376ee585322ef43 | |
parent | 7eafd7c74c3f2e67c27621b987b28397110d643f (diff) |
namespaces: mqueue namespace: adapt sysctl
Largely inspired from ipc/ipc_sysctl.c. This patch isolates the mqueue
sysctl stuff in its own file.
[akpm@linux-foundation.org: build fix]
Signed-off-by: Cedric Le Goater <clg@fr.ibm.com>
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
Signed-off-by: Serge E. Hallyn <serue@us.ibm.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | include/linux/ipc_namespace.h | 14 | ||||
-rw-r--r-- | init/Kconfig | 6 | ||||
-rw-r--r-- | ipc/Makefile | 1 | ||||
-rw-r--r-- | ipc/mq_sysctl.c | 116 | ||||
-rw-r--r-- | ipc/mqueue.c | 65 |
5 files changed, 138 insertions, 64 deletions
diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h index 3392d50de351..3bf40e246a80 100644 --- a/include/linux/ipc_namespace.h +++ b/include/linux/ipc_namespace.h | |||
@@ -128,4 +128,18 @@ static inline void put_ipc_ns(struct ipc_namespace *ns) | |||
128 | { | 128 | { |
129 | } | 129 | } |
130 | #endif | 130 | #endif |
131 | |||
132 | #ifdef CONFIG_POSIX_MQUEUE_SYSCTL | ||
133 | |||
134 | struct ctl_table_header; | ||
135 | extern struct ctl_table_header *mq_register_sysctl_table(void); | ||
136 | |||
137 | #else /* CONFIG_POSIX_MQUEUE_SYSCTL */ | ||
138 | |||
139 | static inline struct ctl_table_header *mq_register_sysctl_table(void) | ||
140 | { | ||
141 | return NULL; | ||
142 | } | ||
143 | |||
144 | #endif /* CONFIG_POSIX_MQUEUE_SYSCTL */ | ||
131 | #endif | 145 | #endif |
diff --git a/init/Kconfig b/init/Kconfig index a0807ba91644..f2f9b5362b48 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -208,6 +208,12 @@ config POSIX_MQUEUE | |||
208 | 208 | ||
209 | If unsure, say Y. | 209 | If unsure, say Y. |
210 | 210 | ||
211 | config POSIX_MQUEUE_SYSCTL | ||
212 | bool | ||
213 | depends on POSIX_MQUEUE | ||
214 | depends on SYSCTL | ||
215 | default y | ||
216 | |||
211 | config BSD_PROCESS_ACCT | 217 | config BSD_PROCESS_ACCT |
212 | bool "BSD Process Accounting" | 218 | bool "BSD Process Accounting" |
213 | help | 219 | help |
diff --git a/ipc/Makefile b/ipc/Makefile index 65c384395801..4e1955ea815d 100644 --- a/ipc/Makefile +++ b/ipc/Makefile | |||
@@ -8,4 +8,5 @@ obj-$(CONFIG_SYSVIPC_SYSCTL) += ipc_sysctl.o | |||
8 | obj_mq-$(CONFIG_COMPAT) += compat_mq.o | 8 | obj_mq-$(CONFIG_COMPAT) += compat_mq.o |
9 | obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y) | 9 | obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y) |
10 | obj-$(CONFIG_IPC_NS) += namespace.o | 10 | obj-$(CONFIG_IPC_NS) += namespace.o |
11 | obj-$(CONFIG_POSIX_MQUEUE_SYSCTL) += mq_sysctl.o | ||
11 | 12 | ||
diff --git a/ipc/mq_sysctl.c b/ipc/mq_sysctl.c new file mode 100644 index 000000000000..89f60ec8ee54 --- /dev/null +++ b/ipc/mq_sysctl.c | |||
@@ -0,0 +1,116 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007 IBM Corporation | ||
3 | * | ||
4 | * Author: Cedric Le Goater <clg@fr.ibm.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/nsproxy.h> | ||
13 | #include <linux/ipc_namespace.h> | ||
14 | #include <linux/sysctl.h> | ||
15 | |||
16 | /* | ||
17 | * Define the ranges various user-specified maximum values can | ||
18 | * be set to. | ||
19 | */ | ||
20 | #define MIN_MSGMAX 1 /* min value for msg_max */ | ||
21 | #define MAX_MSGMAX HARD_MSGMAX /* max value for msg_max */ | ||
22 | #define MIN_MSGSIZEMAX 128 /* min value for msgsize_max */ | ||
23 | #define MAX_MSGSIZEMAX (8192*128) /* max value for msgsize_max */ | ||
24 | |||
25 | static void *get_mq(ctl_table *table) | ||
26 | { | ||
27 | char *which = table->data; | ||
28 | struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns; | ||
29 | which = (which - (char *)&init_ipc_ns) + (char *)ipc_ns; | ||
30 | return which; | ||
31 | } | ||
32 | |||
33 | #ifdef CONFIG_PROC_SYSCTL | ||
34 | static int proc_mq_dointvec(ctl_table *table, int write, struct file *filp, | ||
35 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
36 | { | ||
37 | struct ctl_table mq_table; | ||
38 | memcpy(&mq_table, table, sizeof(mq_table)); | ||
39 | mq_table.data = get_mq(table); | ||
40 | |||
41 | return proc_dointvec(&mq_table, write, filp, buffer, lenp, ppos); | ||
42 | } | ||
43 | |||
44 | static int proc_mq_dointvec_minmax(ctl_table *table, int write, | ||
45 | struct file *filp, void __user *buffer, size_t *lenp, loff_t *ppos) | ||
46 | { | ||
47 | struct ctl_table mq_table; | ||
48 | memcpy(&mq_table, table, sizeof(mq_table)); | ||
49 | mq_table.data = get_mq(table); | ||
50 | |||
51 | return proc_dointvec_minmax(&mq_table, write, filp, buffer, | ||
52 | lenp, ppos); | ||
53 | } | ||
54 | #else | ||
55 | #define proc_mq_dointvec NULL | ||
56 | #define proc_mq_dointvec_minmax NULL | ||
57 | #endif | ||
58 | |||
59 | static int msg_max_limit_min = MIN_MSGMAX; | ||
60 | static int msg_max_limit_max = MAX_MSGMAX; | ||
61 | |||
62 | static int msg_maxsize_limit_min = MIN_MSGSIZEMAX; | ||
63 | static int msg_maxsize_limit_max = MAX_MSGSIZEMAX; | ||
64 | |||
65 | static ctl_table mq_sysctls[] = { | ||
66 | { | ||
67 | .procname = "queues_max", | ||
68 | .data = &init_ipc_ns.mq_queues_max, | ||
69 | .maxlen = sizeof(int), | ||
70 | .mode = 0644, | ||
71 | .proc_handler = proc_mq_dointvec, | ||
72 | }, | ||
73 | { | ||
74 | .procname = "msg_max", | ||
75 | .data = &init_ipc_ns.mq_msg_max, | ||
76 | .maxlen = sizeof(int), | ||
77 | .mode = 0644, | ||
78 | .proc_handler = proc_mq_dointvec_minmax, | ||
79 | .extra1 = &msg_max_limit_min, | ||
80 | .extra2 = &msg_max_limit_max, | ||
81 | }, | ||
82 | { | ||
83 | .procname = "msgsize_max", | ||
84 | .data = &init_ipc_ns.mq_msgsize_max, | ||
85 | .maxlen = sizeof(int), | ||
86 | .mode = 0644, | ||
87 | .proc_handler = proc_mq_dointvec_minmax, | ||
88 | .extra1 = &msg_maxsize_limit_min, | ||
89 | .extra2 = &msg_maxsize_limit_max, | ||
90 | }, | ||
91 | { .ctl_name = 0 } | ||
92 | }; | ||
93 | |||
94 | static ctl_table mq_sysctl_dir[] = { | ||
95 | { | ||
96 | .procname = "mqueue", | ||
97 | .mode = 0555, | ||
98 | .child = mq_sysctls, | ||
99 | }, | ||
100 | { .ctl_name = 0 } | ||
101 | }; | ||
102 | |||
103 | static ctl_table mq_sysctl_root[] = { | ||
104 | { | ||
105 | .ctl_name = CTL_FS, | ||
106 | .procname = "fs", | ||
107 | .mode = 0555, | ||
108 | .child = mq_sysctl_dir, | ||
109 | }, | ||
110 | { .ctl_name = 0 } | ||
111 | }; | ||
112 | |||
113 | struct ctl_table_header *mq_register_sysctl_table(void) | ||
114 | { | ||
115 | return register_sysctl_table(mq_sysctl_root); | ||
116 | } | ||
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index c82d7b51ef68..e35ba2c3a8d7 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
@@ -47,15 +47,6 @@ | |||
47 | #define STATE_PENDING 1 | 47 | #define STATE_PENDING 1 |
48 | #define STATE_READY 2 | 48 | #define STATE_READY 2 |
49 | 49 | ||
50 | /* | ||
51 | * Define the ranges various user-specified maximum values can | ||
52 | * be set to. | ||
53 | */ | ||
54 | #define MIN_MSGMAX 1 /* min value for msg_max */ | ||
55 | #define MAX_MSGMAX HARD_MSGMAX /* max value for msg_max */ | ||
56 | #define MIN_MSGSIZEMAX 128 /* min value for msgsize_max */ | ||
57 | #define MAX_MSGSIZEMAX (8192*128) /* max value for msgsize_max */ | ||
58 | |||
59 | struct ext_wait_queue { /* queue of sleeping tasks */ | 50 | struct ext_wait_queue { /* queue of sleeping tasks */ |
60 | struct task_struct *task; | 51 | struct task_struct *task; |
61 | struct list_head list; | 52 | struct list_head list; |
@@ -1271,60 +1262,6 @@ void mq_put_mnt(struct ipc_namespace *ns) | |||
1271 | mntput(ns->mq_mnt); | 1262 | mntput(ns->mq_mnt); |
1272 | } | 1263 | } |
1273 | 1264 | ||
1274 | static int msg_max_limit_min = MIN_MSGMAX; | ||
1275 | static int msg_max_limit_max = MAX_MSGMAX; | ||
1276 | |||
1277 | static int msg_maxsize_limit_min = MIN_MSGSIZEMAX; | ||
1278 | static int msg_maxsize_limit_max = MAX_MSGSIZEMAX; | ||
1279 | |||
1280 | static ctl_table mq_sysctls[] = { | ||
1281 | { | ||
1282 | .procname = "queues_max", | ||
1283 | .data = &init_ipc_ns.mq_queues_max, | ||
1284 | .maxlen = sizeof(int), | ||
1285 | .mode = 0644, | ||
1286 | .proc_handler = &proc_dointvec, | ||
1287 | }, | ||
1288 | { | ||
1289 | .procname = "msg_max", | ||
1290 | .data = &init_ipc_ns.mq_msg_max, | ||
1291 | .maxlen = sizeof(int), | ||
1292 | .mode = 0644, | ||
1293 | .proc_handler = &proc_dointvec_minmax, | ||
1294 | .extra1 = &msg_max_limit_min, | ||
1295 | .extra2 = &msg_max_limit_max, | ||
1296 | }, | ||
1297 | { | ||
1298 | .procname = "msgsize_max", | ||
1299 | .data = &init_ipc_ns.mq_msgsize_max, | ||
1300 | .maxlen = sizeof(int), | ||
1301 | .mode = 0644, | ||
1302 | .proc_handler = &proc_dointvec_minmax, | ||
1303 | .extra1 = &msg_maxsize_limit_min, | ||
1304 | .extra2 = &msg_maxsize_limit_max, | ||
1305 | }, | ||
1306 | { .ctl_name = 0 } | ||
1307 | }; | ||
1308 | |||
1309 | static ctl_table mq_sysctl_dir[] = { | ||
1310 | { | ||
1311 | .procname = "mqueue", | ||
1312 | .mode = 0555, | ||
1313 | .child = mq_sysctls, | ||
1314 | }, | ||
1315 | { .ctl_name = 0 } | ||
1316 | }; | ||
1317 | |||
1318 | static ctl_table mq_sysctl_root[] = { | ||
1319 | { | ||
1320 | .ctl_name = CTL_FS, | ||
1321 | .procname = "fs", | ||
1322 | .mode = 0555, | ||
1323 | .child = mq_sysctl_dir, | ||
1324 | }, | ||
1325 | { .ctl_name = 0 } | ||
1326 | }; | ||
1327 | |||
1328 | static int __init init_mqueue_fs(void) | 1265 | static int __init init_mqueue_fs(void) |
1329 | { | 1266 | { |
1330 | int error; | 1267 | int error; |
@@ -1336,7 +1273,7 @@ static int __init init_mqueue_fs(void) | |||
1336 | return -ENOMEM; | 1273 | return -ENOMEM; |
1337 | 1274 | ||
1338 | /* ignore failues - they are not fatal */ | 1275 | /* ignore failues - they are not fatal */ |
1339 | mq_sysctl_table = register_sysctl_table(mq_sysctl_root); | 1276 | mq_sysctl_table = mq_register_sysctl_table(); |
1340 | 1277 | ||
1341 | error = register_filesystem(&mqueue_fs_type); | 1278 | error = register_filesystem(&mqueue_fs_type); |
1342 | if (error) | 1279 | if (error) |