forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.7 KiB
120 lines
2.7 KiB
// SPDX-License-Identifier: GPL-2.0-only |
|
/* |
|
* Copyright (C) 2007 IBM Corporation |
|
* |
|
* Author: Cedric Le Goater <[email protected]> |
|
*/ |
|
|
|
#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); |
|
}
|
|
|