diff options
-rw-r--r-- | drivers/staging/comedi/comedi_fops.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c index 7cb1d06..d1cf6a1 100644 --- a/drivers/staging/comedi/comedi_fops.c +++ b/drivers/staging/comedi/comedi_fops.c @@ -1121,6 +1121,7 @@ static int do_bufinfo_ioctl(struct comedi_device *dev, if (!async || s->busy != file) return -EINVAL; + runflags = comedi_get_subdevice_runflags(s); if (!(async->cmd.flags & CMDF_WRITE)) { /* command was set up in "read" direction */ if (bi.bytes_read) { @@ -1132,7 +1133,6 @@ static int do_bufinfo_ioctl(struct comedi_device *dev, * {"read" position not updated or command stopped normally}, * then become non-busy. */ - runflags = comedi_get_subdevice_runflags(s); if (comedi_buf_read_n_available(s) == 0 && !comedi_is_runflags_running(runflags) && (bi.bytes_read == 0 || @@ -1144,9 +1144,12 @@ static int do_bufinfo_ioctl(struct comedi_device *dev, bi.bytes_written = 0; } else { /* command was set up in "write" direction */ - if (!comedi_is_subdevice_running(s)) + if (!comedi_is_runflags_running(runflags)) { bi.bytes_written = 0; - if (bi.bytes_written) { + become_nonbusy = true; + if (comedi_is_runflags_in_error(runflags)) + retval = -EPIPE; + } else if (bi.bytes_written) { comedi_buf_write_alloc(s, bi.bytes_written); bi.bytes_written = comedi_buf_write_free(s, bi.bytes_written); |