summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/proc/proc_sysctl.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c
index e0d3e7e59cbd..160d5781638e 100644
--- a/fs/proc/proc_sysctl.c
+++ b/fs/proc/proc_sysctl.c
@@ -52,6 +52,7 @@ static int sysctl_follow_link(struct ctl_table_header **phead,
struct ctl_table **pentry, struct nsproxy *namespaces);
static int insert_links(struct ctl_table_header *head);
static void put_links(struct ctl_table_header *header);
+static int sysctl_check_dups(struct ctl_dir *dir, struct ctl_table *table);
static void sysctl_print_dir(struct ctl_dir *dir)
{
@@ -123,6 +124,10 @@ static int insert_header(struct ctl_dir *dir, struct ctl_table_header *header)
{
int err;
+ err = sysctl_check_dups(dir, header->ctl_table);
+ if (err)
+ return err;
+
dir->header.nreg++;
header->parent = dir;
err = insert_links(header);
@@ -891,7 +896,7 @@ static int sysctl_follow_link(struct ctl_table_header **phead,
return ret;
}
-static int sysctl_check_table_dups(const char *path, struct ctl_table *old,
+static int sysctl_check_table_dups(struct ctl_dir *dir, struct ctl_table *old,
struct ctl_table *table)
{
struct ctl_table *entry, *test;
@@ -900,8 +905,9 @@ static int sysctl_check_table_dups(const char *path, struct ctl_table *old,
for (entry = old; entry->procname; entry++) {
for (test = table; test->procname; test++) {
if (strcmp(entry->procname, test->procname) == 0) {
- printk(KERN_ERR "sysctl duplicate entry: %s/%s\n",
- path, test->procname);
+ printk(KERN_ERR "sysctl duplicate entry: ");
+ sysctl_print_dir(dir);
+ printk(KERN_CONT "/%s\n", test->procname);
error = -EEXIST;
}
}
@@ -909,8 +915,7 @@ static int sysctl_check_table_dups(const char *path, struct ctl_table *old,
return error;
}
-static int sysctl_check_dups(struct ctl_dir *dir,
- const char *path, struct ctl_table *table)
+static int sysctl_check_dups(struct ctl_dir *dir, struct ctl_table *table)
{
struct ctl_table_set *set;
struct ctl_table_header *head;
@@ -922,7 +927,7 @@ static int sysctl_check_dups(struct ctl_dir *dir,
continue;
if (head->parent != dir)
continue;
- error = sysctl_check_table_dups(path, head->ctl_table, table);
+ error = sysctl_check_table_dups(dir, head->ctl_table, table);
}
return error;
}
@@ -1166,9 +1171,6 @@ struct ctl_table_header *__register_sysctl_table(
}
spin_lock(&sysctl_lock);
- if (sysctl_check_dups(dir, path, table))
- goto fail_put_dir_locked;
-
if (insert_header(dir, header))
goto fail_put_dir_locked;