struct dentry *this;
        unsigned int i;
        int err;
-       bool metacopy = false;
+       bool uppermetacopy = false;
        struct ovl_lookup_data d = {
                .sb = dentry->d_sb,
                .name = dentry->d_name,
                                goto out_put_upper;
 
                        if (d.metacopy)
-                               metacopy = true;
+                               uppermetacopy = true;
                }
 
                if (d.redirect) {
                if (!this)
                        continue;
 
+               if ((uppermetacopy || d.metacopy) && !ofs->config.metacopy) {
+                       err = -EPERM;
+                       pr_warn_ratelimited("refusing to follow metacopy origin for (%pd2)\n", dentry);
+                       goto out_put;
+               }
+
+               /*
+                * Do not store intermediate metacopy dentries in chain,
+                * except top most lower metacopy dentry
+                */
+               if (d.metacopy && ctr) {
+                       dput(this);
+                       continue;
+               }
+
                /*
                 * If no origin fh is stored in upper of a merge dir, store fh
                 * of lower dir and set upper parent "impure".
                        origin = this;
                }
 
-               if (d.metacopy)
-                       metacopy = true;
-               /*
-                * Do not store intermediate metacopy dentries in chain,
-                * except top most lower metacopy dentry
-                */
-               if (d.metacopy && ctr) {
-                       dput(this);
-                       continue;
-               }
-
                stack[ctr].dentry = this;
                stack[ctr].layer = lower.layer;
                ctr++;
                }
        }
 
-       if (metacopy) {
-               /*
-                * Found a metacopy dentry but did not find corresponding
-                * data dentry
-                */
-               if (d.metacopy) {
-                       err = -EIO;
-                       goto out_put;
-               }
-
-               err = -EPERM;
-               if (!ofs->config.metacopy) {
-                       pr_warn_ratelimited("refusing to follow metacopy origin for (%pd2)\n",
-                                           dentry);
-                       goto out_put;
-               }
+       /*
+        * For regular non-metacopy upper dentries, there is no lower
+        * path based lookup, hence ctr will be zero. If a dentry is found
+        * using ORIGIN xattr on upper, install it in stack.
+        *
+        * For metacopy dentry, path based lookup will find lower dentries.
+        * Just make sure a corresponding data dentry has been found.
+        */
+       if (d.metacopy || (uppermetacopy && !ctr)) {
+               err = -EIO;
+               goto out_put;
        } else if (!d.is_dir && upperdentry && !ctr && origin_path) {
                if (WARN_ON(stack != NULL)) {
                        err = -EIO;