OSDN Git Service

pxa3xx-gcu: quite playing silly buggers with ->f_op
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 6 Apr 2013 00:39:36 +0000 (20:39 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 9 Apr 2013 18:16:40 +0000 (14:16 -0400)
misc device gets ->private_data pointing to struct miscdevice
on open(), so we can use that to get to per-device structure
instead of relying on file_operations being copied into it.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/video/pxa3xx-gcu.c

index 6c984ea..4c318a3 100644 (file)
@@ -369,15 +369,20 @@ pxa3xx_gcu_wait_free(struct pxa3xx_gcu_priv *priv)
 
 /* Misc device layer */
 
+static inline struct pxa3xx_gcu_priv *file_dev(struct file *file)
+{
+       struct miscdevice *dev = file->private_data;
+       return container_of(dev, struct pxa3xx_gcu_priv, misc_dev);
+}
+
 static ssize_t
-pxa3xx_gcu_misc_write(struct file *filp, const char *buff,
+pxa3xx_gcu_misc_write(struct file *file, const char *buff,
                      size_t count, loff_t *offp)
 {
        int ret;
        unsigned long flags;
        struct pxa3xx_gcu_batch *buffer;
-       struct pxa3xx_gcu_priv *priv =
-               container_of(filp->f_op, struct pxa3xx_gcu_priv, misc_fops);
+       struct pxa3xx_gcu_priv *priv = file_dev(file);
 
        int words = count / 4;
 
@@ -450,11 +455,10 @@ pxa3xx_gcu_misc_write(struct file *filp, const char *buff,
 
 
 static long
-pxa3xx_gcu_misc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+pxa3xx_gcu_misc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        unsigned long flags;
-       struct pxa3xx_gcu_priv *priv =
-               container_of(filp->f_op, struct pxa3xx_gcu_priv, misc_fops);
+       struct pxa3xx_gcu_priv *priv = file_dev(file);
 
        switch (cmd) {
        case PXA3XX_GCU_IOCTL_RESET:
@@ -471,11 +475,10 @@ pxa3xx_gcu_misc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 }
 
 static int
-pxa3xx_gcu_misc_mmap(struct file *filp, struct vm_area_struct *vma)
+pxa3xx_gcu_misc_mmap(struct file *file, struct vm_area_struct *vma)
 {
        unsigned int size = vma->vm_end - vma->vm_start;
-       struct pxa3xx_gcu_priv *priv =
-               container_of(filp->f_op, struct pxa3xx_gcu_priv, misc_fops);
+       struct pxa3xx_gcu_priv *priv = file_dev(file);
 
        switch (vma->vm_pgoff) {
        case 0: