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