Merge branch 'staging-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
* 'staging-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: Staging: comedi: fix integer overflow in do_insnlist_ioctl() Revert "Staging: comedi: integer overflow in do_insnlist_ioctl()" Staging: comedi: integer overflow in do_insnlist_ioctl() Staging: comedi: fix signal handling in read and write Staging: comedi: fix mmap_count staging: comedi: fix oops for USB DAQ devices. staging: comedi: usbduxsigma: Fixed wrong range for the analogue channel. staging:rts_pstor:Complete scanning_done variable staging: usbip: bugfix for deadlock
This commit is contained in:
Коммит
f9143eae10
|
@ -671,7 +671,7 @@ static int do_insnlist_ioctl(struct comedi_device *dev,
|
|||
}
|
||||
|
||||
insns =
|
||||
kmalloc(sizeof(struct comedi_insn) * insnlist.n_insns, GFP_KERNEL);
|
||||
kcalloc(insnlist.n_insns, sizeof(struct comedi_insn), GFP_KERNEL);
|
||||
if (!insns) {
|
||||
DPRINTK("kmalloc failed\n");
|
||||
ret = -ENOMEM;
|
||||
|
@ -1432,7 +1432,21 @@ static int do_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void comedi_unmap(struct vm_area_struct *area)
|
||||
|
||||
static void comedi_vm_open(struct vm_area_struct *area)
|
||||
{
|
||||
struct comedi_async *async;
|
||||
struct comedi_device *dev;
|
||||
|
||||
async = area->vm_private_data;
|
||||
dev = async->subdevice->device;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
async->mmap_count++;
|
||||
mutex_unlock(&dev->mutex);
|
||||
}
|
||||
|
||||
static void comedi_vm_close(struct vm_area_struct *area)
|
||||
{
|
||||
struct comedi_async *async;
|
||||
struct comedi_device *dev;
|
||||
|
@ -1446,15 +1460,13 @@ static void comedi_unmap(struct vm_area_struct *area)
|
|||
}
|
||||
|
||||
static struct vm_operations_struct comedi_vm_ops = {
|
||||
.close = comedi_unmap,
|
||||
.open = comedi_vm_open,
|
||||
.close = comedi_vm_close,
|
||||
};
|
||||
|
||||
static int comedi_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
const unsigned minor = iminor(file->f_dentry->d_inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
struct comedi_async *async = NULL;
|
||||
unsigned long start = vma->vm_start;
|
||||
unsigned long size;
|
||||
|
@ -1462,6 +1474,15 @@ static int comedi_mmap(struct file *file, struct vm_area_struct *vma)
|
|||
int i;
|
||||
int retval;
|
||||
struct comedi_subdevice *s;
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
if (!dev->attached) {
|
||||
|
@ -1528,11 +1549,17 @@ static unsigned int comedi_poll(struct file *file, poll_table * wait)
|
|||
{
|
||||
unsigned int mask = 0;
|
||||
const unsigned minor = iminor(file->f_dentry->d_inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
struct comedi_subdevice *read_subdev;
|
||||
struct comedi_subdevice *write_subdev;
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
if (!dev->attached) {
|
||||
|
@ -1578,9 +1605,15 @@ static ssize_t comedi_write(struct file *file, const char __user *buf,
|
|||
int n, m, count = 0, retval = 0;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
const unsigned minor = iminor(file->f_dentry->d_inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
if (!dev->attached) {
|
||||
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,
|
|||
retval = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
schedule();
|
||||
if (signal_pending(current)) {
|
||||
retval = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
schedule();
|
||||
if (!s->busy)
|
||||
break;
|
||||
if (s->busy != file) {
|
||||
|
@ -1683,9 +1716,15 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes,
|
|||
int n, m, count = 0, retval = 0;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
const unsigned minor = iminor(file->f_dentry->d_inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
if (!dev->attached) {
|
||||
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,
|
|||
retval = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
schedule();
|
||||
if (signal_pending(current)) {
|
||||
retval = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
schedule();
|
||||
if (!s->busy) {
|
||||
retval = 0;
|
||||
break;
|
||||
|
@ -1885,11 +1924,17 @@ ok:
|
|||
static int comedi_close(struct inode *inode, struct file *file)
|
||||
{
|
||||
const unsigned minor = iminor(inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
struct comedi_subdevice *s = NULL;
|
||||
int i;
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
|
||||
|
@ -1923,10 +1968,15 @@ static int comedi_close(struct inode *inode, struct file *file)
|
|||
static int comedi_fasync(int fd, struct file *file, int on)
|
||||
{
|
||||
const unsigned minor = iminor(file->f_dentry->d_inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
return fasync_helper(fd, file, on, &dev->async_queue);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#define DRIVER_VERSION "v0.5"
|
||||
#define DRIVER_VERSION "v0.6"
|
||||
#define DRIVER_AUTHOR "Bernd Porr, BerndPorr@f2s.com"
|
||||
#define DRIVER_DESC "Stirling/ITL USB-DUX SIGMA -- Bernd.Porr@f2s.com"
|
||||
/*
|
||||
|
@ -25,7 +25,7 @@ Driver: usbduxsigma
|
|||
Description: University of Stirling USB DAQ & INCITE Technology Limited
|
||||
Devices: [ITL] USB-DUX (usbduxsigma.o)
|
||||
Author: Bernd Porr <BerndPorr@f2s.com>
|
||||
Updated: 21 Jul 2011
|
||||
Updated: 8 Nov 2011
|
||||
Status: testing
|
||||
*/
|
||||
/*
|
||||
|
@ -44,6 +44,7 @@ Status: testing
|
|||
* 0.3: proper vendor ID and driver name
|
||||
* 0.4: fixed D/A voltage range
|
||||
* 0.5: various bug fixes, health check at startup
|
||||
* 0.6: corrected wrong input range
|
||||
*/
|
||||
|
||||
/* generates loads of debug info */
|
||||
|
@ -175,7 +176,7 @@ Status: testing
|
|||
/* comedi constants */
|
||||
static const struct comedi_lrange range_usbdux_ai_range = { 1, {
|
||||
BIP_RANGE
|
||||
(2.65)
|
||||
(2.65/2.0)
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -1021,6 +1021,7 @@ static int __devinit rtsx_probe(struct pci_dev *pci,
|
|||
th = kthread_create(rtsx_scan_thread, dev, "rtsx-scan");
|
||||
if (IS_ERR(th)) {
|
||||
printk(KERN_ERR "Unable to start the device-scanning thread\n");
|
||||
complete(&dev->scanning_done);
|
||||
quiesce_and_remove_host(dev);
|
||||
err = PTR_ERR(th);
|
||||
goto errout;
|
||||
|
|
|
@ -68,6 +68,7 @@ static void vhci_recv_ret_submit(struct vhci_device *vdev,
|
|||
{
|
||||
struct usbip_device *ud = &vdev->ud;
|
||||
struct urb *urb;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock(&vdev->priv_lock);
|
||||
urb = pickup_urb_and_free_priv(vdev, pdu->base.seqnum);
|
||||
|
@ -101,9 +102,9 @@ static void vhci_recv_ret_submit(struct vhci_device *vdev,
|
|||
|
||||
usbip_dbg_vhci_rx("now giveback urb %p\n", urb);
|
||||
|
||||
spin_lock(&the_controller->lock);
|
||||
spin_lock_irqsave(&the_controller->lock, flags);
|
||||
usb_hcd_unlink_urb_from_ep(vhci_to_hcd(the_controller), urb);
|
||||
spin_unlock(&the_controller->lock);
|
||||
spin_unlock_irqrestore(&the_controller->lock, flags);
|
||||
|
||||
usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb, urb->status);
|
||||
|
||||
|
@ -141,6 +142,7 @@ static void vhci_recv_ret_unlink(struct vhci_device *vdev,
|
|||
{
|
||||
struct vhci_unlink *unlink;
|
||||
struct urb *urb;
|
||||
unsigned long flags;
|
||||
|
||||
usbip_dump_header(pdu);
|
||||
|
||||
|
@ -170,9 +172,9 @@ static void vhci_recv_ret_unlink(struct vhci_device *vdev,
|
|||
urb->status = pdu->u.ret_unlink.status;
|
||||
pr_info("urb->status %d\n", urb->status);
|
||||
|
||||
spin_lock(&the_controller->lock);
|
||||
spin_lock_irqsave(&the_controller->lock, flags);
|
||||
usb_hcd_unlink_urb_from_ep(vhci_to_hcd(the_controller), urb);
|
||||
spin_unlock(&the_controller->lock);
|
||||
spin_unlock_irqrestore(&the_controller->lock, flags);
|
||||
|
||||
usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb,
|
||||
urb->status);
|
||||
|
|
Загрузка…
Ссылка в новой задаче