linux/drivers/staging/comedi
Ian Abbott fd060c8f4c staging: comedi: do extra checks for becoming non-busy for "read"
`comedi_read()` is the handler for the "read" file operation for COMEDI
devices.  It mostly runs without using the main mutex of the COMEDI
device, but uses the `attach_lock` rwsemaphore to protect against the
COMEDI device becoming "detached".  A file object can read data
resulting from a COMEDI asynchonous command if it initiated the command.
The COMEDI subdevice is marked as busy when the command is started.  At
some point, the "read" handler detects that the command has terminated
and all available data has been read and so marks the subdevice as
non-busy.

In order to mark the subdevice as non-busy, the "read" handler needs to
release the `attach_lock` rwsemaphore and `acquire the main `mutex`.
There is a vulnerable point between the two, so it checks that the
device is still attached after acquiring the mutex.  However, it does
not currently check that the conditions for becoming non-busy still
hold.  Add some more checks that the subdevice is still busy with a
command initiated by the same file object, that command is in the correct
direction (in case the subdevice supports both "read" and "write"), that
command has terminated, and has no data available to be read.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-10-13 10:29:48 -07:00
..
drivers staging: comedi: cb_das16_cs: rename private data member 'status[12]' 2015-10-13 10:26:19 -07:00
kcomedilib staging: comedi: kcomedilib: Fixed coding style issue 2015-09-12 18:24:38 -07:00
comedi_buf.c staging: comedi: add new comedi_buf_write_n_available() 2015-10-13 10:28:40 -07:00
comedi_compat32.c staging: comedi: fix cast warning in comedi_compat32.c 2015-07-14 18:21:15 -07:00
comedi_compat32.h staging: comedi: comedi_compat32.h: reformat copyright comment 2015-01-28 11:19:34 -08:00
comedi_fops.c staging: comedi: do extra checks for becoming non-busy for "read" 2015-10-13 10:29:48 -07:00
comedi_internal.h staging: comedi: add new comedi_buf_write_n_available() 2015-10-13 10:28:40 -07:00
comedi_pci.c staging: comedi: comedi_pci.c: Fix kernel-doc Return tags 2015-10-02 11:43:21 +02:00
comedi_pci.h staging: comedi: comedi_pci.h: move PCI stuff out of comedidev.h 2015-03-20 14:08:18 +01:00
comedi_pcmcia.c staging: comedi: comedi_pcmcia.c: improve function documentation 2015-10-02 11:43:21 +02:00
comedi_pcmcia.h staging: comedi: comedi_pcmcia.h: move PCMCIA stuff out of comedidev.h 2015-02-07 17:05:51 +08:00
comedi_usb.c staging: comedi: comedi_usb.c: improve function documentation 2015-10-02 11:43:21 +02:00
comedi_usb.h staging: comedi: comedi_usb.h: move USB stuff out of comedidev.h 2015-01-28 11:18:51 -08:00
comedi.h Drivers: staging: comedi: comedi: Fixed comment spelling error 2015-05-24 13:11:44 -07:00
comedidev.h staging: comedi: comedidev.h: document remaining inline functions 2015-09-29 03:25:04 +02:00
comedilib.h
drivers.c staging: comedi: drivers.c: document exported functions 2015-09-29 03:20:07 +02:00
Kconfig staging: comedi: aio_aio12_8: hookup 8254 counter/timer 2015-10-13 10:26:06 -07:00
Makefile staging: comedi: split out PCI support into new module 2014-11-07 09:24:33 -08:00
proc.c
range.c staging: comedi: improve comedi_check_chanlist() documentation 2015-08-05 11:55:44 -07:00
TODO