@@ -671,7 +671,7 @@ static int do_insnlist_ioctl(struct comedi_device *dev,
671
671
}
672
672
673
673
insns =
674
- kmalloc ( sizeof (struct comedi_insn ) * insnlist . n_insns , GFP_KERNEL );
674
+ kcalloc ( insnlist . n_insns , sizeof (struct comedi_insn ), GFP_KERNEL );
675
675
if (!insns ) {
676
676
DPRINTK ("kmalloc failed\n" );
677
677
ret = - ENOMEM ;
@@ -1432,7 +1432,21 @@ static int do_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
1432
1432
return ret ;
1433
1433
}
1434
1434
1435
- static void comedi_unmap (struct vm_area_struct * area )
1435
+
1436
+ static void comedi_vm_open (struct vm_area_struct * area )
1437
+ {
1438
+ struct comedi_async * async ;
1439
+ struct comedi_device * dev ;
1440
+
1441
+ async = area -> vm_private_data ;
1442
+ dev = async -> subdevice -> device ;
1443
+
1444
+ mutex_lock (& dev -> mutex );
1445
+ async -> mmap_count ++ ;
1446
+ mutex_unlock (& dev -> mutex );
1447
+ }
1448
+
1449
+ static void comedi_vm_close (struct vm_area_struct * area )
1436
1450
{
1437
1451
struct comedi_async * async ;
1438
1452
struct comedi_device * dev ;
@@ -1446,22 +1460,29 @@ static void comedi_unmap(struct vm_area_struct *area)
1446
1460
}
1447
1461
1448
1462
static struct vm_operations_struct comedi_vm_ops = {
1449
- .close = comedi_unmap ,
1463
+ .open = comedi_vm_open ,
1464
+ .close = comedi_vm_close ,
1450
1465
};
1451
1466
1452
1467
static int comedi_mmap (struct file * file , struct vm_area_struct * vma )
1453
1468
{
1454
1469
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
1470
struct comedi_async * async = NULL ;
1459
1471
unsigned long start = vma -> vm_start ;
1460
1472
unsigned long size ;
1461
1473
int n_pages ;
1462
1474
int i ;
1463
1475
int retval ;
1464
1476
struct comedi_subdevice * s ;
1477
+ struct comedi_device_file_info * dev_file_info ;
1478
+ struct comedi_device * dev ;
1479
+
1480
+ dev_file_info = comedi_get_device_file_info (minor );
1481
+ if (dev_file_info == NULL )
1482
+ return - ENODEV ;
1483
+ dev = dev_file_info -> device ;
1484
+ if (dev == NULL )
1485
+ return - ENODEV ;
1465
1486
1466
1487
mutex_lock (& dev -> mutex );
1467
1488
if (!dev -> attached ) {
@@ -1528,11 +1549,17 @@ static unsigned int comedi_poll(struct file *file, poll_table * wait)
1528
1549
{
1529
1550
unsigned int mask = 0 ;
1530
1551
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
1552
struct comedi_subdevice * read_subdev ;
1535
1553
struct comedi_subdevice * write_subdev ;
1554
+ struct comedi_device_file_info * dev_file_info ;
1555
+ struct comedi_device * dev ;
1556
+ dev_file_info = comedi_get_device_file_info (minor );
1557
+
1558
+ if (dev_file_info == NULL )
1559
+ return - ENODEV ;
1560
+ dev = dev_file_info -> device ;
1561
+ if (dev == NULL )
1562
+ return - ENODEV ;
1536
1563
1537
1564
mutex_lock (& dev -> mutex );
1538
1565
if (!dev -> attached ) {
@@ -1578,9 +1605,15 @@ static ssize_t comedi_write(struct file *file, const char __user *buf,
1578
1605
int n , m , count = 0 , retval = 0 ;
1579
1606
DECLARE_WAITQUEUE (wait , current );
1580
1607
const unsigned minor = iminor (file -> f_dentry -> d_inode );
1581
- struct comedi_device_file_info * dev_file_info =
1582
- comedi_get_device_file_info (minor );
1583
- struct comedi_device * dev = dev_file_info -> device ;
1608
+ struct comedi_device_file_info * dev_file_info ;
1609
+ struct comedi_device * dev ;
1610
+ dev_file_info = comedi_get_device_file_info (minor );
1611
+
1612
+ if (dev_file_info == NULL )
1613
+ return - ENODEV ;
1614
+ dev = dev_file_info -> device ;
1615
+ if (dev == NULL )
1616
+ return - ENODEV ;
1584
1617
1585
1618
if (!dev -> attached ) {
1586
1619
DPRINTK ("no driver configured on comedi%i\n" , dev -> minor );
@@ -1640,11 +1673,11 @@ static ssize_t comedi_write(struct file *file, const char __user *buf,
1640
1673
retval = - EAGAIN ;
1641
1674
break ;
1642
1675
}
1676
+ schedule ();
1643
1677
if (signal_pending (current )) {
1644
1678
retval = - ERESTARTSYS ;
1645
1679
break ;
1646
1680
}
1647
- schedule ();
1648
1681
if (!s -> busy )
1649
1682
break ;
1650
1683
if (s -> busy != file ) {
@@ -1683,9 +1716,15 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes,
1683
1716
int n , m , count = 0 , retval = 0 ;
1684
1717
DECLARE_WAITQUEUE (wait , current );
1685
1718
const unsigned minor = iminor (file -> f_dentry -> d_inode );
1686
- struct comedi_device_file_info * dev_file_info =
1687
- comedi_get_device_file_info (minor );
1688
- struct comedi_device * dev = dev_file_info -> device ;
1719
+ struct comedi_device_file_info * dev_file_info ;
1720
+ struct comedi_device * dev ;
1721
+ dev_file_info = comedi_get_device_file_info (minor );
1722
+
1723
+ if (dev_file_info == NULL )
1724
+ return - ENODEV ;
1725
+ dev = dev_file_info -> device ;
1726
+ if (dev == NULL )
1727
+ return - ENODEV ;
1689
1728
1690
1729
if (!dev -> attached ) {
1691
1730
DPRINTK ("no driver configured on comedi%i\n" , dev -> minor );
@@ -1741,11 +1780,11 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes,
1741
1780
retval = - EAGAIN ;
1742
1781
break ;
1743
1782
}
1783
+ schedule ();
1744
1784
if (signal_pending (current )) {
1745
1785
retval = - ERESTARTSYS ;
1746
1786
break ;
1747
1787
}
1748
- schedule ();
1749
1788
if (!s -> busy ) {
1750
1789
retval = 0 ;
1751
1790
break ;
@@ -1885,11 +1924,17 @@ static int comedi_open(struct inode *inode, struct file *file)
1885
1924
static int comedi_close (struct inode * inode , struct file * file )
1886
1925
{
1887
1926
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
1927
struct comedi_subdevice * s = NULL ;
1892
1928
int i ;
1929
+ struct comedi_device_file_info * dev_file_info ;
1930
+ struct comedi_device * dev ;
1931
+ dev_file_info = comedi_get_device_file_info (minor );
1932
+
1933
+ if (dev_file_info == NULL )
1934
+ return - ENODEV ;
1935
+ dev = dev_file_info -> device ;
1936
+ if (dev == NULL )
1937
+ return - ENODEV ;
1893
1938
1894
1939
mutex_lock (& dev -> mutex );
1895
1940
@@ -1923,10 +1968,15 @@ static int comedi_close(struct inode *inode, struct file *file)
1923
1968
static int comedi_fasync (int fd , struct file * file , int on )
1924
1969
{
1925
1970
const unsigned minor = iminor (file -> f_dentry -> d_inode );
1926
- struct comedi_device_file_info * dev_file_info =
1927
- comedi_get_device_file_info (minor );
1971
+ struct comedi_device_file_info * dev_file_info ;
1972
+ struct comedi_device * dev ;
1973
+ dev_file_info = comedi_get_device_file_info (minor );
1928
1974
1929
- struct comedi_device * dev = dev_file_info -> device ;
1975
+ if (dev_file_info == NULL )
1976
+ return - ENODEV ;
1977
+ dev = dev_file_info -> device ;
1978
+ if (dev == NULL )
1979
+ return - ENODEV ;
1930
1980
1931
1981
return fasync_helper (fd , file , on , & dev -> async_queue );
1932
1982
}
0 commit comments