patch-2.4.0-test4 linux/drivers/sbus/char/vfc_dev.c

Next file: linux/drivers/scsi/hosts.c
Previous file: linux/drivers/sbus/char/sunmouse.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test3/linux/drivers/sbus/char/vfc_dev.c linux/drivers/sbus/char/vfc_dev.c
@@ -21,6 +21,7 @@
 #include <linux/errno.h>
 #include <linux/sched.h>
 #include <linux/fs.h>
+#include <linux/smp_lock.h>
 
 #include <asm/openprom.h>
 #include <asm/oplib.h>
@@ -203,16 +204,19 @@
 	return 0;
 }
 
-static void vfc_release(struct inode *inode,struct file *file) 
+static int vfc_release(struct inode *inode,struct file *file) 
 {
 	struct vfc_dev *dev;
 
+	lock_kernel();
 	dev = vfc_get_dev_ptr(MINOR(inode->i_rdev));
-	if (dev == NULL)
-		return;
-	if (!dev->busy)
-		return;
+	if (!dev || !dev->busy) {
+		unlock_kernel();
+		return -EINVAL;
+	}
 	dev->busy = 0;
+	unlock_kernel();
+	return 0;
 }
 
 static int vfc_debug(struct vfc_dev *dev, int cmd, unsigned long arg) 
@@ -606,10 +610,12 @@
 	unsigned int map_size, ret, map_offset;
 	struct vfc_dev *dev;
 	
+	lock_kernel();
 	dev = vfc_get_dev_ptr(MINOR(inode->i_rdev));
-	if(dev == NULL)
+	if(dev == NULL) {
+		unlock_kernel();
 		return -ENODEV;
-	
+	}
 	map_size = vma->vm_end - vma->vm_start;
 	if(map_size > sizeof(struct vfc_regs)) 
 		map_size = sizeof(struct vfc_regs);
@@ -619,6 +625,7 @@
 	map_offset = (unsigned int) (long)dev->phys_regs;
 	ret = io_remap_page_range(vma->vm_start, map_offset, map_size, 
 				  vma->vm_page_prot, dev->which_io);
+	unlock_kernel();
 	if(ret)
 		return -EAGAIN;
 

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)