All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm: restore open_count if drm_setup fails
@ 2012-10-29 17:35 Ilija Hadzic
  2012-10-29 17:35 ` [PATCH 2/2] drm: set dev_mapping before calling drm_open_helper Ilija Hadzic
  2012-10-30 13:51 ` [PATCH 1/2] drm: restore open_count if drm_setup fails Thomas Hellstrom
  0 siblings, 2 replies; 4+ messages in thread
From: Ilija Hadzic @ 2012-10-29 17:35 UTC (permalink / raw)
  To: dri-devel; +Cc: stable

If drm_setup (called at first open) fails, the whole
open call has failed, so we should not keep the
open_count incremented.

Signed-off-by: Ilija Hadzic <ihadzic@research.bell-labs.com>
Cc: stable@vger.kernel.org
---
 drivers/gpu/drm/drm_fops.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c
index 7ef1b67..af68eca 100644
--- a/drivers/gpu/drm/drm_fops.c
+++ b/drivers/gpu/drm/drm_fops.c
@@ -135,8 +135,11 @@ int drm_open(struct inode *inode, struct file *filp)
 	retcode = drm_open_helper(inode, filp, dev);
 	if (!retcode) {
 		atomic_inc(&dev->counts[_DRM_STAT_OPENS]);
-		if (!dev->open_count++)
+		if (!dev->open_count++) {
 			retcode = drm_setup(dev);
+			if (retcode)
+				dev->open_count--;
+		}
 	}
 	if (!retcode) {
 		mutex_lock(&dev->struct_mutex);
-- 
1.7.12.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] drm: set dev_mapping before calling drm_open_helper
  2012-10-29 17:35 [PATCH 1/2] drm: restore open_count if drm_setup fails Ilija Hadzic
@ 2012-10-29 17:35 ` Ilija Hadzic
  2012-10-30 13:54   ` Thomas Hellstrom
  2012-10-30 13:51 ` [PATCH 1/2] drm: restore open_count if drm_setup fails Thomas Hellstrom
  1 sibling, 1 reply; 4+ messages in thread
From: Ilija Hadzic @ 2012-10-29 17:35 UTC (permalink / raw)
  To: dri-devel; +Cc: stable

Some drivers (specifically vmwgfx) look at dev_mapping
in their open hook, so we have to set dev->dev_mapping
earlier in the process.

Reference:
http://lists.freedesktop.org/archives/dri-devel/2012-October/029420.html

Signed-off-by: Ilija Hadzic <ihadzic@research.bell-labs.com>
Reported-by: Thomas Hellstrom <thellstrom@vmware.com>
Cc: stable@vger.kernel.org
---
 drivers/gpu/drm/drm_fops.c | 47 +++++++++++++++++++++++++++++-----------------
 1 file changed, 30 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c
index af68eca..133b413 100644
--- a/drivers/gpu/drm/drm_fops.c
+++ b/drivers/gpu/drm/drm_fops.c
@@ -121,6 +121,8 @@ int drm_open(struct inode *inode, struct file *filp)
 	int minor_id = iminor(inode);
 	struct drm_minor *minor;
 	int retcode = 0;
+	int need_setup = 0;
+	struct address_space *old_mapping;
 
 	minor = idr_find(&drm_minors_idr, minor_id);
 	if (!minor)
@@ -132,26 +134,37 @@ int drm_open(struct inode *inode, struct file *filp)
 	if (drm_device_is_unplugged(dev))
 		return -ENODEV;
 
+	if (!dev->open_count++)
+		need_setup = 1;
+	mutex_lock(&dev->struct_mutex);
+	old_mapping = dev->dev_mapping;
+	if (old_mapping == NULL)
+		dev->dev_mapping = &inode->i_data;
+	/* ihold ensures nobody can remove inode with our 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);
+
 	retcode = drm_open_helper(inode, filp, dev);
-	if (!retcode) {
-		atomic_inc(&dev->counts[_DRM_STAT_OPENS]);
-		if (!dev->open_count++) {
-			retcode = drm_setup(dev);
-			if (retcode)
-				dev->open_count--;
-		}
-	}
-	if (!retcode) {
-		mutex_lock(&dev->struct_mutex);
-		if (dev->dev_mapping == NULL)
-			dev->dev_mapping = &inode->i_data;
-		/* ihold ensures nobody can remove inode with our 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);
+	if (retcode)
+		goto err_undo;
+	atomic_inc(&dev->counts[_DRM_STAT_OPENS]);
+	if (need_setup) {
+		retcode = drm_setup(dev);
+		if (retcode)
+			goto err_undo;
 	}
+	return 0;
 
+err_undo:
+	mutex_lock(&dev->struct_mutex);
+	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);
+	dev->open_count--;
 	return retcode;
 }
 EXPORT_SYMBOL(drm_open);
-- 
1.7.12.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] drm: restore open_count if drm_setup fails
  2012-10-29 17:35 [PATCH 1/2] drm: restore open_count if drm_setup fails Ilija Hadzic
  2012-10-29 17:35 ` [PATCH 2/2] drm: set dev_mapping before calling drm_open_helper Ilija Hadzic
@ 2012-10-30 13:51 ` Thomas Hellstrom
  1 sibling, 0 replies; 4+ messages in thread
From: Thomas Hellstrom @ 2012-10-30 13:51 UTC (permalink / raw)
  To: Ilija Hadzic; +Cc: stable, dri-devel

Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>

On 10/29/2012 06:35 PM, Ilija Hadzic wrote:
> If drm_setup (called at first open) fails, the whole
> open call has failed, so we should not keep the
> open_count incremented.
>
> Signed-off-by: Ilija Hadzic <ihadzic@research.bell-labs.com>
> Cc: stable@vger.kernel.org
> ---
>   drivers/gpu/drm/drm_fops.c | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c
> index 7ef1b67..af68eca 100644
> --- a/drivers/gpu/drm/drm_fops.c
> +++ b/drivers/gpu/drm/drm_fops.c
> @@ -135,8 +135,11 @@ int drm_open(struct inode *inode, struct file *filp)
>   	retcode = drm_open_helper(inode, filp, dev);
>   	if (!retcode) {
>   		atomic_inc(&dev->counts[_DRM_STAT_OPENS]);
> -		if (!dev->open_count++)
> +		if (!dev->open_count++) {
>   			retcode = drm_setup(dev);
> +			if (retcode)
> +				dev->open_count--;
> +		}
>   	}
>   	if (!retcode) {
>   		mutex_lock(&dev->struct_mutex);

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] drm: set dev_mapping before calling drm_open_helper
  2012-10-29 17:35 ` [PATCH 2/2] drm: set dev_mapping before calling drm_open_helper Ilija Hadzic
@ 2012-10-30 13:54   ` Thomas Hellstrom
  0 siblings, 0 replies; 4+ messages in thread
From: Thomas Hellstrom @ 2012-10-30 13:54 UTC (permalink / raw)
  To: Ilija Hadzic; +Cc: stable, dri-devel

Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>

On 10/29/2012 06:35 PM, Ilija Hadzic wrote:
> Some drivers (specifically vmwgfx) look at dev_mapping
> in their open hook, so we have to set dev->dev_mapping
> earlier in the process.
>
> Reference:
> http://lists.freedesktop.org/archives/dri-devel/2012-October/029420.html
>
> Signed-off-by: Ilija Hadzic <ihadzic@research.bell-labs.com>
> Reported-by: Thomas Hellstrom <thellstrom@vmware.com>
> Cc: stable@vger.kernel.org
> ---
>   drivers/gpu/drm/drm_fops.c | 47 +++++++++++++++++++++++++++++-----------------
>   1 file changed, 30 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c
> index af68eca..133b413 100644
> --- a/drivers/gpu/drm/drm_fops.c
> +++ b/drivers/gpu/drm/drm_fops.c
> @@ -121,6 +121,8 @@ int drm_open(struct inode *inode, struct file *filp)
>   	int minor_id = iminor(inode);
>   	struct drm_minor *minor;
>   	int retcode = 0;
> +	int need_setup = 0;
> +	struct address_space *old_mapping;
>   
>   	minor = idr_find(&drm_minors_idr, minor_id);
>   	if (!minor)
> @@ -132,26 +134,37 @@ int drm_open(struct inode *inode, struct file *filp)
>   	if (drm_device_is_unplugged(dev))
>   		return -ENODEV;
>   
> +	if (!dev->open_count++)
> +		need_setup = 1;
> +	mutex_lock(&dev->struct_mutex);
> +	old_mapping = dev->dev_mapping;
> +	if (old_mapping == NULL)
> +		dev->dev_mapping = &inode->i_data;
> +	/* ihold ensures nobody can remove inode with our 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);
> +
>   	retcode = drm_open_helper(inode, filp, dev);
> -	if (!retcode) {
> -		atomic_inc(&dev->counts[_DRM_STAT_OPENS]);
> -		if (!dev->open_count++) {
> -			retcode = drm_setup(dev);
> -			if (retcode)
> -				dev->open_count--;
> -		}
> -	}
> -	if (!retcode) {
> -		mutex_lock(&dev->struct_mutex);
> -		if (dev->dev_mapping == NULL)
> -			dev->dev_mapping = &inode->i_data;
> -		/* ihold ensures nobody can remove inode with our 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);
> +	if (retcode)
> +		goto err_undo;
> +	atomic_inc(&dev->counts[_DRM_STAT_OPENS]);
> +	if (need_setup) {
> +		retcode = drm_setup(dev);
> +		if (retcode)
> +			goto err_undo;
>   	}
> +	return 0;
>   
> +err_undo:
> +	mutex_lock(&dev->struct_mutex);
> +	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);
> +	dev->open_count--;
>   	return retcode;
>   }
>   EXPORT_SYMBOL(drm_open);

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-10-30 13:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-29 17:35 [PATCH 1/2] drm: restore open_count if drm_setup fails Ilija Hadzic
2012-10-29 17:35 ` [PATCH 2/2] drm: set dev_mapping before calling drm_open_helper Ilija Hadzic
2012-10-30 13:54   ` Thomas Hellstrom
2012-10-30 13:51 ` [PATCH 1/2] drm: restore open_count if drm_setup fails Thomas Hellstrom

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.