Signed-off-by: Arnd Bergmann <arnd@arndb.de>
  */
 
 #include <linux/slab.h>
+#include <linux/smp_lock.h>
 #include <linux/poll.h>
 #include <linux/module.h>
 #include <linux/serio.h>
        struct serio_raw_list *list;
        int retval = 0;
 
+       lock_kernel();
        retval = mutex_lock_interruptible(&serio_raw_mutex);
        if (retval)
-               return retval;
+               goto out_bkl;
 
        if (!(serio_raw = serio_raw_locate(iminor(inode)))) {
                retval = -ENODEV;
 
 out:
        mutex_unlock(&serio_raw_mutex);
+out_bkl:
+       unlock_kernel();
        return retval;
 }