Commit d912b0cc authored by Eric W. Biederman's avatar Eric W. Biederman Committed by Linus Torvalds

[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: default avatarEric W. Biederman <ebiederm@xmission.com>
Cc: Stephen Smalley <sds@tycho.nsa.gov>
Cc: James Morris <jmorris@namei.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 77b14db5
...@@ -1022,6 +1022,7 @@ struct ctl_table ...@@ -1022,6 +1022,7 @@ struct ctl_table
int maxlen; int maxlen;
mode_t mode; mode_t mode;
ctl_table *child; ctl_table *child;
ctl_table *parent; /* Automatically set */
proc_handler *proc_handler; /* Callback for text formatting */ proc_handler *proc_handler; /* Callback for text formatting */
ctl_handler *strategy; /* Callback function for all r/w */ ctl_handler *strategy; /* Callback function for all r/w */
struct proc_dir_entry *de; /* /proc control block */ struct proc_dir_entry *de; /* /proc control block */
......
...@@ -1240,6 +1240,23 @@ int do_sysctl_strategy (ctl_table *table, ...@@ -1240,6 +1240,23 @@ int do_sysctl_strategy (ctl_table *table,
} }
#endif /* CONFIG_SYSCTL_SYSCALL */ #endif /* CONFIG_SYSCTL_SYSCALL */
static void sysctl_set_parent(struct ctl_table *parent, struct ctl_table *table)
{
for (; table->ctl_name || table->procname; table++) {
table->parent = parent;
if (table->child)
sysctl_set_parent(table, table->child);
}
}
static __init int sysctl_init(void)
{
sysctl_set_parent(NULL, root_table);
return 0;
}
core_initcall(sysctl_init);
/** /**
* register_sysctl_table - register a sysctl hierarchy * register_sysctl_table - register a sysctl hierarchy
* @table: the top-level table structure * @table: the top-level table structure
...@@ -1318,6 +1335,7 @@ struct ctl_table_header *register_sysctl_table(ctl_table * table) ...@@ -1318,6 +1335,7 @@ struct ctl_table_header *register_sysctl_table(ctl_table * table)
INIT_LIST_HEAD(&tmp->ctl_entry); INIT_LIST_HEAD(&tmp->ctl_entry);
tmp->used = 0; tmp->used = 0;
tmp->unregistering = NULL; tmp->unregistering = NULL;
sysctl_set_parent(NULL, table);
spin_lock(&sysctl_lock); spin_lock(&sysctl_lock);
list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry); list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry);
spin_unlock(&sysctl_lock); spin_unlock(&sysctl_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment