1b886d83cSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2bdc8e5f8SSerge E. Hallyn /* 3bdc8e5f8SSerge E. Hallyn * Copyright (C) 2007 IBM Corporation 4bdc8e5f8SSerge E. Hallyn * 5bdc8e5f8SSerge E. Hallyn * Author: Cedric Le Goater <[email protected]> 6bdc8e5f8SSerge E. Hallyn */ 7bdc8e5f8SSerge E. Hallyn 8bdc8e5f8SSerge E. Hallyn #include <linux/nsproxy.h> 9bdc8e5f8SSerge E. Hallyn #include <linux/ipc_namespace.h> 10bdc8e5f8SSerge E. Hallyn #include <linux/sysctl.h> 11bdc8e5f8SSerge E. Hallyn 12*dc55e35fSAlexey Gladkov #include <linux/stat.h> 13*dc55e35fSAlexey Gladkov #include <linux/capability.h> 14*dc55e35fSAlexey Gladkov #include <linux/slab.h> 15bdc8e5f8SSerge E. Hallyn 16bdc8e5f8SSerge E. Hallyn static int msg_max_limit_min = MIN_MSGMAX; 1793e6f119SDoug Ledford static int msg_max_limit_max = HARD_MSGMAX; 18bdc8e5f8SSerge E. Hallyn 19bdc8e5f8SSerge E. Hallyn static int msg_maxsize_limit_min = MIN_MSGSIZEMAX; 2093e6f119SDoug Ledford static int msg_maxsize_limit_max = HARD_MSGSIZEMAX; 21bdc8e5f8SSerge E. Hallyn 22a5c5928bSJoe Perches static struct ctl_table mq_sysctls[] = { 23bdc8e5f8SSerge E. Hallyn { 24bdc8e5f8SSerge E. Hallyn .procname = "queues_max", 25bdc8e5f8SSerge E. Hallyn .data = &init_ipc_ns.mq_queues_max, 26bdc8e5f8SSerge E. Hallyn .maxlen = sizeof(int), 27bdc8e5f8SSerge E. Hallyn .mode = 0644, 28*dc55e35fSAlexey Gladkov .proc_handler = proc_dointvec, 29bdc8e5f8SSerge E. Hallyn }, 30bdc8e5f8SSerge E. Hallyn { 31bdc8e5f8SSerge E. Hallyn .procname = "msg_max", 32bdc8e5f8SSerge E. Hallyn .data = &init_ipc_ns.mq_msg_max, 33bdc8e5f8SSerge E. Hallyn .maxlen = sizeof(int), 34bdc8e5f8SSerge E. Hallyn .mode = 0644, 35*dc55e35fSAlexey Gladkov .proc_handler = proc_dointvec_minmax, 36bdc8e5f8SSerge E. Hallyn .extra1 = &msg_max_limit_min, 37bdc8e5f8SSerge E. Hallyn .extra2 = &msg_max_limit_max, 38bdc8e5f8SSerge E. Hallyn }, 39bdc8e5f8SSerge E. Hallyn { 40bdc8e5f8SSerge E. Hallyn .procname = "msgsize_max", 41bdc8e5f8SSerge E. Hallyn .data = &init_ipc_ns.mq_msgsize_max, 42bdc8e5f8SSerge E. Hallyn .maxlen = sizeof(int), 43bdc8e5f8SSerge E. Hallyn .mode = 0644, 44*dc55e35fSAlexey Gladkov .proc_handler = proc_dointvec_minmax, 45bdc8e5f8SSerge E. Hallyn .extra1 = &msg_maxsize_limit_min, 46bdc8e5f8SSerge E. Hallyn .extra2 = &msg_maxsize_limit_max, 47bdc8e5f8SSerge E. Hallyn }, 48cef0184cSKOSAKI Motohiro { 49cef0184cSKOSAKI Motohiro .procname = "msg_default", 50cef0184cSKOSAKI Motohiro .data = &init_ipc_ns.mq_msg_default, 51cef0184cSKOSAKI Motohiro .maxlen = sizeof(int), 52cef0184cSKOSAKI Motohiro .mode = 0644, 53*dc55e35fSAlexey Gladkov .proc_handler = proc_dointvec_minmax, 54cef0184cSKOSAKI Motohiro .extra1 = &msg_max_limit_min, 55cef0184cSKOSAKI Motohiro .extra2 = &msg_max_limit_max, 56cef0184cSKOSAKI Motohiro }, 57cef0184cSKOSAKI Motohiro { 58cef0184cSKOSAKI Motohiro .procname = "msgsize_default", 59cef0184cSKOSAKI Motohiro .data = &init_ipc_ns.mq_msgsize_default, 60cef0184cSKOSAKI Motohiro .maxlen = sizeof(int), 61cef0184cSKOSAKI Motohiro .mode = 0644, 62*dc55e35fSAlexey Gladkov .proc_handler = proc_dointvec_minmax, 63cef0184cSKOSAKI Motohiro .extra1 = &msg_maxsize_limit_min, 64cef0184cSKOSAKI Motohiro .extra2 = &msg_maxsize_limit_max, 65cef0184cSKOSAKI Motohiro }, 662bc4657cSEric W. Biederman {} 67bdc8e5f8SSerge E. Hallyn }; 68bdc8e5f8SSerge E. Hallyn 69*dc55e35fSAlexey Gladkov static struct ctl_table_set *set_lookup(struct ctl_table_root *root) 70bdc8e5f8SSerge E. Hallyn { 71*dc55e35fSAlexey Gladkov return ¤t->nsproxy->ipc_ns->mq_set; 72*dc55e35fSAlexey Gladkov } 73*dc55e35fSAlexey Gladkov 74*dc55e35fSAlexey Gladkov static int set_is_seen(struct ctl_table_set *set) 75*dc55e35fSAlexey Gladkov { 76*dc55e35fSAlexey Gladkov return ¤t->nsproxy->ipc_ns->mq_set == set; 77*dc55e35fSAlexey Gladkov } 78*dc55e35fSAlexey Gladkov 79*dc55e35fSAlexey Gladkov static struct ctl_table_root set_root = { 80*dc55e35fSAlexey Gladkov .lookup = set_lookup, 81bdc8e5f8SSerge E. Hallyn }; 82bdc8e5f8SSerge E. Hallyn 83*dc55e35fSAlexey Gladkov bool setup_mq_sysctls(struct ipc_namespace *ns) 84bdc8e5f8SSerge E. Hallyn { 85*dc55e35fSAlexey Gladkov struct ctl_table *tbl; 86bdc8e5f8SSerge E. Hallyn 87*dc55e35fSAlexey Gladkov setup_sysctl_set(&ns->mq_set, &set_root, set_is_seen); 88*dc55e35fSAlexey Gladkov 89*dc55e35fSAlexey Gladkov tbl = kmemdup(mq_sysctls, sizeof(mq_sysctls), GFP_KERNEL); 90*dc55e35fSAlexey Gladkov if (tbl) { 91*dc55e35fSAlexey Gladkov int i; 92*dc55e35fSAlexey Gladkov 93*dc55e35fSAlexey Gladkov for (i = 0; i < ARRAY_SIZE(mq_sysctls); i++) { 94*dc55e35fSAlexey Gladkov if (tbl[i].data == &init_ipc_ns.mq_queues_max) 95*dc55e35fSAlexey Gladkov tbl[i].data = &ns->mq_queues_max; 96*dc55e35fSAlexey Gladkov 97*dc55e35fSAlexey Gladkov else if (tbl[i].data == &init_ipc_ns.mq_msg_max) 98*dc55e35fSAlexey Gladkov tbl[i].data = &ns->mq_msg_max; 99*dc55e35fSAlexey Gladkov 100*dc55e35fSAlexey Gladkov else if (tbl[i].data == &init_ipc_ns.mq_msgsize_max) 101*dc55e35fSAlexey Gladkov tbl[i].data = &ns->mq_msgsize_max; 102*dc55e35fSAlexey Gladkov 103*dc55e35fSAlexey Gladkov else if (tbl[i].data == &init_ipc_ns.mq_msg_default) 104*dc55e35fSAlexey Gladkov tbl[i].data = &ns->mq_msg_default; 105*dc55e35fSAlexey Gladkov 106*dc55e35fSAlexey Gladkov else if (tbl[i].data == &init_ipc_ns.mq_msgsize_default) 107*dc55e35fSAlexey Gladkov tbl[i].data = &ns->mq_msgsize_default; 108*dc55e35fSAlexey Gladkov else 109*dc55e35fSAlexey Gladkov tbl[i].data = NULL; 110*dc55e35fSAlexey Gladkov } 111*dc55e35fSAlexey Gladkov 112*dc55e35fSAlexey Gladkov ns->mq_sysctls = __register_sysctl_table(&ns->mq_set, "fs/mqueue", tbl); 113*dc55e35fSAlexey Gladkov } 114*dc55e35fSAlexey Gladkov if (!ns->mq_sysctls) { 115*dc55e35fSAlexey Gladkov kfree(tbl); 116*dc55e35fSAlexey Gladkov retire_sysctl_set(&ns->mq_set); 117*dc55e35fSAlexey Gladkov return false; 118*dc55e35fSAlexey Gladkov } 119*dc55e35fSAlexey Gladkov 120*dc55e35fSAlexey Gladkov return true; 121*dc55e35fSAlexey Gladkov } 122*dc55e35fSAlexey Gladkov 123*dc55e35fSAlexey Gladkov void retire_mq_sysctls(struct ipc_namespace *ns) 124bdc8e5f8SSerge E. Hallyn { 125*dc55e35fSAlexey Gladkov struct ctl_table *tbl; 126*dc55e35fSAlexey Gladkov 127*dc55e35fSAlexey Gladkov tbl = ns->mq_sysctls->ctl_table_arg; 128*dc55e35fSAlexey Gladkov unregister_sysctl_table(ns->mq_sysctls); 129*dc55e35fSAlexey Gladkov retire_sysctl_set(&ns->mq_set); 130*dc55e35fSAlexey Gladkov kfree(tbl); 131bdc8e5f8SSerge E. Hallyn } 132