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 /ipc | |
| 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>
Diffstat (limited to 'ipc')
| -rw-r--r-- | ipc/Makefile | 1 | ||||
| -rw-r--r-- | ipc/mq_sysctl.c | 116 | ||||
| -rw-r--r-- | ipc/mqueue.c | 65 |
3 files changed, 118 insertions, 64 deletions
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) |
