proc: skip branch in /proc/*/* lookup
authorAlexey Dobriyan <adobriyan@gmail.com>
Thu, 14 Jun 2018 22:27:17 +0000 (15:27 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 14 Jun 2018 22:55:24 +0000 (07:55 +0900)
Code is structured like this:

for ( ... p < last; p++) {
if (memcmp == 0)
break;
}
if (p >= last)
ERROR
OK

gcc doesn't see that if if lookup succeeds than post loop branch will
never be taken and skip it.

[akpm@linux-foundation.org: proc_pident_instantiate() no longer takes an inode*]
Link: http://lkml.kernel.org/r/20180423213954.GD9043@avx2
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/proc/base.c

index 80aa42506b8b7fa32902d8a61a04c28172c30995..b6572944efc340d89f136c5a9c17ac409c8bef00 100644 (file)
@@ -2439,14 +2439,11 @@ static struct dentry *proc_pident_lookup(struct inode *dir,
        for (p = ents; p < last; p++) {
                if (p->len != dentry->d_name.len)
                        continue;
-               if (!memcmp(dentry->d_name.name, p->name, p->len))
+               if (!memcmp(dentry->d_name.name, p->name, p->len)) {
+                       res = proc_pident_instantiate(dentry, task, p);
                        break;
+               }
        }
-       if (p >= last)
-               goto out;
-
-       res = proc_pident_instantiate(dentry, task, p);
-out:
        put_task_struct(task);
 out_no_task:
        return res;