Replace the mq_sysctls array copy with a sysctl context kept in the ctl_table_header. Flag each entry with CTL_TABLE_F_CTX_DATA to overlay the ctl_table entry before calling the proc_handler. Signed-off-by: Joel Granados --- ipc/mq_sysctl.c | 44 ++++++++++---------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/ipc/mq_sysctl.c b/ipc/mq_sysctl.c index 0dd12e1c9f53ef07092ca3b638335a438d273a8c..9919e2d3a11a48a3e84c6c42d564e71dd60711da 100644 --- a/ipc/mq_sysctl.c +++ b/ipc/mq_sysctl.c @@ -11,7 +11,6 @@ #include #include -#include #include static int msg_max_limit_min = MIN_MSGMAX; @@ -26,6 +25,7 @@ static const struct ctl_table mq_sysctls[] = { .data = &init_ipc_ns.mq_queues_max, .maxlen = sizeof(int), .mode = 0644, + .flags = CTL_TABLE_F_CTX_DATA, .proc_handler = proc_dointvec, }, { @@ -33,6 +33,7 @@ static const struct ctl_table mq_sysctls[] = { .data = &init_ipc_ns.mq_msg_max, .maxlen = sizeof(int), .mode = 0644, + .flags = CTL_TABLE_F_CTX_DATA, .proc_handler = proc_dointvec_minmax, .extra1 = &msg_max_limit_min, .extra2 = &msg_max_limit_max, @@ -42,6 +43,7 @@ static const struct ctl_table mq_sysctls[] = { .data = &init_ipc_ns.mq_msgsize_max, .maxlen = sizeof(int), .mode = 0644, + .flags = CTL_TABLE_F_CTX_DATA, .proc_handler = proc_dointvec_minmax, .extra1 = &msg_maxsize_limit_min, .extra2 = &msg_maxsize_limit_max, @@ -51,6 +53,7 @@ static const struct ctl_table mq_sysctls[] = { .data = &init_ipc_ns.mq_msg_default, .maxlen = sizeof(int), .mode = 0644, + .flags = CTL_TABLE_F_CTX_DATA, .proc_handler = proc_dointvec_minmax, .extra1 = &msg_max_limit_min, .extra2 = &msg_max_limit_max, @@ -60,6 +63,7 @@ static const struct ctl_table mq_sysctls[] = { .data = &init_ipc_ns.mq_msgsize_default, .maxlen = sizeof(int), .mode = 0644, + .flags = CTL_TABLE_F_CTX_DATA, .proc_handler = proc_dointvec_minmax, .extra1 = &msg_maxsize_limit_min, .extra2 = &msg_maxsize_limit_max, @@ -116,39 +120,15 @@ static struct ctl_table_root set_root = { bool setup_mq_sysctls(struct ipc_namespace *ns) { - struct ctl_table *tbl; + struct sysctl_context ctx = SYSCTL_CTX(ns, &init_ipc_ns); setup_sysctl_set(&ns->mq_set, &set_root, set_is_seen); - tbl = kmemdup(mq_sysctls, sizeof(mq_sysctls), GFP_KERNEL); - if (tbl) { - int i; - - for (i = 0; i < ARRAY_SIZE(mq_sysctls); i++) { - if (tbl[i].data == &init_ipc_ns.mq_queues_max) - tbl[i].data = &ns->mq_queues_max; - - else if (tbl[i].data == &init_ipc_ns.mq_msg_max) - tbl[i].data = &ns->mq_msg_max; - - else if (tbl[i].data == &init_ipc_ns.mq_msgsize_max) - tbl[i].data = &ns->mq_msgsize_max; - - else if (tbl[i].data == &init_ipc_ns.mq_msg_default) - tbl[i].data = &ns->mq_msg_default; - - else if (tbl[i].data == &init_ipc_ns.mq_msgsize_default) - tbl[i].data = &ns->mq_msgsize_default; - else - tbl[i].data = NULL; - } - - ns->mq_sysctls = __register_sysctl_table(&ns->mq_set, - "fs/mqueue", tbl, - ARRAY_SIZE(mq_sysctls)); - } + ns->mq_sysctls = __register_sysctl_table_ctx(&ns->mq_set, "fs/mqueue", + mq_sysctls, + ARRAY_SIZE(mq_sysctls), + &ctx); if (!ns->mq_sysctls) { - kfree(tbl); retire_sysctl_set(&ns->mq_set); return false; } @@ -158,10 +138,6 @@ bool setup_mq_sysctls(struct ipc_namespace *ns) void retire_mq_sysctls(struct ipc_namespace *ns) { - const struct ctl_table *tbl; - - tbl = ns->mq_sysctls->ctl_table_arg; unregister_sysctl_table(ns->mq_sysctls); retire_sysctl_set(&ns->mq_set); - kfree(tbl); } -- 2.50.1