[PATCH] namei fixes (2/19)
authorAl Viro <viro@www.linux.org.uk>
Mon, 6 Jun 2005 20:35:59 +0000 (13:35 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 6 Jun 2005 21:42:24 +0000 (14:42 -0700)
All callers of do_follow_link() do mntget() right before it and
dput()+mntput() right after.  These calls are moved inside do_follow_link()
now.

Obviously equivalent transformation.

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>
fs/namei.c

index abeec34e7553fceaf62bd9be7f61e938c46cd73f..12d75ed214f6fb8c8ec48f36bd56350114d94c51 100644 (file)
@@ -526,6 +526,7 @@ 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)
@@ -541,9 +542,13 @@ static inline int do_follow_link(struct path *path, struct nameidata *nd)
        err = __do_follow_link(path->dentry, nd);
        current->link_count--;
        nd->depth--;
+       dput(path->dentry);
+       mntput(path->mnt);
        return err;
 loop:
        path_release(nd);
+       dput(path->dentry);
+       mntput(path->mnt);
        return err;
 }
 
@@ -783,10 +788,7 @@ static fastcall int __link_path_walk(const char * name, struct nameidata *nd)
                        goto out_dput;
 
                if (inode->i_op->follow_link) {
-                       mntget(next.mnt);
                        err = do_follow_link(&next, nd);
-                       dput(next.dentry);
-                       mntput(next.mnt);
                        if (err)
                                goto return_err;
                        err = -ENOENT;
@@ -837,10 +839,7 @@ last_component:
                inode = next.dentry->d_inode;
                if ((lookup_flags & LOOKUP_FOLLOW)
                    && inode && inode->i_op && inode->i_op->follow_link) {
-                       mntget(next.mnt);
                        err = do_follow_link(&next, nd);
-                       dput(next.dentry);
-                       mntput(next.mnt);
                        if (err)
                                goto return_err;
                        inode = nd->dentry->d_inode;