aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sysctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sysctl.c')
-rw-r--r--kernel/sysctl.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index bc86bb32e126..4eed0af5d144 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -170,7 +170,8 @@ static int proc_taint(struct ctl_table *table, int write,
170#endif 170#endif
171 171
172#ifdef CONFIG_MAGIC_SYSRQ 172#ifdef CONFIG_MAGIC_SYSRQ
173static int __sysrq_enabled; /* Note: sysrq code ises it's own private copy */ 173/* Note: sysrq code uses it's own private copy */
174static int __sysrq_enabled = SYSRQ_DEFAULT_ENABLE;
174 175
175static int sysrq_sysctl_handler(ctl_table *table, int write, 176static int sysrq_sysctl_handler(ctl_table *table, int write,
176 void __user *buffer, size_t *lenp, 177 void __user *buffer, size_t *lenp,
@@ -193,9 +194,9 @@ static int sysrq_sysctl_handler(ctl_table *table, int write,
193static struct ctl_table root_table[]; 194static struct ctl_table root_table[];
194static struct ctl_table_root sysctl_table_root; 195static struct ctl_table_root sysctl_table_root;
195static struct ctl_table_header root_table_header = { 196static struct ctl_table_header root_table_header = {
196 .count = 1, 197 {{.count = 1,
197 .ctl_table = root_table, 198 .ctl_table = root_table,
198 .ctl_entry = LIST_HEAD_INIT(sysctl_table_root.default_set.list), 199 .ctl_entry = LIST_HEAD_INIT(sysctl_table_root.default_set.list),}},
199 .root = &sysctl_table_root, 200 .root = &sysctl_table_root,
200 .set = &sysctl_table_root.default_set, 201 .set = &sysctl_table_root.default_set,
201}; 202};
@@ -1566,11 +1567,16 @@ void sysctl_head_get(struct ctl_table_header *head)
1566 spin_unlock(&sysctl_lock); 1567 spin_unlock(&sysctl_lock);
1567} 1568}
1568 1569
1570static void free_head(struct rcu_head *rcu)
1571{
1572 kfree(container_of(rcu, struct ctl_table_header, rcu));
1573}
1574
1569void sysctl_head_put(struct ctl_table_header *head) 1575void sysctl_head_put(struct ctl_table_header *head)
1570{ 1576{
1571 spin_lock(&sysctl_lock); 1577 spin_lock(&sysctl_lock);
1572 if (!--head->count) 1578 if (!--head->count)
1573 kfree(head); 1579 call_rcu(&head->rcu, free_head);
1574 spin_unlock(&sysctl_lock); 1580 spin_unlock(&sysctl_lock);
1575} 1581}
1576 1582
@@ -1947,10 +1953,10 @@ void unregister_sysctl_table(struct ctl_table_header * header)
1947 start_unregistering(header); 1953 start_unregistering(header);
1948 if (!--header->parent->count) { 1954 if (!--header->parent->count) {
1949 WARN_ON(1); 1955 WARN_ON(1);
1950 kfree(header->parent); 1956 call_rcu(&header->parent->rcu, free_head);
1951 } 1957 }
1952 if (!--header->count) 1958 if (!--header->count)
1953 kfree(header); 1959 call_rcu(&header->rcu, free_head);
1954 spin_unlock(&sysctl_lock); 1960 spin_unlock(&sysctl_lock);
1955} 1961}
1956 1962