1bdc8e5f8SSerge E. Hallyn /* 2bdc8e5f8SSerge E. Hallyn * Copyright (C) 2007 IBM Corporation 3bdc8e5f8SSerge E. Hallyn * 4bdc8e5f8SSerge E. Hallyn * Author: Cedric Le Goater <[email protected]> 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 17bdc8e5f8SSerge E. Hallyn static void *get_mq(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 25bdc8e5f8SSerge E. Hallyn static int proc_mq_dointvec_minmax(ctl_table *table, int write, 268d65af78SAlexey Dobriyan void __user *buffer, size_t *lenp, loff_t *ppos) 27bdc8e5f8SSerge E. Hallyn { 28bdc8e5f8SSerge E. Hallyn struct ctl_table mq_table; 29bdc8e5f8SSerge E. Hallyn memcpy(&mq_table, table, sizeof(mq_table)); 30bdc8e5f8SSerge E. Hallyn mq_table.data = get_mq(table); 31bdc8e5f8SSerge E. Hallyn 328d65af78SAlexey Dobriyan return proc_dointvec_minmax(&mq_table, write, buffer, 33bdc8e5f8SSerge E. Hallyn lenp, ppos); 34bdc8e5f8SSerge E. Hallyn } 35bdc8e5f8SSerge E. Hallyn #else 36bdc8e5f8SSerge E. Hallyn #define proc_mq_dointvec_minmax NULL 37bdc8e5f8SSerge E. Hallyn #endif 38bdc8e5f8SSerge E. Hallyn 3993e6f119SDoug Ledford static int msg_queues_limit_min = MIN_QUEUESMAX; 4093e6f119SDoug Ledford static int msg_queues_limit_max = HARD_QUEUESMAX; 4193e6f119SDoug Ledford 42bdc8e5f8SSerge E. Hallyn static int msg_max_limit_min = MIN_MSGMAX; 4393e6f119SDoug Ledford static int msg_max_limit_max = HARD_MSGMAX; 44bdc8e5f8SSerge E. Hallyn 45bdc8e5f8SSerge E. Hallyn static int msg_maxsize_limit_min = MIN_MSGSIZEMAX; 4693e6f119SDoug Ledford static int msg_maxsize_limit_max = HARD_MSGSIZEMAX; 47bdc8e5f8SSerge E. Hallyn 48bdc8e5f8SSerge E. Hallyn static ctl_table mq_sysctls[] = { 49bdc8e5f8SSerge E. Hallyn { 50bdc8e5f8SSerge E. Hallyn .procname = "queues_max", 51bdc8e5f8SSerge E. Hallyn .data = &init_ipc_ns.mq_queues_max, 52bdc8e5f8SSerge E. Hallyn .maxlen = sizeof(int), 53bdc8e5f8SSerge E. Hallyn .mode = 0644, 5493e6f119SDoug Ledford .proc_handler = proc_mq_dointvec_minmax, 5593e6f119SDoug Ledford .extra1 = &msg_queues_limit_min, 5693e6f119SDoug Ledford .extra2 = &msg_queues_limit_max, 57bdc8e5f8SSerge E. Hallyn }, 58bdc8e5f8SSerge E. Hallyn { 59bdc8e5f8SSerge E. Hallyn .procname = "msg_max", 60bdc8e5f8SSerge E. Hallyn .data = &init_ipc_ns.mq_msg_max, 61bdc8e5f8SSerge E. Hallyn .maxlen = sizeof(int), 62bdc8e5f8SSerge E. Hallyn .mode = 0644, 63bdc8e5f8SSerge E. Hallyn .proc_handler = proc_mq_dointvec_minmax, 64bdc8e5f8SSerge E. Hallyn .extra1 = &msg_max_limit_min, 65bdc8e5f8SSerge E. Hallyn .extra2 = &msg_max_limit_max, 66bdc8e5f8SSerge E. Hallyn }, 67bdc8e5f8SSerge E. Hallyn { 68bdc8e5f8SSerge E. Hallyn .procname = "msgsize_max", 69bdc8e5f8SSerge E. Hallyn .data = &init_ipc_ns.mq_msgsize_max, 70bdc8e5f8SSerge E. Hallyn .maxlen = sizeof(int), 71bdc8e5f8SSerge E. Hallyn .mode = 0644, 72bdc8e5f8SSerge E. Hallyn .proc_handler = proc_mq_dointvec_minmax, 73bdc8e5f8SSerge E. Hallyn .extra1 = &msg_maxsize_limit_min, 74bdc8e5f8SSerge E. Hallyn .extra2 = &msg_maxsize_limit_max, 75bdc8e5f8SSerge E. Hallyn }, 76*cef0184cSKOSAKI Motohiro { 77*cef0184cSKOSAKI Motohiro .procname = "msg_default", 78*cef0184cSKOSAKI Motohiro .data = &init_ipc_ns.mq_msg_default, 79*cef0184cSKOSAKI Motohiro .maxlen = sizeof(int), 80*cef0184cSKOSAKI Motohiro .mode = 0644, 81*cef0184cSKOSAKI Motohiro .proc_handler = proc_mq_dointvec_minmax, 82*cef0184cSKOSAKI Motohiro .extra1 = &msg_max_limit_min, 83*cef0184cSKOSAKI Motohiro .extra2 = &msg_max_limit_max, 84*cef0184cSKOSAKI Motohiro }, 85*cef0184cSKOSAKI Motohiro { 86*cef0184cSKOSAKI Motohiro .procname = "msgsize_default", 87*cef0184cSKOSAKI Motohiro .data = &init_ipc_ns.mq_msgsize_default, 88*cef0184cSKOSAKI Motohiro .maxlen = sizeof(int), 89*cef0184cSKOSAKI Motohiro .mode = 0644, 90*cef0184cSKOSAKI Motohiro .proc_handler = proc_mq_dointvec_minmax, 91*cef0184cSKOSAKI Motohiro .extra1 = &msg_maxsize_limit_min, 92*cef0184cSKOSAKI Motohiro .extra2 = &msg_maxsize_limit_max, 93*cef0184cSKOSAKI Motohiro }, 942bc4657cSEric W. Biederman {} 95bdc8e5f8SSerge E. Hallyn }; 96bdc8e5f8SSerge E. Hallyn 97bdc8e5f8SSerge E. Hallyn static ctl_table mq_sysctl_dir[] = { 98bdc8e5f8SSerge E. Hallyn { 99bdc8e5f8SSerge E. Hallyn .procname = "mqueue", 100bdc8e5f8SSerge E. Hallyn .mode = 0555, 101bdc8e5f8SSerge E. Hallyn .child = mq_sysctls, 102bdc8e5f8SSerge E. Hallyn }, 1032bc4657cSEric W. Biederman {} 104bdc8e5f8SSerge E. Hallyn }; 105bdc8e5f8SSerge E. Hallyn 106bdc8e5f8SSerge E. Hallyn static ctl_table mq_sysctl_root[] = { 107bdc8e5f8SSerge E. Hallyn { 108bdc8e5f8SSerge E. Hallyn .procname = "fs", 109bdc8e5f8SSerge E. Hallyn .mode = 0555, 110bdc8e5f8SSerge E. Hallyn .child = mq_sysctl_dir, 111bdc8e5f8SSerge E. Hallyn }, 1122bc4657cSEric W. Biederman {} 113bdc8e5f8SSerge E. Hallyn }; 114bdc8e5f8SSerge E. Hallyn 115bdc8e5f8SSerge E. Hallyn struct ctl_table_header *mq_register_sysctl_table(void) 116bdc8e5f8SSerge E. Hallyn { 117bdc8e5f8SSerge E. Hallyn return register_sysctl_table(mq_sysctl_root); 118bdc8e5f8SSerge E. Hallyn } 119