hc
2023-12-06 d38611ca164021d018c1b23eee65bbebc09c63e0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// SPDX-License-Identifier: GPL-2.0-only
/*
 *  Copyright (C) 2007 IBM Corporation
 *
 *  Author: Cedric Le Goater <clg@fr.ibm.com>
 */
 
#include <linux/nsproxy.h>
#include <linux/ipc_namespace.h>
#include <linux/sysctl.h>
 
#ifdef CONFIG_PROC_SYSCTL
static void *get_mq(struct 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(struct ctl_table *table, int write,
               void *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(&mq_table, write, buffer, lenp, ppos);
}
 
static int proc_mq_dointvec_minmax(struct ctl_table *table, int write,
       void *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 NULL
#define proc_mq_dointvec_minmax NULL
#endif
 
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 struct ctl_table mq_sysctls[] = {
   {
       .procname    = "queues_max",
       .data        = &init_ipc_ns.mq_queues_max,
       .maxlen        = sizeof(int),
       .mode        = 0644,
       .proc_handler    = proc_mq_dointvec,
   },
   {
       .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 struct ctl_table mq_sysctl_dir[] = {
   {
       .procname    = "mqueue",
       .mode        = 0555,
       .child        = mq_sysctls,
   },
   {}
};
 
static struct 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);
}