diff options
Diffstat (limited to 'kernel/sysctl.c')
-rw-r--r-- | kernel/sysctl.c | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 0f1bd83db985..40245d697602 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -194,9 +194,9 @@ static int sysrq_sysctl_handler(ctl_table *table, int write, | |||
194 | static struct ctl_table root_table[]; | 194 | static struct ctl_table root_table[]; |
195 | static struct ctl_table_root sysctl_table_root; | 195 | static struct ctl_table_root sysctl_table_root; |
196 | static struct ctl_table_header root_table_header = { | 196 | static struct ctl_table_header root_table_header = { |
197 | .count = 1, | 197 | {{.count = 1, |
198 | .ctl_table = root_table, | 198 | .ctl_table = root_table, |
199 | .ctl_entry = LIST_HEAD_INIT(sysctl_table_root.default_set.list), | 199 | .ctl_entry = LIST_HEAD_INIT(sysctl_table_root.default_set.list),}}, |
200 | .root = &sysctl_table_root, | 200 | .root = &sysctl_table_root, |
201 | .set = &sysctl_table_root.default_set, | 201 | .set = &sysctl_table_root.default_set, |
202 | }; | 202 | }; |
@@ -361,20 +361,13 @@ static struct ctl_table kern_table[] = { | |||
361 | .mode = 0644, | 361 | .mode = 0644, |
362 | .proc_handler = sched_rt_handler, | 362 | .proc_handler = sched_rt_handler, |
363 | }, | 363 | }, |
364 | { | ||
365 | .procname = "sched_compat_yield", | ||
366 | .data = &sysctl_sched_compat_yield, | ||
367 | .maxlen = sizeof(unsigned int), | ||
368 | .mode = 0644, | ||
369 | .proc_handler = proc_dointvec, | ||
370 | }, | ||
371 | #ifdef CONFIG_SCHED_AUTOGROUP | 364 | #ifdef CONFIG_SCHED_AUTOGROUP |
372 | { | 365 | { |
373 | .procname = "sched_autogroup_enabled", | 366 | .procname = "sched_autogroup_enabled", |
374 | .data = &sysctl_sched_autogroup_enabled, | 367 | .data = &sysctl_sched_autogroup_enabled, |
375 | .maxlen = sizeof(unsigned int), | 368 | .maxlen = sizeof(unsigned int), |
376 | .mode = 0644, | 369 | .mode = 0644, |
377 | .proc_handler = proc_dointvec, | 370 | .proc_handler = proc_dointvec_minmax, |
378 | .extra1 = &zero, | 371 | .extra1 = &zero, |
379 | .extra2 = &one, | 372 | .extra2 = &one, |
380 | }, | 373 | }, |
@@ -948,7 +941,7 @@ static struct ctl_table kern_table[] = { | |||
948 | .data = &sysctl_perf_event_sample_rate, | 941 | .data = &sysctl_perf_event_sample_rate, |
949 | .maxlen = sizeof(sysctl_perf_event_sample_rate), | 942 | .maxlen = sizeof(sysctl_perf_event_sample_rate), |
950 | .mode = 0644, | 943 | .mode = 0644, |
951 | .proc_handler = proc_dointvec, | 944 | .proc_handler = perf_proc_update_handler, |
952 | }, | 945 | }, |
953 | #endif | 946 | #endif |
954 | #ifdef CONFIG_KMEMCHECK | 947 | #ifdef CONFIG_KMEMCHECK |
@@ -1567,11 +1560,16 @@ void sysctl_head_get(struct ctl_table_header *head) | |||
1567 | spin_unlock(&sysctl_lock); | 1560 | spin_unlock(&sysctl_lock); |
1568 | } | 1561 | } |
1569 | 1562 | ||
1563 | static void free_head(struct rcu_head *rcu) | ||
1564 | { | ||
1565 | kfree(container_of(rcu, struct ctl_table_header, rcu)); | ||
1566 | } | ||
1567 | |||
1570 | void sysctl_head_put(struct ctl_table_header *head) | 1568 | void sysctl_head_put(struct ctl_table_header *head) |
1571 | { | 1569 | { |
1572 | spin_lock(&sysctl_lock); | 1570 | spin_lock(&sysctl_lock); |
1573 | if (!--head->count) | 1571 | if (!--head->count) |
1574 | kfree(head); | 1572 | call_rcu(&head->rcu, free_head); |
1575 | spin_unlock(&sysctl_lock); | 1573 | spin_unlock(&sysctl_lock); |
1576 | } | 1574 | } |
1577 | 1575 | ||
@@ -1685,13 +1683,8 @@ static int test_perm(int mode, int op) | |||
1685 | 1683 | ||
1686 | int sysctl_perm(struct ctl_table_root *root, struct ctl_table *table, int op) | 1684 | int sysctl_perm(struct ctl_table_root *root, struct ctl_table *table, int op) |
1687 | { | 1685 | { |
1688 | int error; | ||
1689 | int mode; | 1686 | int mode; |
1690 | 1687 | ||
1691 | error = security_sysctl(table, op & (MAY_READ | MAY_WRITE | MAY_EXEC)); | ||
1692 | if (error) | ||
1693 | return error; | ||
1694 | |||
1695 | if (root->permissions) | 1688 | if (root->permissions) |
1696 | mode = root->permissions(root, current->nsproxy, table); | 1689 | mode = root->permissions(root, current->nsproxy, table); |
1697 | else | 1690 | else |
@@ -1948,10 +1941,10 @@ void unregister_sysctl_table(struct ctl_table_header * header) | |||
1948 | start_unregistering(header); | 1941 | start_unregistering(header); |
1949 | if (!--header->parent->count) { | 1942 | if (!--header->parent->count) { |
1950 | WARN_ON(1); | 1943 | WARN_ON(1); |
1951 | kfree(header->parent); | 1944 | call_rcu(&header->parent->rcu, free_head); |
1952 | } | 1945 | } |
1953 | if (!--header->count) | 1946 | if (!--header->count) |
1954 | kfree(header); | 1947 | call_rcu(&header->rcu, free_head); |
1955 | spin_unlock(&sysctl_lock); | 1948 | spin_unlock(&sysctl_lock); |
1956 | } | 1949 | } |
1957 | 1950 | ||