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 39*93e6f119SDoug Ledford static int msg_queues_limit_min = MIN_QUEUESMAX; 40*93e6f119SDoug Ledford static int msg_queues_limit_max = HARD_QUEUESMAX; 41*93e6f119SDoug Ledford 42bdc8e5f8SSerge E. Hallyn static int msg_max_limit_min = MIN_MSGMAX; 43*93e6f119SDoug Ledford static int msg_max_limit_max = HARD_MSGMAX; 44bdc8e5f8SSerge E. Hallyn 45bdc8e5f8SSerge E. Hallyn static int msg_maxsize_limit_min = MIN_MSGSIZEMAX; 46*93e6f119SDoug 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, 54*93e6f119SDoug Ledford .proc_handler = proc_mq_dointvec_minmax, 55*93e6f119SDoug Ledford .extra1 = &msg_queues_limit_min, 56*93e6f119SDoug 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 }, 762bc4657cSEric W. Biederman {} 77bdc8e5f8SSerge E. Hallyn }; 78bdc8e5f8SSerge E. Hallyn 79bdc8e5f8SSerge E. Hallyn static ctl_table mq_sysctl_dir[] = { 80bdc8e5f8SSerge E. Hallyn { 81bdc8e5f8SSerge E. Hallyn .procname = "mqueue", 82bdc8e5f8SSerge E. Hallyn .mode = 0555, 83bdc8e5f8SSerge E. Hallyn .child = mq_sysctls, 84bdc8e5f8SSerge E. Hallyn }, 852bc4657cSEric W. Biederman {} 86bdc8e5f8SSerge E. Hallyn }; 87bdc8e5f8SSerge E. Hallyn 88bdc8e5f8SSerge E. Hallyn static ctl_table mq_sysctl_root[] = { 89bdc8e5f8SSerge E. Hallyn { 90bdc8e5f8SSerge E. Hallyn .procname = "fs", 91bdc8e5f8SSerge E. Hallyn .mode = 0555, 92bdc8e5f8SSerge E. Hallyn .child = mq_sysctl_dir, 93bdc8e5f8SSerge E. Hallyn }, 942bc4657cSEric W. Biederman {} 95bdc8e5f8SSerge E. Hallyn }; 96bdc8e5f8SSerge E. Hallyn 97bdc8e5f8SSerge E. Hallyn struct ctl_table_header *mq_register_sysctl_table(void) 98bdc8e5f8SSerge E. Hallyn { 99bdc8e5f8SSerge E. Hallyn return register_sysctl_table(mq_sysctl_root); 100bdc8e5f8SSerge E. Hallyn } 101