linux/drivers/staging/comedi
Ian Abbott 9329f13956 staging: comedi: protect against detach during write operation
The 'write' file operation for comedi devices does not use the main
mutex in the `struct comedi_device` to avoid contention with some ioctls
that may take a while to complete.  Use the `attach_lock` semaphore to
protect against detachment while the 'write' operation is in progress.
This is a `struct rw_semaphore` and we read-lock it to protect against
device detachment.

Note that `comedi_device_cancel_all()` is called during device
detachment, which cancels any ongoing asynchronous commands.  This will
wake up any blocked writers which will then release the `attach_lock`
semaphore and complete the 'write' operation early.

The only time the 'write' file operation does use the main mutex is at
the end of the command when it has to call `do_become_nonbusy()` to mark
the subdevice as no longer busy handling an asynchronous command.  To
avoid deadlock, it has to remove the task from the wait queue and
release the `attach_lock` semaphore before acquiring the main mutex.  It
then needs to confirm that the device is still attached.  Unfortunately,
we do not yet protect against a dynamically allocated `struct
comedi_device` being deleted during the operation.  This will be
addressed by a later patch.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2013-11-11 16:16:44 -08:00
..
drivers staging: comedi: change bool assignment to true 2013-11-10 12:14:54 -08:00
kcomedilib staging: comedi: comedi_bond: handle base channel for insn_bits 2013-08-26 06:41:56 -07:00
comedi_buf.c staging: comedi: use unsigned samples for comedi_buf_put()/get() 2013-10-16 12:48:16 -07:00
comedi_compat32.c staging: comedi: remove FSF address from boilerplate text 2013-05-13 17:34:22 -04:00
comedi_compat32.h staging: comedi: remove FSF address from boilerplate text 2013-05-13 17:34:22 -04:00
comedi_fops.c staging: comedi: protect against detach during write operation 2013-11-11 16:16:44 -08:00
comedi_internal.h staging: comedi: cancel commands before detaching device 2013-11-11 16:16:44 -08:00
comedi_pci.c staging: comedi: remove FSF address from boilerplate text 2013-05-13 17:34:22 -04:00
comedi_pcmcia.c staging: comedi: remove FSF address from boilerplate text 2013-05-13 17:34:22 -04:00
comedi_usb.c staging: comedi: introduce comedi_to_usb_dev() 2013-05-21 10:59:10 -07:00
comedi.h staging: comedi: remove FSF address from boilerplate text 2013-05-13 17:34:22 -04:00
comedidev.h staging: comedi: add detachment counter for validity checks 2013-11-11 16:16:44 -08:00
comedilib.h staging: comedi: comedi_bond: handle base channel for insn_bits 2013-08-26 06:41:56 -07:00
drivers.c staging: comedi: add detachment counter for validity checks 2013-11-11 16:16:44 -08:00
Kconfig staging: comedi: ni_6527: remove COMEDI_MITE dependancy 2013-10-03 14:10:03 -07:00
Makefile staging: comedi: conditionally build in PCMCIA driver support 2013-01-31 10:38:10 +01:00
proc.c staging: comedi: use a mutex when accessing driver list 2013-07-23 14:22:29 -07:00
range.c staging: comedi: range: tidy up comedi_check_chanlist() 2013-07-25 13:20:17 -07:00
TODO MAINTAINERS: Update the list of maintainers for staging/comedi driver. 2013-07-24 09:51:18 -07:00