{
        struct inode *realinode = d_inode(realpath->dentry);
        struct inode *inode = file_inode(file);
+       struct user_namespace *real_mnt_userns;
        struct file *realfile;
        const struct cred *old_cred;
        int flags = file->f_flags | OVL_OPEN_FLAGS;
                acc_mode |= MAY_APPEND;
 
        old_cred = ovl_override_creds(inode->i_sb);
-       err = inode_permission(&init_user_ns, realinode, MAY_OPEN | acc_mode);
+       real_mnt_userns = mnt_user_ns(realpath->mnt);
+       err = inode_permission(real_mnt_userns, realinode, MAY_OPEN | acc_mode);
        if (err) {
                realfile = ERR_PTR(err);
        } else {
-               if (!inode_owner_or_capable(&init_user_ns, realinode))
+               if (!inode_owner_or_capable(real_mnt_userns, realinode))
                        flags &= ~O_NOATIME;
 
                realfile = open_with_fake_path(&file->f_path, flags, realinode,
 
 struct file *ovl_path_open(struct path *path, int flags)
 {
        struct inode *inode = d_inode(path->dentry);
+       struct user_namespace *real_mnt_userns = mnt_user_ns(path->mnt);
        int err, acc_mode;
 
        if (flags & ~(O_ACCMODE | O_LARGEFILE))
                BUG();
        }
 
-       err = inode_permission(&init_user_ns, inode, acc_mode | MAY_OPEN);
+       err = inode_permission(real_mnt_userns, inode, acc_mode | MAY_OPEN);
        if (err)
                return ERR_PTR(err);
 
        /* O_NOATIME is an optimization, don't fail if not permitted */
-       if (inode_owner_or_capable(&init_user_ns, inode))
+       if (inode_owner_or_capable(real_mnt_userns, inode))
                flags |= O_NOATIME;
 
        return dentry_open(path, flags, current_cred());