aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/ipc_namespace.h14
-rw-r--r--init/Kconfig6
-rw-r--r--ipc/Makefile1
-rw-r--r--ipc/mq_sysctl.c116
-rw-r--r--ipc/mqueue.c65
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
134struct ctl_table_header;
135extern struct ctl_table_header *mq_register_sysctl_table(void);
136
137#else /* CONFIG_POSIX_MQUEUE_SYSCTL */
138
139static 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
211config POSIX_MQUEUE_SYSCTL
212 bool
213 depends on POSIX_MQUEUE
214 depends on SYSCTL
215 default y
216
211config BSD_PROCESS_ACCT 217config 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
8obj_mq-$(CONFIG_COMPAT) += compat_mq.o 8obj_mq-$(CONFIG_COMPAT) += compat_mq.o
9obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y) 9obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y)
10obj-$(CONFIG_IPC_NS) += namespace.o 10obj-$(CONFIG_IPC_NS) += namespace.o
11obj-$(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
25static 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
34static 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
44static 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
59static int msg_max_limit_min = MIN_MSGMAX;
60static int msg_max_limit_max = MAX_MSGMAX;
61
62static int msg_maxsize_limit_min = MIN_MSGSIZEMAX;
63static int msg_maxsize_limit_max = MAX_MSGSIZEMAX;
64
65static 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
94static ctl_table mq_sysctl_dir[] = {
95 {
96 .procname = "mqueue",
97 .mode = 0555,
98 .child = mq_sysctls,
99 },
100 { .ctl_name = 0 }
101};
102
103static 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
113struct 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
59struct ext_wait_queue { /* queue of sleeping tasks */ 50struct 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
1274static int msg_max_limit_min = MIN_MSGMAX;
1275static int msg_max_limit_max = MAX_MSGMAX;
1276
1277static int msg_maxsize_limit_min = MIN_MSGSIZEMAX;
1278static int msg_maxsize_limit_max = MAX_MSGSIZEMAX;
1279
1280static 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
1309static ctl_table mq_sysctl_dir[] = {
1310 {
1311 .procname = "mqueue",
1312 .mode = 0555,
1313 .child = mq_sysctls,
1314 },
1315 { .ctl_name = 0 }
1316};
1317
1318static 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
1328static int __init init_mqueue_fs(void) 1265static 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)