aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorAl Viro <viro@www.linux.org.uk>2005-06-06 13:36:02 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-06 14:42:25 -0700
commit839d9f93c9f1623fb37234d464d739617879d97e (patch)
tree1f3e2e6b31d0417a99868d748fae044a5fd0995e /fs
parent1be4a0900be5d2c2fd9cd012e3a153e1ea47b96a (diff)
downloadkernel_samsung_smdk4412-839d9f93c9f1623fb37234d464d739617879d97e.tar.gz
kernel_samsung_smdk4412-839d9f93c9f1623fb37234d464d739617879d97e.tar.bz2
kernel_samsung_smdk4412-839d9f93c9f1623fb37234d464d739617879d97e.zip
[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>
Diffstat (limited to 'fs')
-rw-r--r--fs/namei.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 020fb8c8d1c..519900d83bc 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)
static inline int do_follow_link(struct path *path, struct nameidata *nd)
{
int err = -ELOOP;
- mntget(path->mnt);
if (current->link_count >= MAX_NESTED_LINKS)
goto loop;
if (current->total_link_count >= 40)
@@ -539,16 +538,16 @@ static inline int do_follow_link(struct path *path, struct nameidata *nd)
current->link_count++;
current->total_link_count++;
nd->depth++;
+ mntget(path->mnt);
err = __do_follow_link(path->dentry, nd);
- current->link_count--;
- nd->depth--;
dput(path->dentry);
mntput(path->mnt);
+ current->link_count--;
+ nd->depth--;
return err;
loop:
- path_release(nd);
dput(path->dentry);
- mntput(path->mnt);
+ path_release(nd);
return err;
}