sparc: arch/sparc/kernel/apc.c to unlocked_ioctl
authorStoyan Gaydarov <stoyboyker@gmail.com>
Tue, 15 Jul 2008 05:12:29 +0000 (22:12 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Jul 2008 04:56:16 +0000 (21:56 -0700)
This changes arch/sparc/kernel/apc.c to use unlocked_ioctl

Signed-off-by: Stoyan Gaydarov <stoyboyker@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/kernel/apc.c

index 54f7ccd..5267d48 100644 (file)
@@ -85,54 +85,70 @@ static int apc_release(struct inode *inode, struct file *f)
        return 0;
 }
 
-static int apc_ioctl(struct inode *inode, struct file *f, 
-                    unsigned int cmd, unsigned long __arg)
+static long apc_ioctl(struct file *f, unsigned int cmd, unsigned long __arg)
 {
        __u8 inarg, __user *arg;
 
        arg = (__u8 __user *) __arg;
+
+       lock_kernel();
+
        switch (cmd) {
        case APCIOCGFANCTL:
-               if (put_user(apc_readb(APC_FANCTL_REG) & APC_REGMASK, arg))
-                               return -EFAULT;
+               if (put_user(apc_readb(APC_FANCTL_REG) & APC_REGMASK, arg)) {
+                       unlock_kernel();
+                       return -EFAULT;
+               }
                break;
 
        case APCIOCGCPWR:
-               if (put_user(apc_readb(APC_CPOWER_REG) & APC_REGMASK, arg))
+               if (put_user(apc_readb(APC_CPOWER_REG) & APC_REGMASK, arg)) {
+                       unlock_kernel();
                        return -EFAULT;
+               }
                break;
 
        case APCIOCGBPORT:
-               if (put_user(apc_readb(APC_BPORT_REG) & APC_BPMASK, arg))
+               if (put_user(apc_readb(APC_BPORT_REG) & APC_BPMASK, arg)) {
+                       unlock_kernel();
                        return -EFAULT;
+               }
                break;
 
        case APCIOCSFANCTL:
-               if (get_user(inarg, arg))
+               if (get_user(inarg, arg)) {
+                       unlock_kernel();
                        return -EFAULT;
+               }
                apc_writeb(inarg & APC_REGMASK, APC_FANCTL_REG);
                break;
        case APCIOCSCPWR:
-               if (get_user(inarg, arg))
+               if (get_user(inarg, arg)) {
+                       unlock_kernel();
                        return -EFAULT;
+               }
                apc_writeb(inarg & APC_REGMASK, APC_CPOWER_REG);
                break;
        case APCIOCSBPORT:
-               if (get_user(inarg, arg))
+               if (get_user(inarg, arg)) {
+                       unlock_kernel();
                        return -EFAULT;
+               }
                apc_writeb(inarg & APC_BPMASK, APC_BPORT_REG);
                break;
        default:
+               unlock_kernel();
                return -EINVAL;
        };
 
+       unlock_kernel();
        return 0;
 }
 
 static const struct file_operations apc_fops = {
-       .ioctl =        apc_ioctl,
-       .open =         apc_open,
-       .release =      apc_release,
+       .unlocked_ioctl =       apc_ioctl,
+       .open =                 apc_open,
+       .release =              apc_release,
 };
 
 static struct miscdevice apc_miscdev = { APC_MINOR, APC_DEVNAME, &apc_fops };