]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/char/viotape.c
Merge commit '85082fd7cbe3173198aac0eb5e85ab1edcc6352c' into test-build
[linux-2.6-omap-h63xx.git] / drivers / char / viotape.c
index c39ddaff5e8f18e230ed8ea8e4f1d3c4c2f4533e..e5da98d8f9cd70f493ecb8c9d7521639f937e779 100644 (file)
@@ -46,6 +46,7 @@
 #include <linux/completion.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
+#include <linux/smp_lock.h>
 
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
@@ -677,6 +678,17 @@ free_op:
        return ret;
 }
 
+static long viotap_unlocked_ioctl(struct file *file,
+               unsigned int cmd, unsigned long arg)
+{
+       long rc;
+
+       lock_kernel();
+       rc = viotap_ioctl(file->f_path.dentry->d_inode, file, cmd, arg);
+       unlock_kernel();
+       return rc;
+}
+
 static int viotap_open(struct inode *inode, struct file *file)
 {
        HvLpEvent_Rc hvrc;
@@ -687,6 +699,7 @@ static int viotap_open(struct inode *inode, struct file *file)
        if (op == NULL)
                return -ENOMEM;
 
+       lock_kernel();
        get_dev_info(file->f_path.dentry->d_inode, &devi);
 
        /* Note: We currently only support one mode! */
@@ -717,6 +730,7 @@ static int viotap_open(struct inode *inode, struct file *file)
 
 free_op:
        free_op_struct(op);
+       unlock_kernel();
        return ret;
 }
 
@@ -783,12 +797,12 @@ free_op:
 }
 
 const struct file_operations viotap_fops = {
-       .owner =        THIS_MODULE,
-       .read =         viotap_read,
-       .write =        viotap_write,
-       .ioctl =        viotap_ioctl,
-       .open =         viotap_open,
-       .release =      viotap_release,
+       .owner =                THIS_MODULE,
+       .read =                 viotap_read,
+       .write =                viotap_write,
+       .unlocked_ioctl =       viotap_unlocked_ioctl,
+       .open =                 viotap_open,
+       .release =              viotap_release,
 };
 
 /* Handle interrupt events for tape */