* - upper/work dir of any overlayfs instance
  */
 static int ovl_check_layer(struct super_block *sb, struct ovl_fs *ofs,
-                          struct dentry *dentry, const char *name)
+                          struct dentry *dentry, const char *name,
+                          bool is_lower)
 {
        struct dentry *next = dentry, *parent;
        int err = 0;
 
        /* Walk back ancestors to root (inclusive) looking for traps */
        while (!err && parent != next) {
-               if (ovl_lookup_trap_inode(sb, parent)) {
+               if (is_lower && ovl_lookup_trap_inode(sb, parent)) {
                        err = -ELOOP;
                        pr_err("overlapping %s path\n", name);
                } else if (ovl_is_inuse(parent)) {
 
        if (ovl_upper_mnt(ofs)) {
                err = ovl_check_layer(sb, ofs, ovl_upper_mnt(ofs)->mnt_root,
-                                     "upperdir");
+                                     "upperdir", false);
                if (err)
                        return err;
 
                 * workbasedir.  In that case, we already have their traps in
                 * inode cache and we will catch that case on lookup.
                 */
-               err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir");
+               err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir",
+                                     false);
                if (err)
                        return err;
        }
        for (i = 1; i < ofs->numlayer; i++) {
                err = ovl_check_layer(sb, ofs,
                                      ofs->layers[i].mnt->mnt_root,
-                                     "lowerdir");
+                                     "lowerdir", true);
                if (err)
                        return err;
        }