1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (C) 2007 IBM Corporation
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Author: Cedric Le Goater <clg@fr.ibm.com>
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <linux/nsproxy.h>
9*4882a593Smuzhiyun #include <linux/ipc_namespace.h>
10*4882a593Smuzhiyun #include <linux/sysctl.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #ifdef CONFIG_PROC_SYSCTL
get_mq(struct ctl_table * table)13*4882a593Smuzhiyun static void *get_mq(struct ctl_table *table)
14*4882a593Smuzhiyun {
15*4882a593Smuzhiyun char *which = table->data;
16*4882a593Smuzhiyun struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
17*4882a593Smuzhiyun which = (which - (char *)&init_ipc_ns) + (char *)ipc_ns;
18*4882a593Smuzhiyun return which;
19*4882a593Smuzhiyun }
20*4882a593Smuzhiyun
proc_mq_dointvec(struct ctl_table * table,int write,void * buffer,size_t * lenp,loff_t * ppos)21*4882a593Smuzhiyun static int proc_mq_dointvec(struct ctl_table *table, int write,
22*4882a593Smuzhiyun void *buffer, size_t *lenp, loff_t *ppos)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun struct ctl_table mq_table;
25*4882a593Smuzhiyun memcpy(&mq_table, table, sizeof(mq_table));
26*4882a593Smuzhiyun mq_table.data = get_mq(table);
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun return proc_dointvec(&mq_table, write, buffer, lenp, ppos);
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun
proc_mq_dointvec_minmax(struct ctl_table * table,int write,void * buffer,size_t * lenp,loff_t * ppos)31*4882a593Smuzhiyun static int proc_mq_dointvec_minmax(struct ctl_table *table, int write,
32*4882a593Smuzhiyun void *buffer, size_t *lenp, loff_t *ppos)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun struct ctl_table mq_table;
35*4882a593Smuzhiyun memcpy(&mq_table, table, sizeof(mq_table));
36*4882a593Smuzhiyun mq_table.data = get_mq(table);
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun return proc_dointvec_minmax(&mq_table, write, buffer,
39*4882a593Smuzhiyun lenp, ppos);
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun #else
42*4882a593Smuzhiyun #define proc_mq_dointvec NULL
43*4882a593Smuzhiyun #define proc_mq_dointvec_minmax NULL
44*4882a593Smuzhiyun #endif
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun static int msg_max_limit_min = MIN_MSGMAX;
47*4882a593Smuzhiyun static int msg_max_limit_max = HARD_MSGMAX;
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun static int msg_maxsize_limit_min = MIN_MSGSIZEMAX;
50*4882a593Smuzhiyun static int msg_maxsize_limit_max = HARD_MSGSIZEMAX;
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun static struct ctl_table mq_sysctls[] = {
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun .procname = "queues_max",
55*4882a593Smuzhiyun .data = &init_ipc_ns.mq_queues_max,
56*4882a593Smuzhiyun .maxlen = sizeof(int),
57*4882a593Smuzhiyun .mode = 0644,
58*4882a593Smuzhiyun .proc_handler = proc_mq_dointvec,
59*4882a593Smuzhiyun },
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun .procname = "msg_max",
62*4882a593Smuzhiyun .data = &init_ipc_ns.mq_msg_max,
63*4882a593Smuzhiyun .maxlen = sizeof(int),
64*4882a593Smuzhiyun .mode = 0644,
65*4882a593Smuzhiyun .proc_handler = proc_mq_dointvec_minmax,
66*4882a593Smuzhiyun .extra1 = &msg_max_limit_min,
67*4882a593Smuzhiyun .extra2 = &msg_max_limit_max,
68*4882a593Smuzhiyun },
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun .procname = "msgsize_max",
71*4882a593Smuzhiyun .data = &init_ipc_ns.mq_msgsize_max,
72*4882a593Smuzhiyun .maxlen = sizeof(int),
73*4882a593Smuzhiyun .mode = 0644,
74*4882a593Smuzhiyun .proc_handler = proc_mq_dointvec_minmax,
75*4882a593Smuzhiyun .extra1 = &msg_maxsize_limit_min,
76*4882a593Smuzhiyun .extra2 = &msg_maxsize_limit_max,
77*4882a593Smuzhiyun },
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun .procname = "msg_default",
80*4882a593Smuzhiyun .data = &init_ipc_ns.mq_msg_default,
81*4882a593Smuzhiyun .maxlen = sizeof(int),
82*4882a593Smuzhiyun .mode = 0644,
83*4882a593Smuzhiyun .proc_handler = proc_mq_dointvec_minmax,
84*4882a593Smuzhiyun .extra1 = &msg_max_limit_min,
85*4882a593Smuzhiyun .extra2 = &msg_max_limit_max,
86*4882a593Smuzhiyun },
87*4882a593Smuzhiyun {
88*4882a593Smuzhiyun .procname = "msgsize_default",
89*4882a593Smuzhiyun .data = &init_ipc_ns.mq_msgsize_default,
90*4882a593Smuzhiyun .maxlen = sizeof(int),
91*4882a593Smuzhiyun .mode = 0644,
92*4882a593Smuzhiyun .proc_handler = proc_mq_dointvec_minmax,
93*4882a593Smuzhiyun .extra1 = &msg_maxsize_limit_min,
94*4882a593Smuzhiyun .extra2 = &msg_maxsize_limit_max,
95*4882a593Smuzhiyun },
96*4882a593Smuzhiyun {}
97*4882a593Smuzhiyun };
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun static struct ctl_table mq_sysctl_dir[] = {
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun .procname = "mqueue",
102*4882a593Smuzhiyun .mode = 0555,
103*4882a593Smuzhiyun .child = mq_sysctls,
104*4882a593Smuzhiyun },
105*4882a593Smuzhiyun {}
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun static struct ctl_table mq_sysctl_root[] = {
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun .procname = "fs",
111*4882a593Smuzhiyun .mode = 0555,
112*4882a593Smuzhiyun .child = mq_sysctl_dir,
113*4882a593Smuzhiyun },
114*4882a593Smuzhiyun {}
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun
mq_register_sysctl_table(void)117*4882a593Smuzhiyun struct ctl_table_header *mq_register_sysctl_table(void)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun return register_sysctl_table(mq_sysctl_root);
120*4882a593Smuzhiyun }
121