浏览代码

[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>
Eric W. Biederman 18 年之前
父节点
当前提交
d912b0cc1a
共有 2 个文件被更改,包括 19 次插入0 次删除
  1. 1 0
      include/linux/sysctl.h
  2. 18 0
      kernel/sysctl.c

+ 1 - 0
include/linux/sysctl.h

@@ -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 */

+ 18 - 0
kernel/sysctl.c

@@ -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)
 	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);