Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f12dbfb authored by Al Viro's avatar Al Viro Committed by Linus Torvalds
Browse files

[PATCH] namei fixes (11/19)



shifted conditional mntput() calls in __link_path_walk() downstream.

Obviously equivalent transformation.

Signed-off-by: default avatarAl Viro <viro@parcelfarce.linux.theplanet.co.uk>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e13b210f
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -791,8 +791,6 @@ static fastcall int __link_path_walk(const char * name, struct nameidata *nd)
			break;
		/* Check mountpoints.. */
		__follow_mount(&next);
		if (nd->mnt != next.mnt)
			mntput(nd->mnt);

		err = -ENOENT;
		inode = next.dentry->d_inode;
@@ -803,6 +801,8 @@ static fastcall int __link_path_walk(const char * name, struct nameidata *nd)
			goto out_dput;

		if (inode->i_op->follow_link) {
			if (nd->mnt != next.mnt)
				mntput(nd->mnt);
			err = do_follow_link(&next, nd);
			if (err)
				goto return_err;
@@ -815,6 +815,8 @@ static fastcall int __link_path_walk(const char * name, struct nameidata *nd)
				break;
		} else {
			dput(nd->dentry);
			if (nd->mnt != next.mnt)
				mntput(nd->mnt);
			nd->mnt = next.mnt;
			nd->dentry = next.dentry;
		}
@@ -851,17 +853,19 @@ last_component:
		if (err)
			break;
		__follow_mount(&next);
		if (nd->mnt != next.mnt)
			mntput(nd->mnt);
		inode = next.dentry->d_inode;
		if ((lookup_flags & LOOKUP_FOLLOW)
		    && inode && inode->i_op && inode->i_op->follow_link) {
			if (next.mnt != nd->mnt)
				mntput(nd->mnt);
			err = do_follow_link(&next, nd);
			if (err)
				goto return_err;
			inode = nd->dentry->d_inode;
		} else {
			dput(nd->dentry);
			if (nd->mnt != next.mnt)
				mntput(nd->mnt);
			nd->mnt = next.mnt;
			nd->dentry = next.dentry;
		}
@@ -901,6 +905,8 @@ return_base:
		return 0;
out_dput:
		dput(next.dentry);
		if (nd->mnt != next.mnt)
			mntput(nd->mnt);
		break;
	}
	path_release(nd);