diff options
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) |