aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Dobriyan <adobriyan@gmail.com>2008-04-29 04:01:40 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-29 11:06:17 -0400
commit7cee4e00e0f8aa7290266382ea903a5a1b92c9a1 (patch)
tree3d4ca2241e122f3358433b26538d952eda0226c5
parentf649d6d32605c7573884613289fb3b9fbd4f99a1 (diff)
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>
-rw-r--r--fs/proc/generic.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/fs/proc/generic.c b/fs/proc/generic.c
index 45d0076bc08e..3c6f5669523a 100644
--- a/fs/proc/generic.c
+++ b/fs/proc/generic.c
@@ -277,8 +277,11 @@ static int xlate_proc_name(const char *name,
277 int len; 277 int len;
278 int rtn = 0; 278 int rtn = 0;
279 279
280 de = *ret;
281 if (!de)
282 de = &proc_root;
283
280 spin_lock(&proc_subdir_lock); 284 spin_lock(&proc_subdir_lock);
281 de = &proc_root;
282 while (1) { 285 while (1) {
283 next = strchr(cp, '/'); 286 next = strchr(cp, '/');
284 if (!next) 287 if (!next)
@@ -582,7 +585,7 @@ static struct proc_dir_entry *__proc_create(struct proc_dir_entry **parent,
582 /* make sure name is valid */ 585 /* make sure name is valid */
583 if (!name || !strlen(name)) goto out; 586 if (!name || !strlen(name)) goto out;
584 587
585 if (!(*parent) && xlate_proc_name(name, parent, &fn) != 0) 588 if (xlate_proc_name(name, parent, &fn) != 0)
586 goto out; 589 goto out;
587 590
588 /* At this point there must not be any '/' characters beyond *fn */ 591 /* 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)
738 const char *fn = name; 741 const char *fn = name;
739 int len; 742 int len;
740 743
741 if (!parent && xlate_proc_name(name, &parent, &fn) != 0) 744 if (xlate_proc_name(name, &parent, &fn) != 0)
742 return; 745 return;
743 len = strlen(fn); 746 len = strlen(fn);
744 747