aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@www.linux.org.uk>2005-06-06 16:36:02 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-06 17:42:25 -0400
commit839d9f93c9f1623fb37234d464d739617879d97e (patch)
tree1f3e2e6b31d0417a99868d748fae044a5fd0995e
parent1be4a0900be5d2c2fd9cd012e3a153e1ea47b96a (diff)
[PATCH] namei fixes (6/19)
mntget(path->mnt) in do_follow_link() moved down to right before the __do_follow_link() call and rigth after loop: resp. dput()+mntput() on non-ELOOP branch moved up to right after __do_follow_link() call. resulting loop: mntget(path->mnt); path_release(nd); dput(path->mnt); mntput(path->mnt); replaced with equivalent dput(path->mnt); path_release(nd); Equivalent transformations - the reason why we have that mntget() is that __do_follow_link() can drop a reference to nd->mnt and that's what holds path->mnt. So that call can happen at any point prior to __do_follow_link() touching nd->mnt. The rest is obvious. NOTE: current tree relies on symlinks *never* being mounted on anything. It's not hard to get rid of that assumption (actually, that will come for free later in the series). For now we are just not making the situation worse than it is. Signed-off-by: Al Viro <viro@parcelfarce.linux.theplanet.co.uk> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--fs/namei.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 020fb8c8d1cd..519900d83bcb 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -526,7 +526,6 @@ static inline int __do_follow_link(struct dentry *dentry, struct nameidata *nd)
526static inline int do_follow_link(struct path *path, struct nameidata *nd) 526static inline int do_follow_link(struct path *path, struct nameidata *nd)
527{ 527{
528 int err = -ELOOP; 528 int err = -ELOOP;
529 mntget(path->mnt);
530 if (current->link_count >= MAX_NESTED_LINKS) 529 if (current->link_count >= MAX_NESTED_LINKS)
531 goto loop; 530 goto loop;
532 if (current->total_link_count >= 40) 531 if (current->total_link_count >= 40)
@@ -539,16 +538,16 @@ static inline int do_follow_link(struct path *path, struct nameidata *nd)
539 current->link_count++; 538 current->link_count++;
540 current->total_link_count++; 539 current->total_link_count++;
541 nd->depth++; 540 nd->depth++;
541 mntget(path->mnt);
542 err = __do_follow_link(path->dentry, nd); 542 err = __do_follow_link(path->dentry, nd);
543 current->link_count--;
544 nd->depth--;
545 dput(path->dentry); 543 dput(path->dentry);
546 mntput(path->mnt); 544 mntput(path->mnt);
545 current->link_count--;
546 nd->depth--;
547 return err; 547 return err;
548loop: 548loop:
549 path_release(nd);
550 dput(path->dentry); 549 dput(path->dentry);
551 mntput(path->mnt); 550 path_release(nd);
552 return err; 551 return err;
553} 552}
554 553