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 };