aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBernd Porr <berndporr@f2s.com>2011-11-08 16:23:03 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2011-11-26 21:34:14 -0500
commit3ffab428f40849ed5f21bcfd7285bdef7902f9ca (patch)
tree2b9613bd348ea6317e0048367ae1f1bb98a69d50
parent8b78607fc4a26c2e26c4a614ff0bbd3380abc402 (diff)
staging: comedi: fix oops for USB DAQ devices.
This fixes kernel oops when an USB DAQ device is plugged out while it's communicating with the userspace software. Signed-off-by: Bernd Porr <berndporr@f2s.com> Cc: stable <stable@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/staging/comedi/comedi_fops.c71
1 files changed, 53 insertions, 18 deletions
diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c
index 21d8c1c16cd8..156622a6f162 100644
--- a/drivers/staging/comedi/comedi_fops.c
+++ b/drivers/staging/comedi/comedi_fops.c
@@ -1452,9 +1452,6 @@ static struct vm_operations_struct comedi_vm_ops = {
1452static int comedi_mmap(struct file *file, struct vm_area_struct *vma) 1452static int comedi_mmap(struct file *file, struct vm_area_struct *vma)
1453{ 1453{
1454 const unsigned minor = iminor(file->f_dentry->d_inode); 1454 const unsigned minor = iminor(file->f_dentry->d_inode);
1455 struct comedi_device_file_info *dev_file_info =
1456 comedi_get_device_file_info(minor);
1457 struct comedi_device *dev = dev_file_info->device;
1458 struct comedi_async *async = NULL; 1455 struct comedi_async *async = NULL;
1459 unsigned long start = vma->vm_start; 1456 unsigned long start = vma->vm_start;
1460 unsigned long size; 1457 unsigned long size;
@@ -1462,6 +1459,15 @@ static int comedi_mmap(struct file *file, struct vm_area_struct *vma)
1462 int i; 1459 int i;
1463 int retval; 1460 int retval;
1464 struct comedi_subdevice *s; 1461 struct comedi_subdevice *s;
1462 struct comedi_device_file_info *dev_file_info;
1463 struct comedi_device *dev;
1464
1465 dev_file_info = comedi_get_device_file_info(minor);
1466 if (dev_file_info == NULL)
1467 return -ENODEV;
1468 dev = dev_file_info->device;
1469 if (dev == NULL)
1470 return -ENODEV;
1465 1471
1466 mutex_lock(&dev->mutex); 1472 mutex_lock(&dev->mutex);
1467 if (!dev->attached) { 1473 if (!dev->attached) {
@@ -1528,11 +1534,17 @@ static unsigned int comedi_poll(struct file *file, poll_table * wait)
1528{ 1534{
1529 unsigned int mask = 0; 1535 unsigned int mask = 0;
1530 const unsigned minor = iminor(file->f_dentry->d_inode); 1536 const unsigned minor = iminor(file->f_dentry->d_inode);
1531 struct comedi_device_file_info *dev_file_info =
1532 comedi_get_device_file_info(minor);
1533 struct comedi_device *dev = dev_file_info->device;
1534 struct comedi_subdevice *read_subdev; 1537 struct comedi_subdevice *read_subdev;
1535 struct comedi_subdevice *write_subdev; 1538 struct comedi_subdevice *write_subdev;
1539 struct comedi_device_file_info *dev_file_info;
1540 struct comedi_device *dev;
1541 dev_file_info = comedi_get_device_file_info(minor);
1542
1543 if (dev_file_info == NULL)
1544 return -ENODEV;
1545 dev = dev_file_info->device;
1546 if (dev == NULL)
1547 return -ENODEV;
1536 1548
1537 mutex_lock(&dev->mutex); 1549 mutex_lock(&dev->mutex);
1538 if (!dev->attached) { 1550 if (!dev->attached) {
@@ -1578,9 +1590,15 @@ static ssize_t comedi_write(struct file *file, const char __user *buf,
1578 int n, m, count = 0, retval = 0; 1590 int n, m, count = 0, retval = 0;
1579 DECLARE_WAITQUEUE(wait, current); 1591 DECLARE_WAITQUEUE(wait, current);
1580 const unsigned minor = iminor(file->f_dentry->d_inode); 1592 const unsigned minor = iminor(file->f_dentry->d_inode);
1581 struct comedi_device_file_info *dev_file_info = 1593 struct comedi_device_file_info *dev_file_info;
1582 comedi_get_device_file_info(minor); 1594 struct comedi_device *dev;
1583 struct comedi_device *dev = dev_file_info->device; 1595 dev_file_info = comedi_get_device_file_info(minor);
1596
1597 if (dev_file_info == NULL)
1598 return -ENODEV;
1599 dev = dev_file_info->device;
1600 if (dev == NULL)
1601 return -ENODEV;
1584 1602
1585 if (!dev->attached) { 1603 if (!dev->attached) {
1586 DPRINTK("no driver configured on comedi%i\n", dev->minor); 1604 DPRINTK("no driver configured on comedi%i\n", dev->minor);
@@ -1683,9 +1701,15 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes,
1683 int n, m, count = 0, retval = 0; 1701 int n, m, count = 0, retval = 0;
1684 DECLARE_WAITQUEUE(wait, current); 1702 DECLARE_WAITQUEUE(wait, current);
1685 const unsigned minor = iminor(file->f_dentry->d_inode); 1703 const unsigned minor = iminor(file->f_dentry->d_inode);
1686 struct comedi_device_file_info *dev_file_info = 1704 struct comedi_device_file_info *dev_file_info;
1687 comedi_get_device_file_info(minor); 1705 struct comedi_device *dev;
1688 struct comedi_device *dev = dev_file_info->device; 1706 dev_file_info = comedi_get_device_file_info(minor);
1707
1708 if (dev_file_info == NULL)
1709 return -ENODEV;
1710 dev = dev_file_info->device;
1711 if (dev == NULL)
1712 return -ENODEV;
1689 1713
1690 if (!dev->attached) { 1714 if (!dev->attached) {
1691 DPRINTK("no driver configured on comedi%i\n", dev->minor); 1715 DPRINTK("no driver configured on comedi%i\n", dev->minor);
@@ -1885,11 +1909,17 @@ ok:
1885static int comedi_close(struct inode *inode, struct file *file) 1909static int comedi_close(struct inode *inode, struct file *file)
1886{ 1910{
1887 const unsigned minor = iminor(inode); 1911 const unsigned minor = iminor(inode);
1888 struct comedi_device_file_info *dev_file_info =
1889 comedi_get_device_file_info(minor);
1890 struct comedi_device *dev = dev_file_info->device;
1891 struct comedi_subdevice *s = NULL; 1912 struct comedi_subdevice *s = NULL;
1892 int i; 1913 int i;
1914 struct comedi_device_file_info *dev_file_info;
1915 struct comedi_device *dev;
1916 dev_file_info = comedi_get_device_file_info(minor);
1917
1918 if (dev_file_info == NULL)
1919 return -ENODEV;
1920 dev = dev_file_info->device;
1921 if (dev == NULL)
1922 return -ENODEV;
1893 1923
1894 mutex_lock(&dev->mutex); 1924 mutex_lock(&dev->mutex);
1895 1925
@@ -1923,10 +1953,15 @@ static int comedi_close(struct inode *inode, struct file *file)
1923static int comedi_fasync(int fd, struct file *file, int on) 1953static int comedi_fasync(int fd, struct file *file, int on)
1924{ 1954{
1925 const unsigned minor = iminor(file->f_dentry->d_inode); 1955 const unsigned minor = iminor(file->f_dentry->d_inode);
1926 struct comedi_device_file_info *dev_file_info = 1956 struct comedi_device_file_info *dev_file_info;
1927 comedi_get_device_file_info(minor); 1957 struct comedi_device *dev;
1958 dev_file_info = comedi_get_device_file_info(minor);
1928 1959
1929 struct comedi_device *dev = dev_file_info->device; 1960 if (dev_file_info == NULL)
1961 return -ENODEV;
1962 dev = dev_file_info->device;
1963 if (dev == NULL)
1964 return -ENODEV;
1930 1965
1931 return fasync_helper(fd, file, on, &dev->async_queue); 1966 return fasync_helper(fd, file, on, &dev->async_queue);
1932} 1967}