diff options
Diffstat (limited to 'ipc/mq_sysctl.c')
-rw-r--r-- | ipc/mq_sysctl.c | 116 |
1 files changed, 116 insertions, 0 deletions
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 | } | ||