diff options
| -rw-r--r-- | include/linux/sysctl.h | 1 | ||||
| -rw-r--r-- | kernel/sysctl.c | 18 |
2 files changed, 19 insertions, 0 deletions
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 89150494bd10..1371d7b86810 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h | |||
| @@ -1022,6 +1022,7 @@ struct ctl_table | |||
| 1022 | int maxlen; | 1022 | int maxlen; |
| 1023 | mode_t mode; | 1023 | mode_t mode; |
| 1024 | ctl_table *child; | 1024 | ctl_table *child; |
| 1025 | ctl_table *parent; /* Automatically set */ | ||
| 1025 | proc_handler *proc_handler; /* Callback for text formatting */ | 1026 | proc_handler *proc_handler; /* Callback for text formatting */ |
| 1026 | ctl_handler *strategy; /* Callback function for all r/w */ | 1027 | ctl_handler *strategy; /* Callback function for all r/w */ |
| 1027 | struct proc_dir_entry *de; /* /proc control block */ | 1028 | struct proc_dir_entry *de; /* /proc control block */ |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index b3ee791ad663..3ca1d5ff0319 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -1240,6 +1240,23 @@ int do_sysctl_strategy (ctl_table *table, | |||
| 1240 | } | 1240 | } |
| 1241 | #endif /* CONFIG_SYSCTL_SYSCALL */ | 1241 | #endif /* CONFIG_SYSCTL_SYSCALL */ |
| 1242 | 1242 | ||
| 1243 | static void sysctl_set_parent(struct ctl_table *parent, struct ctl_table *table) | ||
| 1244 | { | ||
| 1245 | for (; table->ctl_name || table->procname; table++) { | ||
| 1246 | table->parent = parent; | ||
| 1247 | if (table->child) | ||
| 1248 | sysctl_set_parent(table, table->child); | ||
| 1249 | } | ||
| 1250 | } | ||
| 1251 | |||
| 1252 | static __init int sysctl_init(void) | ||
| 1253 | { | ||
| 1254 | sysctl_set_parent(NULL, root_table); | ||
| 1255 | return 0; | ||
| 1256 | } | ||
| 1257 | |||
| 1258 | core_initcall(sysctl_init); | ||
| 1259 | |||
| 1243 | /** | 1260 | /** |
| 1244 | * register_sysctl_table - register a sysctl hierarchy | 1261 | * register_sysctl_table - register a sysctl hierarchy |
| 1245 | * @table: the top-level table structure | 1262 | * @table: the top-level table structure |
| @@ -1318,6 +1335,7 @@ struct ctl_table_header *register_sysctl_table(ctl_table * table) | |||
| 1318 | INIT_LIST_HEAD(&tmp->ctl_entry); | 1335 | INIT_LIST_HEAD(&tmp->ctl_entry); |
| 1319 | tmp->used = 0; | 1336 | tmp->used = 0; |
| 1320 | tmp->unregistering = NULL; | 1337 | tmp->unregistering = NULL; |
| 1338 | sysctl_set_parent(NULL, table); | ||
| 1321 | spin_lock(&sysctl_lock); | 1339 | spin_lock(&sysctl_lock); |
| 1322 | list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry); | 1340 | list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry); |
| 1323 | spin_unlock(&sysctl_lock); | 1341 | spin_unlock(&sysctl_lock); |
