int retcode = 0;
int need_setup = 0;
struct address_space *old_mapping;
- struct address_space *old_imapping;
+ static int is1st = 1;
minor = idr_find(&drm_minors_idr, minor_id);
if (!minor)
if (!dev->open_count++)
need_setup = 1;
mutex_lock(&dev->struct_mutex);
- old_imapping = inode->i_mapping;
old_mapping = dev->dev_mapping;
- if (old_mapping == NULL)
+
+ if (is1st) {
dev->dev_mapping = &inode->i_data;
- /* ihold ensures nobody can remove inode with our i_data */
+ is1st = 0;
+ } else {
+ if (old_mapping == NULL)
+ dev->dev_mapping = &inode->i_data;
+ }
ihold(container_of(dev->dev_mapping, struct inode, i_data));
+
inode->i_mapping = dev->dev_mapping;
filp->f_mapping = dev->dev_mapping;
mutex_unlock(&dev->struct_mutex);
err_undo:
mutex_lock(&dev->struct_mutex);
- filp->f_mapping = old_imapping;
- inode->i_mapping = old_imapping;
+ filp->f_mapping = old_mapping;
+ inode->i_mapping = old_mapping;
iput(container_of(dev->dev_mapping, struct inode, i_data));
dev->dev_mapping = old_mapping;
mutex_unlock(&dev->struct_mutex);