proc: less special case in xlate code
If valid "parent" is passed to proc_create/remove_proc_entry(), then name of PDE should consist of only one path component, otherwise creation or or removal will fail. However, if NULL is passed as parent then create/remove accept full path as a argument. This is arbitrary restriction -- all infrastructure is in place. So, patch allows the following to succeed: create_proc_entry("foo/bar", 0, pde_baz); remove_proc_entry("baz/foo/bar", &proc_root); Also makes the following to behave identically: create_proc_entry("foo/bar", 0, NULL); create_proc_entry("foo/bar", 0, &proc_root); Discrepancy noticed by Den Lunev (IIRC). Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
f649d6d326
commit
7cee4e00e0
@@ -277,8 +277,11 @@ static int xlate_proc_name(const char *name,
|
|||||||
int len;
|
int len;
|
||||||
int rtn = 0;
|
int rtn = 0;
|
||||||
|
|
||||||
spin_lock(&proc_subdir_lock);
|
de = *ret;
|
||||||
|
if (!de)
|
||||||
de = &proc_root;
|
de = &proc_root;
|
||||||
|
|
||||||
|
spin_lock(&proc_subdir_lock);
|
||||||
while (1) {
|
while (1) {
|
||||||
next = strchr(cp, '/');
|
next = strchr(cp, '/');
|
||||||
if (!next)
|
if (!next)
|
||||||
@@ -582,7 +585,7 @@ static struct proc_dir_entry *__proc_create(struct proc_dir_entry **parent,
|
|||||||
/* make sure name is valid */
|
/* make sure name is valid */
|
||||||
if (!name || !strlen(name)) goto out;
|
if (!name || !strlen(name)) goto out;
|
||||||
|
|
||||||
if (!(*parent) && xlate_proc_name(name, parent, &fn) != 0)
|
if (xlate_proc_name(name, parent, &fn) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* At this point there must not be any '/' characters beyond *fn */
|
/* At this point there must not be any '/' characters beyond *fn */
|
||||||
@@ -738,7 +741,7 @@ void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
|
|||||||
const char *fn = name;
|
const char *fn = name;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (!parent && xlate_proc_name(name, &parent, &fn) != 0)
|
if (xlate_proc_name(name, &parent, &fn) != 0)
|
||||||
return;
|
return;
|
||||||
len = strlen(fn);
|
len = strlen(fn);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user