path_openat: clean ELOOP handling a bit
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 9 Mar 2011 21:22:18 +0000 (16:22 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 14 Mar 2011 13:15:27 +0000 (09:15 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c

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