| From d0d18380d34b30837ca0ea0af903ad19632ae9cb Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 4 May 2021 19:08:58 +0200 |
| Subject: media: pvrusb2: fix warning in pvr2_i2c_core_done |
| |
| From: Anirudh Rayabharam <mail@anirudhrb.com> |
| |
| [ Upstream commit f8194e5e63fdcb349e8da9eef9e574d5b1d687cb ] |
| |
| syzbot has reported the following warning in pvr2_i2c_done: |
| |
| sysfs group 'power' not found for kobject '1-0043' |
| |
| When the device is disconnected (pvr_hdw_disconnect), the i2c adapter is |
| not unregistered along with the USB and v4l2 teardown. As part of the USB |
| device disconnect, the sysfs files of the subdevices are also deleted. |
| So, by the time pvr_i2c_core_done is called by pvr_context_destroy, the |
| sysfs files have been deleted. |
| |
| To fix this, unregister the i2c adapter too in pvr_hdw_disconnect. Make |
| the device deregistration code shared by calling pvr_hdw_disconnect from |
| pvr2_hdw_destroy. |
| |
| Reported-by: syzbot+e74a998ca8f1df9cc332@syzkaller.appspotmail.com |
| Tested-by: syzbot+e74a998ca8f1df9cc332@syzkaller.appspotmail.com |
| Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com> |
| Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/usb/pvrusb2/pvrusb2-hdw.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c |
| index f4a727918e35..d38dee1792e4 100644 |
| --- a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c |
| +++ b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c |
| @@ -2676,9 +2676,8 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw) |
| pvr2_stream_destroy(hdw->vid_stream); |
| hdw->vid_stream = NULL; |
| } |
| - pvr2_i2c_core_done(hdw); |
| v4l2_device_unregister(&hdw->v4l2_dev); |
| - pvr2_hdw_remove_usb_stuff(hdw); |
| + pvr2_hdw_disconnect(hdw); |
| mutex_lock(&pvr2_unit_mtx); |
| do { |
| if ((hdw->unit_number >= 0) && |
| @@ -2705,6 +2704,7 @@ void pvr2_hdw_disconnect(struct pvr2_hdw *hdw) |
| { |
| pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_disconnect(hdw=%p)",hdw); |
| LOCK_TAKE(hdw->big_lock); |
| + pvr2_i2c_core_done(hdw); |
| LOCK_TAKE(hdw->ctl_lock); |
| pvr2_hdw_remove_usb_stuff(hdw); |
| LOCK_GIVE(hdw->ctl_lock); |
| -- |
| 2.30.2 |
| |