path_openat: clean ELOOP handling a bit

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2011-03-09 16:22:18 -05:00
parent f374ed5fa8
commit 40b39136f0
1 changed files with 6 additions and 8 deletions

View File

@ -2320,11 +2320,12 @@ static struct file *path_openat(int dfd, const char *pathname,
struct path link = path; struct path link = path;
struct inode *linki = link.dentry->d_inode; struct inode *linki = link.dentry->d_inode;
void *cookie; void *cookie;
error = -ELOOP; if (!(nd.flags & LOOKUP_FOLLOW) || count++ == 32) {
if (!(nd.flags & LOOKUP_FOLLOW)) path_put_conditional(&path, &nd);
goto exit_dput; path_put(&nd.path);
if (count++ == 32) filp = ERR_PTR(-ELOOP);
goto exit_dput; break;
}
/* /*
* This is subtle. Instead of calling do_follow_link() we do * This is subtle. Instead of calling do_follow_link() we do
* the thing by hands. The reason is that this way we have zero * the thing by hands. The reason is that this way we have zero
@ -2355,9 +2356,6 @@ out:
release_open_intent(&nd); release_open_intent(&nd);
return filp; return filp;
exit_dput:
path_put_conditional(&path, &nd);
path_put(&nd.path);
out_filp: out_filp:
filp = ERR_PTR(error); filp = ERR_PTR(error);
goto out; goto out;