Input: make sure input interfaces pin parent input devices

Recent driver core change causes references to parent devices being
dropped early, at device_del() time, as opposed to when all children
are freed. This causes oops in evdev with grabbed devices. Take the
reference to the parent input device ourselves to ensure that it
stays around long enough.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

+9 -8
+2 -4
drivers/input/evdev.c
··· 124 124 { 125 125 struct evdev *evdev = container_of(dev, struct evdev, dev); 126 126 127 + input_put_device(evdev->handle.dev); 127 128 kfree(evdev); 128 129 } 129 130 ··· 854 853 evdev_hangup(evdev); 855 854 evdev_remove_chrdev(evdev); 856 855 857 - if (evdev->grab) 858 - evdev_ungrab(evdev, evdev->grab); 859 - 860 856 /* evdev is marked dead so no one else accesses evdev->open */ 861 857 if (evdev->open) { 862 858 input_flush_device(handle, NULL); ··· 894 896 evdev->exist = 1; 895 897 evdev->minor = minor; 896 898 897 - evdev->handle.dev = dev; 899 + evdev->handle.dev = input_get_device(dev); 898 900 evdev->handle.name = evdev->name; 899 901 evdev->handle.handler = handler; 900 902 evdev->handle.private = evdev;
+2 -1
drivers/input/joydev.c
··· 171 171 { 172 172 struct joydev *joydev = container_of(dev, struct joydev, dev); 173 173 174 + input_put_device(joydev->handle.dev); 174 175 kfree(joydev); 175 176 } 176 177 ··· 751 750 joydev->minor = minor; 752 751 753 752 joydev->exist = 1; 754 - joydev->handle.dev = dev; 753 + joydev->handle.dev = input_get_device(dev); 755 754 joydev->handle.name = joydev->name; 756 755 joydev->handle.handler = handler; 757 756 joydev->handle.private = joydev;
+2 -1
drivers/input/mousedev.c
··· 414 414 { 415 415 struct mousedev *mousedev = container_of(dev, struct mousedev, dev); 416 416 417 + input_put_device(mousedev->handle.dev); 417 418 kfree(mousedev); 418 419 } 419 420 ··· 866 865 867 866 mousedev->minor = minor; 868 867 mousedev->exist = 1; 869 - mousedev->handle.dev = dev; 868 + mousedev->handle.dev = input_get_device(dev); 870 869 mousedev->handle.name = mousedev->name; 871 870 mousedev->handle.handler = handler; 872 871 mousedev->handle.private = mousedev;
+3 -2
include/linux/input.h
··· 1227 1227 1228 1228 static inline struct input_dev *input_get_device(struct input_dev *dev) 1229 1229 { 1230 - return to_input_dev(get_device(&dev->dev)); 1230 + return dev ? to_input_dev(get_device(&dev->dev)) : NULL; 1231 1231 } 1232 1232 1233 1233 static inline void input_put_device(struct input_dev *dev) 1234 1234 { 1235 - put_device(&dev->dev); 1235 + if (dev) 1236 + put_device(&dev->dev); 1236 1237 } 1237 1238 1238 1239 static inline void *input_get_drvdata(struct input_dev *dev)