Commit d912b0cc1a617d7c590d57b7ea971d50c7f02503

Authored by Eric W. Biederman
Committed by Linus Torvalds
1 parent 77b14db502

[PATCH] sysctl: add a parent entry to ctl_table and set the parent entry

Add a parent entry into the ctl_table so you can walk the list of parents and
find the entire path to a ctl_table entry.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Cc: Stephen Smalley <sds@tycho.nsa.gov>
Cc: James Morris <jmorris@namei.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 2 changed files with 19 additions and 0 deletions Side-by-side Diff

include/linux/sysctl.h
... ... @@ -1022,6 +1022,7 @@
1022 1022 int maxlen;
1023 1023 mode_t mode;
1024 1024 ctl_table *child;
  1025 + ctl_table *parent; /* Automatically set */
1025 1026 proc_handler *proc_handler; /* Callback for text formatting */
1026 1027 ctl_handler *strategy; /* Callback function for all r/w */
1027 1028 struct proc_dir_entry *de; /* /proc control block */
... ... @@ -1240,6 +1240,23 @@
1240 1240 }
1241 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 1261 * register_sysctl_table - register a sysctl hierarchy
1245 1262 * @table: the top-level table structure
... ... @@ -1318,6 +1335,7 @@
1318 1335 INIT_LIST_HEAD(&tmp->ctl_entry);
1319 1336 tmp->used = 0;
1320 1337 tmp->unregistering = NULL;
  1338 + sysctl_set_parent(NULL, table);
1321 1339 spin_lock(&sysctl_lock);
1322 1340 list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry);
1323 1341 spin_unlock(&sysctl_lock);