From e1af498063007cee5d7ec5af1e0cf25c088d05c7 Mon Sep 17 00:00:00 2001
From: Chris Rankin <rankincj@yahoo.com>
Date: Tue, 6 Feb 2007 20:29:07 -0300
Subject: [PATCH] V4L/DVB (5178): Avoid race when deregistering the IR control
 for dvb-usb

The work item function is dvb_usb_read_remote_control():
        INIT_WORK(&d->rc_query_work, dvb_usb_read_remote_control, d);
and the last piece of work it does is:
        schedule_delayed_work(&d->rc_query_work,msecs_to_jiffies(d->props.rc_interval));
Hence you need to call "cancel_rearming_delayed_work()" and not
"cancel_delayed_work()", correct?  I certainly haven't seen this oops
reoccur since I applied this patch.

Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
---
 drivers/media/dvb/dvb-usb/dvb-usb-remote.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
index 19ff5978bc914..9511a31c8f506 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
@@ -151,7 +151,7 @@ int dvb_usb_remote_init(struct dvb_usb_device *d)
 int dvb_usb_remote_exit(struct dvb_usb_device *d)
 {
 	if (d->state & DVB_USB_STATE_REMOTE) {
-		cancel_delayed_work(&d->rc_query_work);
+		cancel_rearming_delayed_work(&d->rc_query_work);
 		flush_scheduled_work();
 		input_unregister_device(d->rc_input_dev);
 	}
-- 
GitLab