made bufconfig ioctl always write back buffer sizes even if they were not changed
authorFrank Mori Hess <fmhess@speakeasy.net>
Thu, 8 Feb 2001 02:00:36 +0000 (02:00 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Thu, 8 Feb 2001 02:00:36 +0000 (02:00 +0000)
comedi/comedi_fops.c

index f7ca89f8631d81dd37ce2ecde08a11fe94473c7a..082d3ba70ce33d7cd97ba4d3e79f6060ffafa13d 100644 (file)
@@ -171,15 +171,18 @@ static int do_bufconfig_ioctl(comedi_device *dev,void *arg)
        if(copy_from_user(&bc,arg,sizeof(comedi_bufconfig)))
                return -EFAULT;
 
+       if(dev->read_subdev >= 0)
+               rsd = &dev->subdevices[dev->read_subdev];
+       if(dev->write_subdev >= 0)
+               wsd = &dev->subdevices[dev->write_subdev];
+
        if(bc.read_size){
-               if(dev->read_subdev < 0)
+               if(rsd == NULL)
                {
                        DPRINTK("device has no read subdevice, buffer resize failed\n");
                        return -ENODEV;
                }
 
-               rsd = &dev->subdevices[dev->read_subdev];
-
                if(rsd->busy)
                        return -EBUSY;
 
@@ -192,14 +195,12 @@ static int do_bufconfig_ioctl(comedi_device *dev,void *arg)
                        return -EINVAL;
        }
        if(bc.write_size){
-               if(dev->write_subdev < 0)
+               if(wsd == NULL)
                {
                        DPRINTK("device has no write subdevice, buffer resize failed\n");
                        return -ENODEV;
                }
 
-               wsd = &dev->subdevices[dev->write_subdev];
-
                if(wsd->busy)
                        return -EBUSY;
 
@@ -219,8 +220,7 @@ static int do_bufconfig_ioctl(comedi_device *dev,void *arg)
                if(ret < 0)
                        return ret;
 
-               bc.read_size = rsd->prealloc_bufsz;
-               DPRINTK("comedi%i read buffer resized to %i bytes\n", dev->minor, bc.read_size);
+               DPRINTK("comedi%i read buffer resized to %i bytes\n", dev->minor, rsd->prealloc_bufsz);
        }
        if(bc.write_size){
                ret = resize_buf(dev,wsd,bc.write_size);
@@ -228,10 +228,17 @@ static int do_bufconfig_ioctl(comedi_device *dev,void *arg)
                if(ret < 0)
                        return ret;
 
-               bc.write_size = wsd->prealloc_bufsz;
-               DPRINTK("comedi%i write buffer resized to %i bytes\n", dev->minor, bc.write_size);
+               DPRINTK("comedi%i write buffer resized to %i bytes\n", dev->minor, wsd->prealloc_bufsz);
        }
 
+       // write back buffer sizes
+       if(rsd){
+               bc.read_size = rsd->prealloc_bufsz;
+       } else bc.read_size = 0;
+       if(wsd){
+               bc.write_size = wsd->prealloc_bufsz;
+       } else bc.write_size = 0;
+
        if(copy_to_user(arg,&bc,sizeof(comedi_bufconfig)))
                return -EFAULT;