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