userns: Convert drm to use kuid and kgid and struct pid where appropriate
authorEric W. Biederman <ebiederm@xmission.com>
Wed, 8 Feb 2012 00:47:26 +0000 (16:47 -0800)
committerEric W. Biederman <ebiederm@xmission.com>
Thu, 13 Sep 2012 21:32:24 +0000 (14:32 -0700)
Blink Blink this had not been converted to use struct pid ages ago?

- On drm open capture the openers kuid and struct pid.
- On drm close release the kuid and struct pid
- When reporting the uid and pid convert the kuid and struct pid
  into values in the appropriate namespace.

Cc: dri-devel@lists.freedesktop.org
Acked-by: Dave Airlie <airlied@redhat.com>
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
drivers/gpu/drm/drm_fops.c
drivers/gpu/drm/drm_info.c
drivers/gpu/drm/drm_ioctl.c
include/drm/drmP.h
init/Kconfig

index 5062eec673f16e9f03024dc2dd8845196a8dd0ef..433d2fad1fe61ba03a17db26bfc945ddaccea67d 100644 (file)
@@ -251,7 +251,7 @@ static int drm_open_helper(struct inode *inode, struct file *filp,
        filp->private_data = priv;
        priv->filp = filp;
        priv->uid = current_euid();
-       priv->pid = task_pid_nr(current);
+       priv->pid = get_pid(task_pid(current));
        priv->minor = idr_find(&drm_minors_idr, minor_id);
        priv->ioctl_count = 0;
        /* for compatibility root is always authenticated */
@@ -524,6 +524,7 @@ int drm_release(struct inode *inode, struct file *filp)
        if (drm_core_check_feature(dev, DRIVER_PRIME))
                drm_prime_destroy_file_private(&file_priv->prime);
 
+       put_pid(file_priv->pid);
        kfree(file_priv);
 
        /* ========================================================
index 8928edbb94c7f359592c1b66badb8a93888a48bd..eb0af393e6e298b3f0b91ed85eaef5dc4a1f3490 100644 (file)
@@ -191,8 +191,9 @@ int drm_clients_info(struct seq_file *m, void *data)
                seq_printf(m, "%c %3d %5d %5d %10u %10lu\n",
                           priv->authenticated ? 'y' : 'n',
                           priv->minor->index,
-                          priv->pid,
-                          priv->uid, priv->magic, priv->ioctl_count);
+                          pid_vnr(priv->pid),
+                          from_kuid_munged(seq_user_ns(m), priv->uid),
+                          priv->magic, priv->ioctl_count);
        }
        mutex_unlock(&dev->struct_mutex);
        return 0;
index 64a62c6973138f71a0627ec6e9a87c129d6e963e..39a43834cef9e57659ac5a5f5d4b490804523eed 100644 (file)
@@ -215,8 +215,8 @@ int drm_getclient(struct drm_device *dev, void *data,
        list_for_each_entry(pt, &dev->filelist, lhead) {
                if (i++ >= idx) {
                        client->auth = pt->authenticated;
-                       client->pid = pt->pid;
-                       client->uid = pt->uid;
+                       client->pid = pid_vnr(pt->pid);
+                       client->uid = from_kuid_munged(current_user_ns(), pt->uid);
                        client->magic = pt->magic;
                        client->iocs = pt->ioctl_count;
                        mutex_unlock(&dev->struct_mutex);
index d6b67bb9075f21b5782013b500ed6de52cdf4f68..9bc5c6a1d52ce1a0bee982b608e780414c3cc49c 100644 (file)
@@ -426,8 +426,8 @@ struct drm_prime_file_private {
 /** File private data */
 struct drm_file {
        int authenticated;
-       pid_t pid;
-       uid_t uid;
+       struct pid *pid;
+       kuid_t uid;
        drm_magic_t magic;
        unsigned long ioctl_count;
        struct list_head lhead;
index d09738dee238c24031c01430dead862f11004d43..6db6e751c5f35e133bca20d6326e74e35620f97c 100644 (file)
@@ -936,7 +936,6 @@ config UIDGID_CONVERTED
        depends on QUOTA = n
        depends on QUOTACTL = n
        depends on BSD_PROCESS_ACCT = n
-       depends on DRM = n
 
        # Networking
        depends on NET_9P = n