diff options
Diffstat (limited to 'drivers/gpu/drm/drm_fops.c')
-rw-r--r-- | drivers/gpu/drm/drm_fops.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c index 8ac7fbf6b2b..08d14df3bb4 100644 --- a/drivers/gpu/drm/drm_fops.c +++ b/drivers/gpu/drm/drm_fops.c | |||
@@ -300,6 +300,18 @@ static int drm_open_helper(struct inode *inode, struct file *filp, | |||
300 | goto out_free; | 300 | goto out_free; |
301 | } | 301 | } |
302 | } | 302 | } |
303 | mutex_lock(&dev->struct_mutex); | ||
304 | if (dev->driver->master_set) { | ||
305 | ret = dev->driver->master_set(dev, priv, true); | ||
306 | if (ret) { | ||
307 | /* drop both references if this fails */ | ||
308 | drm_master_put(&priv->minor->master); | ||
309 | drm_master_put(&priv->master); | ||
310 | mutex_unlock(&dev->struct_mutex); | ||
311 | goto out_free; | ||
312 | } | ||
313 | } | ||
314 | mutex_unlock(&dev->struct_mutex); | ||
303 | } else { | 315 | } else { |
304 | /* get a reference to the master */ | 316 | /* get a reference to the master */ |
305 | priv->master = drm_master_get(priv->minor->master); | 317 | priv->master = drm_master_get(priv->minor->master); |
@@ -533,6 +545,8 @@ int drm_release(struct inode *inode, struct file *filp) | |||
533 | 545 | ||
534 | if (file_priv->minor->master == file_priv->master) { | 546 | if (file_priv->minor->master == file_priv->master) { |
535 | /* drop the reference held my the minor */ | 547 | /* drop the reference held my the minor */ |
548 | if (dev->driver->master_drop) | ||
549 | dev->driver->master_drop(dev, file_priv, true); | ||
536 | drm_master_put(&file_priv->minor->master); | 550 | drm_master_put(&file_priv->minor->master); |
537 | } | 551 | } |
538 | } | 552 | } |