18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  Copyright (C) 2007 IBM Corporation
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *  Author: Cedric Le Goater <clg@fr.ibm.com>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/nsproxy.h>
98c2ecf20Sopenharmony_ci#include <linux/ipc_namespace.h>
108c2ecf20Sopenharmony_ci#include <linux/sysctl.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#ifdef CONFIG_PROC_SYSCTL
138c2ecf20Sopenharmony_cistatic void *get_mq(struct ctl_table *table)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	char *which = table->data;
168c2ecf20Sopenharmony_ci	struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
178c2ecf20Sopenharmony_ci	which = (which - (char *)&init_ipc_ns) + (char *)ipc_ns;
188c2ecf20Sopenharmony_ci	return which;
198c2ecf20Sopenharmony_ci}
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistatic int proc_mq_dointvec(struct ctl_table *table, int write,
228c2ecf20Sopenharmony_ci			    void *buffer, size_t *lenp, loff_t *ppos)
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	struct ctl_table mq_table;
258c2ecf20Sopenharmony_ci	memcpy(&mq_table, table, sizeof(mq_table));
268c2ecf20Sopenharmony_ci	mq_table.data = get_mq(table);
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	return proc_dointvec(&mq_table, write, buffer, lenp, ppos);
298c2ecf20Sopenharmony_ci}
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistatic int proc_mq_dointvec_minmax(struct ctl_table *table, int write,
328c2ecf20Sopenharmony_ci		void *buffer, size_t *lenp, loff_t *ppos)
338c2ecf20Sopenharmony_ci{
348c2ecf20Sopenharmony_ci	struct ctl_table mq_table;
358c2ecf20Sopenharmony_ci	memcpy(&mq_table, table, sizeof(mq_table));
368c2ecf20Sopenharmony_ci	mq_table.data = get_mq(table);
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	return proc_dointvec_minmax(&mq_table, write, buffer,
398c2ecf20Sopenharmony_ci					lenp, ppos);
408c2ecf20Sopenharmony_ci}
418c2ecf20Sopenharmony_ci#else
428c2ecf20Sopenharmony_ci#define proc_mq_dointvec NULL
438c2ecf20Sopenharmony_ci#define proc_mq_dointvec_minmax NULL
448c2ecf20Sopenharmony_ci#endif
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cistatic int msg_max_limit_min = MIN_MSGMAX;
478c2ecf20Sopenharmony_cistatic int msg_max_limit_max = HARD_MSGMAX;
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_cistatic int msg_maxsize_limit_min = MIN_MSGSIZEMAX;
508c2ecf20Sopenharmony_cistatic int msg_maxsize_limit_max = HARD_MSGSIZEMAX;
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistatic struct ctl_table mq_sysctls[] = {
538c2ecf20Sopenharmony_ci	{
548c2ecf20Sopenharmony_ci		.procname	= "queues_max",
558c2ecf20Sopenharmony_ci		.data		= &init_ipc_ns.mq_queues_max,
568c2ecf20Sopenharmony_ci		.maxlen		= sizeof(int),
578c2ecf20Sopenharmony_ci		.mode		= 0644,
588c2ecf20Sopenharmony_ci		.proc_handler	= proc_mq_dointvec,
598c2ecf20Sopenharmony_ci	},
608c2ecf20Sopenharmony_ci	{
618c2ecf20Sopenharmony_ci		.procname	= "msg_max",
628c2ecf20Sopenharmony_ci		.data		= &init_ipc_ns.mq_msg_max,
638c2ecf20Sopenharmony_ci		.maxlen		= sizeof(int),
648c2ecf20Sopenharmony_ci		.mode		= 0644,
658c2ecf20Sopenharmony_ci		.proc_handler	= proc_mq_dointvec_minmax,
668c2ecf20Sopenharmony_ci		.extra1		= &msg_max_limit_min,
678c2ecf20Sopenharmony_ci		.extra2		= &msg_max_limit_max,
688c2ecf20Sopenharmony_ci	},
698c2ecf20Sopenharmony_ci	{
708c2ecf20Sopenharmony_ci		.procname	= "msgsize_max",
718c2ecf20Sopenharmony_ci		.data		= &init_ipc_ns.mq_msgsize_max,
728c2ecf20Sopenharmony_ci		.maxlen		= sizeof(int),
738c2ecf20Sopenharmony_ci		.mode		= 0644,
748c2ecf20Sopenharmony_ci		.proc_handler	= proc_mq_dointvec_minmax,
758c2ecf20Sopenharmony_ci		.extra1		= &msg_maxsize_limit_min,
768c2ecf20Sopenharmony_ci		.extra2		= &msg_maxsize_limit_max,
778c2ecf20Sopenharmony_ci	},
788c2ecf20Sopenharmony_ci	{
798c2ecf20Sopenharmony_ci		.procname	= "msg_default",
808c2ecf20Sopenharmony_ci		.data		= &init_ipc_ns.mq_msg_default,
818c2ecf20Sopenharmony_ci		.maxlen		= sizeof(int),
828c2ecf20Sopenharmony_ci		.mode		= 0644,
838c2ecf20Sopenharmony_ci		.proc_handler	= proc_mq_dointvec_minmax,
848c2ecf20Sopenharmony_ci		.extra1		= &msg_max_limit_min,
858c2ecf20Sopenharmony_ci		.extra2		= &msg_max_limit_max,
868c2ecf20Sopenharmony_ci	},
878c2ecf20Sopenharmony_ci	{
888c2ecf20Sopenharmony_ci		.procname	= "msgsize_default",
898c2ecf20Sopenharmony_ci		.data		= &init_ipc_ns.mq_msgsize_default,
908c2ecf20Sopenharmony_ci		.maxlen		= sizeof(int),
918c2ecf20Sopenharmony_ci		.mode		= 0644,
928c2ecf20Sopenharmony_ci		.proc_handler	= proc_mq_dointvec_minmax,
938c2ecf20Sopenharmony_ci		.extra1		= &msg_maxsize_limit_min,
948c2ecf20Sopenharmony_ci		.extra2		= &msg_maxsize_limit_max,
958c2ecf20Sopenharmony_ci	},
968c2ecf20Sopenharmony_ci	{}
978c2ecf20Sopenharmony_ci};
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_cistatic struct ctl_table mq_sysctl_dir[] = {
1008c2ecf20Sopenharmony_ci	{
1018c2ecf20Sopenharmony_ci		.procname	= "mqueue",
1028c2ecf20Sopenharmony_ci		.mode		= 0555,
1038c2ecf20Sopenharmony_ci		.child		= mq_sysctls,
1048c2ecf20Sopenharmony_ci	},
1058c2ecf20Sopenharmony_ci	{}
1068c2ecf20Sopenharmony_ci};
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_cistatic struct ctl_table mq_sysctl_root[] = {
1098c2ecf20Sopenharmony_ci	{
1108c2ecf20Sopenharmony_ci		.procname	= "fs",
1118c2ecf20Sopenharmony_ci		.mode		= 0555,
1128c2ecf20Sopenharmony_ci		.child		= mq_sysctl_dir,
1138c2ecf20Sopenharmony_ci	},
1148c2ecf20Sopenharmony_ci	{}
1158c2ecf20Sopenharmony_ci};
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_cistruct ctl_table_header *mq_register_sysctl_table(void)
1188c2ecf20Sopenharmony_ci{
1198c2ecf20Sopenharmony_ci	return register_sysctl_table(mq_sysctl_root);
1208c2ecf20Sopenharmony_ci}
121