xref: /linux/ipc/mq_sysctl.c (revision 5e2aa2ed08e2e280121dc7cf5609c87d464f12ef)
1bdc8e5f8SSerge E. Hallyn /*
2bdc8e5f8SSerge E. Hallyn  *  Copyright (C) 2007 IBM Corporation
3bdc8e5f8SSerge E. Hallyn  *
4bdc8e5f8SSerge E. Hallyn  *  Author: Cedric Le Goater <clg@fr.ibm.com>
5bdc8e5f8SSerge E. Hallyn  *
6bdc8e5f8SSerge E. Hallyn  *  This program is free software; you can redistribute it and/or
7bdc8e5f8SSerge E. Hallyn  *  modify it under the terms of the GNU General Public License as
8bdc8e5f8SSerge E. Hallyn  *  published by the Free Software Foundation, version 2 of the
9bdc8e5f8SSerge E. Hallyn  *  License.
10bdc8e5f8SSerge E. Hallyn  */
11bdc8e5f8SSerge E. Hallyn 
12bdc8e5f8SSerge E. Hallyn #include <linux/nsproxy.h>
13bdc8e5f8SSerge E. Hallyn #include <linux/ipc_namespace.h>
14bdc8e5f8SSerge E. Hallyn #include <linux/sysctl.h>
15bdc8e5f8SSerge E. Hallyn 
16f26ec5baSGeert Uytterhoeven #ifdef CONFIG_PROC_SYSCTL
17*a5c5928bSJoe Perches static void *get_mq(struct ctl_table *table)
18bdc8e5f8SSerge E. Hallyn {
19bdc8e5f8SSerge E. Hallyn 	char *which = table->data;
20bdc8e5f8SSerge E. Hallyn 	struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
21bdc8e5f8SSerge E. Hallyn 	which = (which - (char *)&init_ipc_ns) + (char *)ipc_ns;
22bdc8e5f8SSerge E. Hallyn 	return which;
23bdc8e5f8SSerge E. Hallyn }
24bdc8e5f8SSerge E. Hallyn 
25*a5c5928bSJoe Perches static int proc_mq_dointvec(struct ctl_table *table, int write,
26f3713fd9SDavidlohr Bueso 			    void __user *buffer, size_t *lenp, loff_t *ppos)
27f3713fd9SDavidlohr Bueso {
28f3713fd9SDavidlohr Bueso 	struct ctl_table mq_table;
29f3713fd9SDavidlohr Bueso 	memcpy(&mq_table, table, sizeof(mq_table));
30f3713fd9SDavidlohr Bueso 	mq_table.data = get_mq(table);
31f3713fd9SDavidlohr Bueso 
32f3713fd9SDavidlohr Bueso 	return proc_dointvec(&mq_table, write, buffer, lenp, ppos);
33f3713fd9SDavidlohr Bueso }
34f3713fd9SDavidlohr Bueso 
35*a5c5928bSJoe Perches static int proc_mq_dointvec_minmax(struct ctl_table *table, int write,
368d65af78SAlexey Dobriyan 	void __user *buffer, size_t *lenp, loff_t *ppos)
37bdc8e5f8SSerge E. Hallyn {
38bdc8e5f8SSerge E. Hallyn 	struct ctl_table mq_table;
39bdc8e5f8SSerge E. Hallyn 	memcpy(&mq_table, table, sizeof(mq_table));
40bdc8e5f8SSerge E. Hallyn 	mq_table.data = get_mq(table);
41bdc8e5f8SSerge E. Hallyn 
428d65af78SAlexey Dobriyan 	return proc_dointvec_minmax(&mq_table, write, buffer,
43bdc8e5f8SSerge E. Hallyn 					lenp, ppos);
44bdc8e5f8SSerge E. Hallyn }
45bdc8e5f8SSerge E. Hallyn #else
46f3713fd9SDavidlohr Bueso #define proc_mq_dointvec NULL
47bdc8e5f8SSerge E. Hallyn #define proc_mq_dointvec_minmax NULL
48bdc8e5f8SSerge E. Hallyn #endif
49bdc8e5f8SSerge E. Hallyn 
50bdc8e5f8SSerge E. Hallyn static int msg_max_limit_min = MIN_MSGMAX;
5193e6f119SDoug Ledford static int msg_max_limit_max = HARD_MSGMAX;
52bdc8e5f8SSerge E. Hallyn 
53bdc8e5f8SSerge E. Hallyn static int msg_maxsize_limit_min = MIN_MSGSIZEMAX;
5493e6f119SDoug Ledford static int msg_maxsize_limit_max = HARD_MSGSIZEMAX;
55bdc8e5f8SSerge E. Hallyn 
56*a5c5928bSJoe Perches static struct ctl_table mq_sysctls[] = {
57bdc8e5f8SSerge E. Hallyn 	{
58bdc8e5f8SSerge E. Hallyn 		.procname	= "queues_max",
59bdc8e5f8SSerge E. Hallyn 		.data		= &init_ipc_ns.mq_queues_max,
60bdc8e5f8SSerge E. Hallyn 		.maxlen		= sizeof(int),
61bdc8e5f8SSerge E. Hallyn 		.mode		= 0644,
62f3713fd9SDavidlohr Bueso 		.proc_handler	= proc_mq_dointvec,
63bdc8e5f8SSerge E. Hallyn 	},
64bdc8e5f8SSerge E. Hallyn 	{
65bdc8e5f8SSerge E. Hallyn 		.procname	= "msg_max",
66bdc8e5f8SSerge E. Hallyn 		.data		= &init_ipc_ns.mq_msg_max,
67bdc8e5f8SSerge E. Hallyn 		.maxlen		= sizeof(int),
68bdc8e5f8SSerge E. Hallyn 		.mode		= 0644,
69bdc8e5f8SSerge E. Hallyn 		.proc_handler	= proc_mq_dointvec_minmax,
70bdc8e5f8SSerge E. Hallyn 		.extra1		= &msg_max_limit_min,
71bdc8e5f8SSerge E. Hallyn 		.extra2		= &msg_max_limit_max,
72bdc8e5f8SSerge E. Hallyn 	},
73bdc8e5f8SSerge E. Hallyn 	{
74bdc8e5f8SSerge E. Hallyn 		.procname	= "msgsize_max",
75bdc8e5f8SSerge E. Hallyn 		.data		= &init_ipc_ns.mq_msgsize_max,
76bdc8e5f8SSerge E. Hallyn 		.maxlen		= sizeof(int),
77bdc8e5f8SSerge E. Hallyn 		.mode		= 0644,
78bdc8e5f8SSerge E. Hallyn 		.proc_handler	= proc_mq_dointvec_minmax,
79bdc8e5f8SSerge E. Hallyn 		.extra1		= &msg_maxsize_limit_min,
80bdc8e5f8SSerge E. Hallyn 		.extra2		= &msg_maxsize_limit_max,
81bdc8e5f8SSerge E. Hallyn 	},
82cef0184cSKOSAKI Motohiro 	{
83cef0184cSKOSAKI Motohiro 		.procname	= "msg_default",
84cef0184cSKOSAKI Motohiro 		.data		= &init_ipc_ns.mq_msg_default,
85cef0184cSKOSAKI Motohiro 		.maxlen		= sizeof(int),
86cef0184cSKOSAKI Motohiro 		.mode		= 0644,
87cef0184cSKOSAKI Motohiro 		.proc_handler	= proc_mq_dointvec_minmax,
88cef0184cSKOSAKI Motohiro 		.extra1		= &msg_max_limit_min,
89cef0184cSKOSAKI Motohiro 		.extra2		= &msg_max_limit_max,
90cef0184cSKOSAKI Motohiro 	},
91cef0184cSKOSAKI Motohiro 	{
92cef0184cSKOSAKI Motohiro 		.procname	= "msgsize_default",
93cef0184cSKOSAKI Motohiro 		.data		= &init_ipc_ns.mq_msgsize_default,
94cef0184cSKOSAKI Motohiro 		.maxlen		= sizeof(int),
95cef0184cSKOSAKI Motohiro 		.mode		= 0644,
96cef0184cSKOSAKI Motohiro 		.proc_handler	= proc_mq_dointvec_minmax,
97cef0184cSKOSAKI Motohiro 		.extra1		= &msg_maxsize_limit_min,
98cef0184cSKOSAKI Motohiro 		.extra2		= &msg_maxsize_limit_max,
99cef0184cSKOSAKI Motohiro 	},
1002bc4657cSEric W. Biederman 	{}
101bdc8e5f8SSerge E. Hallyn };
102bdc8e5f8SSerge E. Hallyn 
103*a5c5928bSJoe Perches static struct ctl_table mq_sysctl_dir[] = {
104bdc8e5f8SSerge E. Hallyn 	{
105bdc8e5f8SSerge E. Hallyn 		.procname	= "mqueue",
106bdc8e5f8SSerge E. Hallyn 		.mode		= 0555,
107bdc8e5f8SSerge E. Hallyn 		.child		= mq_sysctls,
108bdc8e5f8SSerge E. Hallyn 	},
1092bc4657cSEric W. Biederman 	{}
110bdc8e5f8SSerge E. Hallyn };
111bdc8e5f8SSerge E. Hallyn 
112*a5c5928bSJoe Perches static struct ctl_table mq_sysctl_root[] = {
113bdc8e5f8SSerge E. Hallyn 	{
114bdc8e5f8SSerge E. Hallyn 		.procname	= "fs",
115bdc8e5f8SSerge E. Hallyn 		.mode		= 0555,
116bdc8e5f8SSerge E. Hallyn 		.child		= mq_sysctl_dir,
117bdc8e5f8SSerge E. Hallyn 	},
1182bc4657cSEric W. Biederman 	{}
119bdc8e5f8SSerge E. Hallyn };
120bdc8e5f8SSerge E. Hallyn 
121bdc8e5f8SSerge E. Hallyn struct ctl_table_header *mq_register_sysctl_table(void)
122bdc8e5f8SSerge E. Hallyn {
123bdc8e5f8SSerge E. Hallyn 	return register_sysctl_table(mq_sysctl_root);
124bdc8e5f8SSerge E. Hallyn }
125