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: firefly_0821_release~9833^2~2172^2~65 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=0ef7a26af1278f7ec0b718148e88f01ba1953835;p=firefly-linux-kernel-4.4.55.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 1cf32a7814d0..7b4056292eaf 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);