DCACHE_OP_COMPARE);
 }
 
-static inline struct dentry *ovl_lookup_real(struct dentry *dir,
+static inline struct dentry *ovl_lookup_real(struct super_block *ovl_sb,
+                                            struct dentry *dir,
                                             struct qstr *name)
 {
+       const struct cred *old_cred;
        struct dentry *dentry;
 
-       dentry = lookup_hash(name, dir);
+       old_cred = ovl_override_creds(ovl_sb);
+       dentry = lookup_one_len_unlocked(name->name, dir, name->len);
+       revert_creds(old_cred);
 
        if (IS_ERR(dentry)) {
                if (PTR_ERR(dentry) == -ENOENT)
 
        upperdir = ovl_upperdentry_dereference(poe);
        if (upperdir) {
-               this = ovl_lookup_real(upperdir, &dentry->d_name);
+               this = ovl_lookup_real(dentry->d_sb, upperdir, &dentry->d_name);
                err = PTR_ERR(this);
                if (IS_ERR(this))
                        goto out;
                bool opaque = false;
                struct path lowerpath = poe->lowerstack[i];
 
-               this = ovl_lookup_real(lowerpath.dentry, &dentry->d_name);
+               this = ovl_lookup_real(dentry->d_sb,
+                                      lowerpath.dentry, &dentry->d_name);
                err = PTR_ERR(this);
                if (IS_ERR(this)) {
                        /*