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

Commit 09dd17d3 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Linus Torvalds
Browse files

[PATCH] namei cleanup



Extract common code into inline functions to make reading easier.

Signed-off-by: default avatarMiklos Szeredi <miklos@szeredi.hu>
Cc: <viro@parcelfarce.linux.theplanet.co.uk>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e89bbd3a
Loading
Loading
Loading
Loading
+24 −28
Original line number Diff line number Diff line
@@ -525,6 +525,22 @@ static inline int __do_follow_link(struct path *path, struct nameidata *nd)
	return error;
}

static inline void dput_path(struct path *path, struct nameidata *nd)
{
	dput(path->dentry);
	if (path->mnt != nd->mnt)
		mntput(path->mnt);
}

static inline void path_to_nameidata(struct path *path, struct nameidata *nd)
{
	dput(nd->dentry);
	if (nd->mnt != path->mnt)
		mntput(nd->mnt);
	nd->mnt = path->mnt;
	nd->dentry = path->dentry;
}

/*
 * This limits recursive symlink follows to 8, while
 * limiting consecutive symlinks to 40.
@@ -552,9 +568,7 @@ static inline int do_follow_link(struct path *path, struct nameidata *nd)
	nd->depth--;
	return err;
loop:
	dput(path->dentry);
	if (path->mnt != nd->mnt)
		mntput(path->mnt);
	dput_path(path, nd);
	path_release(nd);
	return err;
}
@@ -813,13 +827,8 @@ static fastcall int __link_path_walk(const char * name, struct nameidata *nd)
			err = -ENOTDIR; 
			if (!inode->i_op)
				break;
		} else {
			dput(nd->dentry);
			if (nd->mnt != next.mnt)
				mntput(nd->mnt);
			nd->mnt = next.mnt;
			nd->dentry = next.dentry;
		}
		} else
			path_to_nameidata(&next, nd);
		err = -ENOTDIR; 
		if (!inode->i_op->lookup)
			break;
@@ -859,13 +868,8 @@ last_component:
			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;
		}
		} else
			path_to_nameidata(&next, nd);
		err = -ENOENT;
		if (!inode)
			break;
@@ -901,9 +905,7 @@ return_reval:
return_base:
		return 0;
out_dput:
		dput(next.dentry);
		if (nd->mnt != next.mnt)
			mntput(next.mnt);
		dput_path(&next, nd);
		break;
	}
	path_release(nd);
@@ -1507,11 +1509,7 @@ do_last:
	if (path.dentry->d_inode->i_op && path.dentry->d_inode->i_op->follow_link)
		goto do_link;

	dput(nd->dentry);
	nd->dentry = path.dentry;
	if (nd->mnt != path.mnt)
		mntput(nd->mnt);
	nd->mnt = path.mnt;
	path_to_nameidata(&path, nd);
	error = -EISDIR;
	if (path.dentry->d_inode && S_ISDIR(path.dentry->d_inode->i_mode))
		goto exit;
@@ -1522,9 +1520,7 @@ ok:
	return 0;

exit_dput:
	dput(path.dentry);
	if (nd->mnt != path.mnt)
		mntput(path.mnt);
	dput_path(&path, nd);
exit:
	path_release(nd);
	return error;