On 02-Dec-2002 Johannes Erdfelt wrote: > On Mon, Dec 02, 2002, Duncan Haldane <f.duncan.m.haldane@xxxxxxxxxxxxxxxx> > wrote: >> If you have a USB webcam please let me know what happens if you >> disconnect its usb cable while it is streaming images to a v4l viewer >> (mine hangs) > Sounds like a bug. I'll take the blame since I originally wrote the code >:) > >> The same thing happens when I yank the usb cable of a running ov511 >> cam, so its not just a cpia issue.... >> (I only have cpia and ov511 cams to test with). > > Could be because ov511 was based on the original cpia code so it has the > same bug? AARGH!!! Yes!! After much wailing and gnashing of teeth I found why cpia and ov511 drivers hang when the usb cable is yanked out while the camera is open.... In both cases, in this special case, the unregister_video_device() call is postponed to be the penultimate act of the [cpia,ov51x_v4l1]_close() call.... BUT.... cpia_close is itself called by videodev.c:video_release() when the v4l app is closed..., as follows: down(videodev_lock); vfl->close(vfl); up(videodev_lock); unfortunately, vfl->close is a pointer to cpia_close(), which if it calls unregister_video_device(), hangs because that also starts out with a down(videodev_lock); ...... Moral: You can't postpone unregistering the video device until the *_close() call. Hmmm. That was painful to find! I hope no other v4l drivers do this... I'm fixing the cpia driver using the "postponed kfree" disconnect method used by the pwc driver, that allows an earlier unregister call. Duncan