|
@@ -484,6 +484,7 @@ int drm_release(struct inode *inode, struct file *filp)
|
|
mutex_lock(&dev->struct_mutex);
|
|
mutex_lock(&dev->struct_mutex);
|
|
|
|
|
|
if (file_priv->is_master) {
|
|
if (file_priv->is_master) {
|
|
|
|
+ struct drm_master *master = file_priv->master;
|
|
struct drm_file *temp;
|
|
struct drm_file *temp;
|
|
list_for_each_entry(temp, &dev->filelist, lhead) {
|
|
list_for_each_entry(temp, &dev->filelist, lhead) {
|
|
if ((temp->master == file_priv->master) &&
|
|
if ((temp->master == file_priv->master) &&
|
|
@@ -491,6 +492,19 @@ int drm_release(struct inode *inode, struct file *filp)
|
|
temp->authenticated = 0;
|
|
temp->authenticated = 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Since the master is disappearing, so is the
|
|
|
|
+ * possibility to lock.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ if (master->lock.hw_lock) {
|
|
|
|
+ if (dev->sigdata.lock == master->lock.hw_lock)
|
|
|
|
+ dev->sigdata.lock = NULL;
|
|
|
|
+ master->lock.hw_lock = NULL;
|
|
|
|
+ master->lock.file_priv = NULL;
|
|
|
|
+ wake_up_interruptible_all(&master->lock.lock_queue);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (file_priv->minor->master == file_priv->master) {
|
|
if (file_priv->minor->master == file_priv->master) {
|
|
/* drop the reference held my the minor */
|
|
/* drop the reference held my the minor */
|
|
drm_master_put(&file_priv->minor->master);
|
|
drm_master_put(&file_priv->minor->master);
|