[SPARC] cpwatchdog: implement ->compat_ioctl
authorChristoph Hellwig <hch@lst.de>
Mon, 7 Nov 2005 22:13:14 +0000 (14:13 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Nov 2005 22:13:14 +0000 (14:13 -0800)
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/kernel/ioctl32.c
drivers/sbus/char/cpwatchdog.c

index f8e9ffb125c0fdf3684a65eac789b49464466f42..398ddbffc6a407a45024bb1b7c0d9668bd865d3d 100644 (file)
@@ -496,9 +496,6 @@ COMPATIBLE_IOCTL(DRM_IOCTL_LOCK)
 COMPATIBLE_IOCTL(DRM_IOCTL_UNLOCK)
 COMPATIBLE_IOCTL(DRM_IOCTL_FINISH)
 #endif /* DRM */
-COMPATIBLE_IOCTL(WIOCSTART)
-COMPATIBLE_IOCTL(WIOCSTOP)
-COMPATIBLE_IOCTL(WIOCGSTAT)
 /* And these ioctls need translation */
 /* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */
 HANDLE_IOCTL(FBIOPUTCMAP32, fbiogetputcmap)
index c82abeb59d3aa858fefd1b46cae9f98ff44dac7e..071ae24be8925b13ddbc03dae77a39d3e4e9de26 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 #include <linux/timer.h>
+#include <linux/smp_lock.h>
 #include <asm/irq.h>
 #include <asm/ebus.h>
 #include <asm/oplib.h>
@@ -394,6 +395,28 @@ static int wd_ioctl(struct inode *inode, struct file *file,
        return(0);
 }
 
+static long wd_compat_ioctl(struct file *file, unsigned int cmd,
+               unsigned long arg)
+{
+       int rval = -ENOIOCTLCMD;
+
+       switch (cmd) {
+       /* solaris ioctls are specific to this driver */
+       case WIOCSTART:
+       case WIOCSTOP:
+       case WIOCGSTAT:
+               lock_kernel();
+               rval = wd_ioctl(file->f_dentry->d_inode, file, cmd, arg);
+               lock_kernel();
+               break;
+       /* everything else is handled by the generic compat layer */
+       default:
+               break;
+       }
+
+       return rval;
+}
+
 static ssize_t wd_write(struct file    *file, 
                        const char      __user *buf, 
                        size_t          count, 
@@ -441,6 +464,7 @@ static irqreturn_t wd_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 static struct file_operations wd_fops = {
        .owner =        THIS_MODULE,
        .ioctl =        wd_ioctl,
+       .compat_ioctl = wd_compat_ioctl,
        .open =         wd_open,
        .write =        wd_write,
        .read =         wd_read,