From: Dmitry Torokhov Date: Wed, 6 Jan 2010 01:56:02 +0000 (-0800) Subject: Input: atkbd - fix canceling event_work in disconnect X-Git-Tag: v2.6.33-rc6~2^2~14 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0ef7a26af1278f7ec0b718148e88f01ba1953835;p=platform%2Fkernel%2Flinux-3.10.git Input: atkbd - fix canceling event_work in disconnect We need to first unregister input device and only then cancel event work since events can arrive (and cause event work to get scheduled again) until input_unregister_device() returns. Signed-off-by: Dmitry Torokhov --- diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 1cf32a7..7b40562 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c @@ -855,10 +855,16 @@ static void atkbd_disconnect(struct serio *serio) atkbd_disable(atkbd); - /* make sure we don't have a command in flight */ + input_unregister_device(atkbd->dev); + + /* + * Make sure we don't have a command in flight. + * Note that since atkbd->enabled is false event work will keep + * rescheduling itself until it gets canceled and will not try + * accessing freed input device or serio port. + */ cancel_delayed_work_sync(&atkbd->event_work); - input_unregister_device(atkbd->dev); serio_close(serio); serio_set_drvdata(serio, NULL); kfree(atkbd);