Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mq_sysctl.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2007 IBM Corporation
3  *
4  * Author: Cedric Le Goater <[email protected]>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation, version 2 of the
9  * License.
10  */
11 
12 #include <linux/nsproxy.h>
13 #include <linux/ipc_namespace.h>
14 #include <linux/sysctl.h>
15 
16 #ifdef CONFIG_PROC_SYSCTL
17 static void *get_mq(ctl_table *table)
18 {
19  char *which = table->data;
20  struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
21  which = (which - (char *)&init_ipc_ns) + (char *)ipc_ns;
22  return which;
23 }
24 
26  void __user *buffer, size_t *lenp, loff_t *ppos)
27 {
28  struct ctl_table mq_table;
29  memcpy(&mq_table, table, sizeof(mq_table));
30  mq_table.data = get_mq(table);
31 
32  return proc_dointvec_minmax(&mq_table, write, buffer,
33  lenp, ppos);
34 }
35 #else
36 #define proc_mq_dointvec_minmax NULL
37 #endif
38 
39 static int msg_queues_limit_min = MIN_QUEUESMAX;
40 static int msg_queues_limit_max = HARD_QUEUESMAX;
41 
42 static int msg_max_limit_min = MIN_MSGMAX;
43 static int msg_max_limit_max = HARD_MSGMAX;
44 
45 static int msg_maxsize_limit_min = MIN_MSGSIZEMAX;
46 static int msg_maxsize_limit_max = HARD_MSGSIZEMAX;
47 
48 static ctl_table mq_sysctls[] = {
49  {
50  .procname = "queues_max",
51  .data = &init_ipc_ns.mq_queues_max,
52  .maxlen = sizeof(int),
53  .mode = 0644,
55  .extra1 = &msg_queues_limit_min,
56  .extra2 = &msg_queues_limit_max,
57  },
58  {
59  .procname = "msg_max",
60  .data = &init_ipc_ns.mq_msg_max,
61  .maxlen = sizeof(int),
62  .mode = 0644,
64  .extra1 = &msg_max_limit_min,
65  .extra2 = &msg_max_limit_max,
66  },
67  {
68  .procname = "msgsize_max",
69  .data = &init_ipc_ns.mq_msgsize_max,
70  .maxlen = sizeof(int),
71  .mode = 0644,
73  .extra1 = &msg_maxsize_limit_min,
74  .extra2 = &msg_maxsize_limit_max,
75  },
76  {
77  .procname = "msg_default",
78  .data = &init_ipc_ns.mq_msg_default,
79  .maxlen = sizeof(int),
80  .mode = 0644,
82  .extra1 = &msg_max_limit_min,
83  .extra2 = &msg_max_limit_max,
84  },
85  {
86  .procname = "msgsize_default",
87  .data = &init_ipc_ns.mq_msgsize_default,
88  .maxlen = sizeof(int),
89  .mode = 0644,
91  .extra1 = &msg_maxsize_limit_min,
92  .extra2 = &msg_maxsize_limit_max,
93  },
94  {}
95 };
96 
97 static ctl_table mq_sysctl_dir[] = {
98  {
99  .procname = "mqueue",
100  .mode = 0555,
101  .child = mq_sysctls,
102  },
103  {}
104 };
105 
106 static ctl_table mq_sysctl_root[] = {
107  {
108  .procname = "fs",
109  .mode = 0555,
110  .child = mq_sysctl_dir,
111  },
112  {}
113 };
114 
116 {
117  return register_sysctl_table(mq_sysctl_root);
118 }