• David Herrmann's avatar
    drm: fix returning -EINVAL on setmaster if another master is active · 08bec5b4
    David Herrmann authored
    We link every DRM "file_priv" to a "drm_master" structure. Currently, the
    drmSetMaster() call returns 0 when there is _any_ active master associated
    with the "drm_master" structure of the calling "file_priv". This means,
    that after drmSetMaster() we are not guaranteed to be DRM-Master and might
    not be able to perform mode-setting.
    
    A way to reproduce this is by starting weston with the DRM backend from
    within an X-console (eg., xterm). Because the xserver's "drm_master" is
    currently active, weston is assigned to the same master but is inactive
    because its VT is inactive and the xserver is still active. But when
    "fake-activating" weston, it calls drmSetMaster(). With current behavior
    this returns "0/success" and weston thinks that it is DRM-Master, even
    though it is not (as the xserver is still DRM-Master).
    Expected behavior would be drmSetMaster() to return -EINVAL, because the
    xserver is still DRM-Master. This patch changes exactly that.
    
    The only way this bogus behavior would be useful is for clients to check
    whether their associated "drm_master" is currently the active DRM-Master.
    But this logic fails if no DRM-Master is currently active at all. Because
    then the client itself would become DRM-Master (if it is root) and this
    makes this whole thing useles.
    
    Also note that the second "if-condition":
      file_priv->minor->master != file_priv->master
    is always true and can be skipped.
    Signed-off-by: default avatarDavid Herrmann <dh.herrmann@googlemail.com>
    Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
    08bec5b4
drm_stub.c 12.1 KB