diff options
author | Simon Arlott <simon@fire.lp0.eu> | 2007-03-10 04:21:25 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-03-27 07:45:54 -0400 |
commit | c278850206fd9df0bb62a72ca0b277fe20c5a452 (patch) | |
tree | 439ae68737b5bcb5d473b3d12c3d5417f697ccb3 /drivers/media/dvb/dvb-core/dvbdev.c | |
parent | b10fece583fdfdb3d2f29b0da3896ec58b8fe122 (diff) |
V4L/DVB (5400): Core: fix several locking related problems
Fix several instances of dvb-core functions using mutex_lock_interruptible
and returning -ERESTARTSYS where the calling function will either never
retry or never check the return value.
These cause a race condition with dvb_dmxdev_filter_free and
dvb_dvr_release, both of which are filesystem release functions whose
return value is ignored and will never be retried. When this happens it
becomes impossible to open dvr0 again (-EBUSY) since it has not been
released properly.
Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Acked-By: Johannes Stezenbach <js@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/dvb/dvb-core/dvbdev.c')
-rw-r--r-- | drivers/media/dvb/dvb-core/dvbdev.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c index 490337b5ee3e..14a372a0fe8b 100644 --- a/drivers/media/dvb/dvb-core/dvbdev.c +++ b/drivers/media/dvb/dvb-core/dvbdev.c | |||
@@ -203,8 +203,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, | |||
203 | 203 | ||
204 | int id; | 204 | int id; |
205 | 205 | ||
206 | if (mutex_lock_interruptible(&dvbdev_register_lock)) | 206 | mutex_lock(&dvbdev_register_lock); |
207 | return -ERESTARTSYS; | ||
208 | 207 | ||
209 | if ((id = dvbdev_get_free_id (adap, type)) < 0){ | 208 | if ((id = dvbdev_get_free_id (adap, type)) < 0){ |
210 | mutex_unlock(&dvbdev_register_lock); | 209 | mutex_unlock(&dvbdev_register_lock); |
@@ -294,8 +293,7 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu | |||
294 | { | 293 | { |
295 | int num; | 294 | int num; |
296 | 295 | ||
297 | if (mutex_lock_interruptible(&dvbdev_register_lock)) | 296 | mutex_lock(&dvbdev_register_lock); |
298 | return -ERESTARTSYS; | ||
299 | 297 | ||
300 | if ((num = dvbdev_get_free_adapter_num ()) < 0) { | 298 | if ((num = dvbdev_get_free_adapter_num ()) < 0) { |
301 | mutex_unlock(&dvbdev_register_lock); | 299 | mutex_unlock(&dvbdev_register_lock); |
@@ -323,8 +321,7 @@ EXPORT_SYMBOL(dvb_register_adapter); | |||
323 | 321 | ||
324 | int dvb_unregister_adapter(struct dvb_adapter *adap) | 322 | int dvb_unregister_adapter(struct dvb_adapter *adap) |
325 | { | 323 | { |
326 | if (mutex_lock_interruptible(&dvbdev_register_lock)) | 324 | mutex_lock(&dvbdev_register_lock); |
327 | return -ERESTARTSYS; | ||
328 | list_del (&adap->list_head); | 325 | list_del (&adap->list_head); |
329 | mutex_unlock(&dvbdev_register_lock); | 326 | mutex_unlock(&dvbdev_register_lock); |
330 | return 0; | 327 | return 0; |