static int open_rio(struct inode *inode, struct file *file)
 {
        struct rio_usb_data *rio = &rio_instance;
+
+       /* against disconnect() */
        lock_kernel();
        mutex_lock(&(rio->lock));
 
        if (rio->isopen || !rio->present) {
                mutex_unlock(&(rio->lock));
+               unlock_kernel();
                return -EBUSY;
        }
        rio->isopen = 1;
        int retries;
        int retval=0;
 
-       lock_kernel();
        mutex_lock(&(rio->lock));
         /* Sanity check to make sure rio is connected, powered, etc */
         if (rio->present == 0 || rio->rio_dev == NULL) {
 
 err_out:
        mutex_unlock(&(rio->lock));
-       unlock_kernel();
        return retval;
 }
 
        struct rio_usb_data *rio = usb_get_intfdata (intf);
 
        usb_set_intfdata (intf, NULL);
+       lock_kernel();
        if (rio) {
                usb_deregister_dev(intf, &usb_rio_class);
 
                        /* better let it finish - the release will do whats needed */
                        rio->rio_dev = NULL;
                        mutex_unlock(&(rio->lock));
+                       unlock_kernel();
                        return;
                }
                kfree(rio->ibuf);
                rio->present = 0;
                mutex_unlock(&(rio->lock));
        }
+       unlock_kernel();
 }
 
 static const struct usb_device_id rio_table[] = {