|  | /* | 
|  | *  Copyright (C) 2007 IBM Corporation | 
|  | * | 
|  | *  Author: Cedric Le Goater <clg@fr.ibm.com> | 
|  | * | 
|  | *  This program is free software; you can redistribute it and/or | 
|  | *  modify it under the terms of the GNU General Public License as | 
|  | *  published by the Free Software Foundation, version 2 of the | 
|  | *  License. | 
|  | */ | 
|  |  | 
|  | #include <linux/nsproxy.h> | 
|  | #include <linux/ipc_namespace.h> | 
|  | #include <linux/sysctl.h> | 
|  |  | 
|  | #ifdef CONFIG_PROC_SYSCTL | 
|  | static void *get_mq(ctl_table *table) | 
|  | { | 
|  | char *which = table->data; | 
|  | struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns; | 
|  | which = (which - (char *)&init_ipc_ns) + (char *)ipc_ns; | 
|  | return which; | 
|  | } | 
|  |  | 
|  | static int proc_mq_dointvec_minmax(ctl_table *table, int write, | 
|  | void __user *buffer, size_t *lenp, loff_t *ppos) | 
|  | { | 
|  | struct ctl_table mq_table; | 
|  | memcpy(&mq_table, table, sizeof(mq_table)); | 
|  | mq_table.data = get_mq(table); | 
|  |  | 
|  | return proc_dointvec_minmax(&mq_table, write, buffer, | 
|  | lenp, ppos); | 
|  | } | 
|  | #else | 
|  | #define proc_mq_dointvec_minmax NULL | 
|  | #endif | 
|  |  | 
|  | static int msg_queues_limit_min = MIN_QUEUESMAX; | 
|  | static int msg_queues_limit_max = HARD_QUEUESMAX; | 
|  |  | 
|  | static int msg_max_limit_min = MIN_MSGMAX; | 
|  | static int msg_max_limit_max = HARD_MSGMAX; | 
|  |  | 
|  | static int msg_maxsize_limit_min = MIN_MSGSIZEMAX; | 
|  | static int msg_maxsize_limit_max = HARD_MSGSIZEMAX; | 
|  |  | 
|  | static ctl_table mq_sysctls[] = { | 
|  | { | 
|  | .procname	= "queues_max", | 
|  | .data		= &init_ipc_ns.mq_queues_max, | 
|  | .maxlen		= sizeof(int), | 
|  | .mode		= 0644, | 
|  | .proc_handler	= proc_mq_dointvec_minmax, | 
|  | .extra1		= &msg_queues_limit_min, | 
|  | .extra2		= &msg_queues_limit_max, | 
|  | }, | 
|  | { | 
|  | .procname	= "msg_max", | 
|  | .data		= &init_ipc_ns.mq_msg_max, | 
|  | .maxlen		= sizeof(int), | 
|  | .mode		= 0644, | 
|  | .proc_handler	= proc_mq_dointvec_minmax, | 
|  | .extra1		= &msg_max_limit_min, | 
|  | .extra2		= &msg_max_limit_max, | 
|  | }, | 
|  | { | 
|  | .procname	= "msgsize_max", | 
|  | .data		= &init_ipc_ns.mq_msgsize_max, | 
|  | .maxlen		= sizeof(int), | 
|  | .mode		= 0644, | 
|  | .proc_handler	= proc_mq_dointvec_minmax, | 
|  | .extra1		= &msg_maxsize_limit_min, | 
|  | .extra2		= &msg_maxsize_limit_max, | 
|  | }, | 
|  | { | 
|  | .procname	= "msg_default", | 
|  | .data		= &init_ipc_ns.mq_msg_default, | 
|  | .maxlen		= sizeof(int), | 
|  | .mode		= 0644, | 
|  | .proc_handler	= proc_mq_dointvec_minmax, | 
|  | .extra1		= &msg_max_limit_min, | 
|  | .extra2		= &msg_max_limit_max, | 
|  | }, | 
|  | { | 
|  | .procname	= "msgsize_default", | 
|  | .data		= &init_ipc_ns.mq_msgsize_default, | 
|  | .maxlen		= sizeof(int), | 
|  | .mode		= 0644, | 
|  | .proc_handler	= proc_mq_dointvec_minmax, | 
|  | .extra1		= &msg_maxsize_limit_min, | 
|  | .extra2		= &msg_maxsize_limit_max, | 
|  | }, | 
|  | {} | 
|  | }; | 
|  |  | 
|  | static ctl_table mq_sysctl_dir[] = { | 
|  | { | 
|  | .procname	= "mqueue", | 
|  | .mode		= 0555, | 
|  | .child		= mq_sysctls, | 
|  | }, | 
|  | {} | 
|  | }; | 
|  |  | 
|  | static ctl_table mq_sysctl_root[] = { | 
|  | { | 
|  | .procname	= "fs", | 
|  | .mode		= 0555, | 
|  | .child		= mq_sysctl_dir, | 
|  | }, | 
|  | {} | 
|  | }; | 
|  |  | 
|  | struct ctl_table_header *mq_register_sysctl_table(void) | 
|  | { | 
|  | return register_sysctl_table(mq_sysctl_root); | 
|  | } |