Commit bdc8e5f85f9abe2e7c78dcf39d81f9a97178788b
Committed by
Linus Torvalds
1 parent
7eafd7c74c
Exists in
master
and in
39 other branches
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>
Showing 5 changed files with 138 additions and 64 deletions Side-by-side Diff
include/linux/ipc_namespace.h
... | ... | @@ -128,5 +128,19 @@ |
128 | 128 | { |
129 | 129 | } |
130 | 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 | 145 | #endif |
init/Kconfig
ipc/Makefile
ipc/mq_sysctl.c
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 | +} |
ipc/mqueue.c
... | ... | @@ -47,15 +47,6 @@ |
47 | 47 | #define STATE_PENDING 1 |
48 | 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 | 50 | struct ext_wait_queue { /* queue of sleeping tasks */ |
60 | 51 | struct task_struct *task; |
61 | 52 | struct list_head list; |
... | ... | @@ -1271,60 +1262,6 @@ |
1271 | 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 | 1265 | static int __init init_mqueue_fs(void) |
1329 | 1266 | { |
1330 | 1267 | int error; |
... | ... | @@ -1336,7 +1273,7 @@ |
1336 | 1273 | return -ENOMEM; |
1337 | 1274 | |
1338 | 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 | 1278 | error = register_filesystem(&mqueue_fs_type); |
1342 | 1279 | if (error) |