Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7963e9db authored by Dave Airlie's avatar Dave Airlie
Browse files

Revert "drm: drop redundant drm_file->is_master"

This reverts commit 48ba8137.

Thanks to Chris:
"drm_file->is_master is not synomous with having drm_file->master ==
drm_file->minor->master. This is because drm_file->master is the same
for all drm_files of the same generation and so when there is a master,
every drm_file believes itself to be the master. Confusion ensues and
things go pear shaped when one file is closed and there is no master
anymore."

Conflicts:
	drivers/gpu/drm/drm_drv.c
	drivers/gpu/drm/drm_stub.c
parent fa1d0ee6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3244,7 +3244,7 @@ int drm_mode_getfb(struct drm_device *dev,
	r->bpp = fb->bits_per_pixel;
	r->pitch = fb->pitches[0];
	if (fb->funcs->create_handle) {
		if (drm_is_master(file_priv) || capable(CAP_SYS_ADMIN) ||
		if (file_priv->is_master || capable(CAP_SYS_ADMIN) ||
		    drm_is_control_client(file_priv)) {
			ret = fb->funcs->create_handle(fb, file_priv,
						       &r->handle);
+7 −3
Original line number Diff line number Diff line
@@ -179,7 +179,7 @@ int drm_setmaster_ioctl(struct drm_device *dev, void *data,
	int ret = 0;

	mutex_lock(&dev->master_mutex);
	if (drm_is_master(file_priv))
	if (file_priv->is_master)
		goto out_unlock;

	if (file_priv->minor->master) {
@@ -193,11 +193,14 @@ int drm_setmaster_ioctl(struct drm_device *dev, void *data,
	}

	file_priv->minor->master = drm_master_get(file_priv->master);
	file_priv->is_master = 1;
	if (dev->driver->master_set) {
		ret = dev->driver->master_set(dev, file_priv, false);
		if (unlikely(ret != 0))
		if (unlikely(ret != 0)) {
			file_priv->is_master = 0;
			drm_master_put(&file_priv->minor->master);
		}
	}

out_unlock:
	mutex_unlock(&dev->master_mutex);
@@ -210,7 +213,7 @@ int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
	int ret = -EINVAL;

	mutex_lock(&dev->master_mutex);
	if (!drm_is_master(file_priv))
	if (!file_priv->is_master)
		goto out_unlock;

	if (!file_priv->minor->master)
@@ -220,6 +223,7 @@ int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
	if (dev->driver->master_drop)
		dev->driver->master_drop(dev, file_priv, false);
	drm_master_put(&file_priv->minor->master);
	file_priv->is_master = 0;

out_unlock:
	mutex_unlock(&dev->master_mutex);
+3 −1
Original line number Diff line number Diff line
@@ -194,6 +194,7 @@ static int drm_open_helper(struct file *filp, struct drm_minor *minor)
			goto out_close;
		}

		priv->is_master = 1;
		/* take another reference for the copy in the local file priv */
		priv->master = drm_master_get(priv->minor->master);
		priv->authenticated = 1;
@@ -425,7 +426,7 @@ int drm_release(struct inode *inode, struct file *filp)

	mutex_lock(&dev->master_mutex);

	if (drm_is_master(file_priv)) {
	if (file_priv->is_master) {
		struct drm_master *master = file_priv->master;

		/**
@@ -453,6 +454,7 @@ int drm_release(struct inode *inode, struct file *filp)
	/* drop the master reference held by the file priv */
	if (file_priv->master)
		drm_master_put(&file_priv->master);
	file_priv->is_master = 0;
	mutex_unlock(&dev->master_mutex);

	if (dev->driver->postclose)
+1 −1
Original line number Diff line number Diff line
@@ -607,7 +607,7 @@ static int drm_ioctl_permit(u32 flags, struct drm_file *file_priv)
		return -EACCES;

	/* MASTER is only for master or control clients */
	if (unlikely((flags & DRM_MASTER) && !drm_is_master(file_priv) &&
	if (unlikely((flags & DRM_MASTER) && !file_priv->is_master &&
		     !drm_is_control_client(file_priv)))
		return -EACCES;

+1 −1
Original line number Diff line number Diff line
@@ -112,7 +112,7 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
	/* don't set the block all signals on the master process for now 
	 * really probably not the correct answer but lets us debug xkb
 	 * xserver for now */
	if (!drm_is_master(file_priv)) {
	if (!file_priv->is_master) {
		sigemptyset(&dev->sigmask);
		sigaddset(&dev->sigmask, SIGSTOP);
		sigaddset(&dev->sigmask, SIGTSTP);
Loading