Skip to content

Commit bdc8e5f

Browse files
Serge E. Hallyntorvalds
authored andcommitted
namespaces: mqueue namespace: adapt sysctl
Largely inspired from ipc/ipc_sysctl.c. This patch isolates the mqueue sysctl stuff in its own file. [[email protected]: build fix] Signed-off-by: Cedric Le Goater <[email protected]> Signed-off-by: Nadia Derbey <[email protected]> Signed-off-by: Serge E. Hallyn <[email protected]> Cc: Alexey Dobriyan <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 7eafd7c commit bdc8e5f

File tree

5 files changed

+138
-64
lines changed

5 files changed

+138
-64
lines changed

include/linux/ipc_namespace.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,18 @@ static inline void put_ipc_ns(struct ipc_namespace *ns)
128128
{
129129
}
130130
#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 */
131145
#endif

init/Kconfig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,12 @@ config POSIX_MQUEUE
208208

209209
If unsure, say Y.
210210

211+
config POSIX_MQUEUE_SYSCTL
212+
bool
213+
depends on POSIX_MQUEUE
214+
depends on SYSCTL
215+
default y
216+
211217
config BSD_PROCESS_ACCT
212218
bool "BSD Process Accounting"
213219
help

ipc/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ obj-$(CONFIG_SYSVIPC_SYSCTL) += ipc_sysctl.o
88
obj_mq-$(CONFIG_COMPAT) += compat_mq.o
99
obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y)
1010
obj-$(CONFIG_IPC_NS) += namespace.o
11+
obj-$(CONFIG_POSIX_MQUEUE_SYSCTL) += mq_sysctl.o
1112

ipc/mq_sysctl.c

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*
2+
* Copyright (C) 2007 IBM Corporation
3+
*
4+
* Author: Cedric Le Goater <[email protected]>
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

Lines changed: 1 addition & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,6 @@
4747
#define STATE_PENDING 1
4848
#define STATE_READY 2
4949

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-
5950
struct ext_wait_queue { /* queue of sleeping tasks */
6051
struct task_struct *task;
6152
struct list_head list;
@@ -1271,60 +1262,6 @@ void mq_put_mnt(struct ipc_namespace *ns)
12711262
mntput(ns->mq_mnt);
12721263
}
12731264

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-
13281265
static int __init init_mqueue_fs(void)
13291266
{
13301267
int error;
@@ -1336,7 +1273,7 @@ static int __init init_mqueue_fs(void)
13361273
return -ENOMEM;
13371274

13381275
/* ignore failues - they are not fatal */
1339-
mq_sysctl_table = register_sysctl_table(mq_sysctl_root);
1276+
mq_sysctl_table = mq_register_sysctl_table();
13401277

13411278
error = register_filesystem(&mqueue_fs_type);
13421279
if (error)

0 commit comments

Comments
 (0)