]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/message/fusion/mptctl.c
Merge branch 'master' into tk71
[mv-sheeva.git] / drivers / message / fusion / mptctl.c
index d8ddfdf8be14927c3e7a412355077b86ace48262..e8deb8ed0499d055cf258aca26e664263d099455 100644 (file)
@@ -54,7 +54,7 @@
 #include <linux/pci.h>
 #include <linux/delay.h>       /* for mdelay */
 #include <linux/miscdevice.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/compat.h>
 
 #include <asm/io.h>
@@ -83,6 +83,7 @@ MODULE_VERSION(my_VERSION);
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 
+static DEFINE_MUTEX(mpctl_mutex);
 static u8 mptctl_id = MPT_MAX_PROTOCOL_DRIVERS;
 static u8 mptctl_taskmgmt_id = MPT_MAX_PROTOCOL_DRIVERS;
 
@@ -595,18 +596,25 @@ mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
        return 1;
 }
 
+static int
+mptctl_release(struct inode *inode, struct file *filep)
+{
+       fasync_helper(-1, filep, 0, &async_queue);
+       return 0;
+}
+
 static int
 mptctl_fasync(int fd, struct file *filep, int mode)
 {
        MPT_ADAPTER     *ioc;
        int ret;
 
-       lock_kernel();
+       mutex_lock(&mpctl_mutex);
        list_for_each_entry(ioc, &ioc_list, list)
                ioc->aen_event_read_flag=0;
 
        ret = fasync_helper(fd, filep, mode, &async_queue);
-       unlock_kernel();
+       mutex_unlock(&mpctl_mutex);
        return ret;
 }
 
@@ -698,9 +706,9 @@ static long
 mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        long ret;
-       lock_kernel();
+       mutex_lock(&mpctl_mutex);
        ret = __mptctl_ioctl(file, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&mpctl_mutex);
        return ret;
 }
 
@@ -2814,6 +2822,7 @@ static const struct file_operations mptctl_fops = {
        .llseek =       no_llseek,
        .fasync =       mptctl_fasync,
        .unlocked_ioctl = mptctl_ioctl,
+       .release =      mptctl_release,
 #ifdef CONFIG_COMPAT
        .compat_ioctl = compat_mpctl_ioctl,
 #endif
@@ -2926,7 +2935,7 @@ compat_mpt_command(struct file *filp, unsigned int cmd,
 static long compat_mpctl_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
 {
        long ret;
-       lock_kernel();
+       mutex_lock(&mpctl_mutex);
        switch (cmd) {
        case MPTIOCINFO:
        case MPTIOCINFO1:
@@ -2951,7 +2960,7 @@ static long compat_mpctl_ioctl(struct file *f, unsigned int cmd, unsigned long a
                ret = -ENOIOCTLCMD;
                break;
        }
-       unlock_kernel();
+       mutex_unlock(&mpctl_mutex);
        return ret;
 }