}
 
 struct map_files_info {
-       struct file     *file;
+       fmode_t         mode;
        unsigned long   len;
        unsigned char   name[4*sizeof(long)+2]; /* max: %lx-%lx\0 */
 };
 proc_map_files_instantiate(struct inode *dir, struct dentry *dentry,
                           struct task_struct *task, const void *ptr)
 {
-       const struct file *file = ptr;
+       fmode_t mode = (fmode_t)(unsigned long)ptr;
        struct proc_inode *ei;
        struct inode *inode;
 
-       if (!file)
-               return ERR_PTR(-ENOENT);
-
        inode = proc_pid_make_inode(dir->i_sb, task);
        if (!inode)
                return ERR_PTR(-ENOENT);
        inode->i_size = 64;
        inode->i_mode = S_IFLNK;
 
-       if (file->f_mode & FMODE_READ)
+       if (mode & FMODE_READ)
                inode->i_mode |= S_IRUSR;
-       if (file->f_mode & FMODE_WRITE)
+       if (mode & FMODE_WRITE)
                inode->i_mode |= S_IWUSR;
 
        d_set_d_op(dentry, &tid_map_files_dentry_operations);
        if (!vma)
                goto out_no_vma;
 
-       result = proc_map_files_instantiate(dir, dentry, task, vma->vm_file);
+       result = proc_map_files_instantiate(dir, dentry, task,
+                       (void *)(unsigned long)vma->vm_file->f_mode);
 
 out_no_vma:
        up_read(&mm->mmap_sem);
                                if (++pos <= filp->f_pos)
                                        continue;
 
-                               info.file = get_file(vma->vm_file);
+                               info.mode = vma->vm_file->f_mode;
                                info.len = snprintf(info.name,
                                                sizeof(info.name), "%lx-%lx",
                                                vma->vm_start, vma->vm_end);
                        ret = proc_fill_cache(filp, dirent, filldir,
                                              p->name, p->len,
                                              proc_map_files_instantiate,
-                                             task, p->file);
+                                             task,
+                                             (void *)(unsigned long)p->mode);
                        if (ret)
                                break;
                        filp->f_pos++;
-                       fput(p->file);
-               }
-               for (; i < nr_files; i++) {
-                       /*
-                        * In case of error don't forget
-                        * to put rest of file refs.
-                        */
-                       p = flex_array_get(fa, i);
-                       fput(p->file);
                }
                if (fa)
                        flex_array_free(fa);