V4L/DVB (9691): gspca: Move the video device to a separate area.

The video device was part of the gspca device. On device disconnection
while streaming, the device structure is freed at close time.
In this case, the remaining close job on the video device run out of
allocated memory.

Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by Jean-Francois Moine and committed by Mauro Carvalho Chehab e07a1d8a 5c4fa002

+14 -16
+13 -15
drivers/media/video/gspca/gspca.c
··· 862 int ret; 863 864 PDEBUG(D_STREAM, "%s open", current->comm); 865 - gspca_dev = (struct gspca_dev *) video_devdata(file); 866 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) 867 return -ERESTARTSYS; 868 if (!gspca_dev->present) { ··· 890 #ifdef GSPCA_DEBUG 891 /* activate the v4l2 debug */ 892 if (gspca_debug & D_V4L2) 893 - gspca_dev->vdev.debug |= V4L2_DEBUG_IOCTL 894 | V4L2_DEBUG_IOCTL_ARG; 895 else 896 - gspca_dev->vdev.debug &= ~(V4L2_DEBUG_IOCTL 897 | V4L2_DEBUG_IOCTL_ARG); 898 #endif 899 ret = 0; ··· 1755 return ret; 1756 } 1757 1758 - static void dev_release(struct video_device *vfd) 1759 - { 1760 - /* nothing */ 1761 - } 1762 - 1763 static struct file_operations dev_fops = { 1764 .owner = THIS_MODULE, 1765 .open = dev_open, ··· 1802 .name = "gspca main driver", 1803 .fops = &dev_fops, 1804 .ioctl_ops = &dev_ioctl_ops, 1805 - .release = dev_release, /* mandatory */ 1806 .minor = -1, 1807 }; 1808 ··· 1871 init_waitqueue_head(&gspca_dev->wq); 1872 1873 /* init video stuff */ 1874 - memcpy(&gspca_dev->vdev, &gspca_template, sizeof gspca_template); 1875 - gspca_dev->vdev.parent = &dev->dev; 1876 - gspca_dev->vdev.fops = &dev_fops; 1877 gspca_dev->module = module; 1878 gspca_dev->present = 1; 1879 - ret = video_register_device(&gspca_dev->vdev, 1880 VFL_TYPE_GRABBER, 1881 video_nr); 1882 if (ret < 0) { 1883 err("video_register_device err %d", ret); 1884 goto out; 1885 } 1886 ··· 1890 PDEBUG(D_PROBE, "probe ok"); 1891 return 0; 1892 out: 1893 - kref_put(&gspca_dev->kref, gspca_delete); 1894 return ret; 1895 } 1896 EXPORT_SYMBOL(gspca_dev_probe); ··· 1909 usb_set_intfdata(intf, NULL); 1910 1911 /* We don't want people trying to open up the device */ 1912 - video_unregister_device(&gspca_dev->vdev); 1913 1914 gspca_dev->present = 0; 1915 gspca_dev->streaming = 0;
··· 862 int ret; 863 864 PDEBUG(D_STREAM, "%s open", current->comm); 865 + gspca_dev = video_drvdata(file); 866 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) 867 return -ERESTARTSYS; 868 if (!gspca_dev->present) { ··· 890 #ifdef GSPCA_DEBUG 891 /* activate the v4l2 debug */ 892 if (gspca_debug & D_V4L2) 893 + gspca_dev->vdev->debug |= V4L2_DEBUG_IOCTL 894 | V4L2_DEBUG_IOCTL_ARG; 895 else 896 + gspca_dev->vdev->debug &= ~(V4L2_DEBUG_IOCTL 897 | V4L2_DEBUG_IOCTL_ARG); 898 #endif 899 ret = 0; ··· 1755 return ret; 1756 } 1757 1758 static struct file_operations dev_fops = { 1759 .owner = THIS_MODULE, 1760 .open = dev_open, ··· 1807 .name = "gspca main driver", 1808 .fops = &dev_fops, 1809 .ioctl_ops = &dev_ioctl_ops, 1810 + .release = video_device_release, 1811 .minor = -1, 1812 }; 1813 ··· 1876 init_waitqueue_head(&gspca_dev->wq); 1877 1878 /* init video stuff */ 1879 + gspca_dev->vdev = video_device_alloc(); 1880 + memcpy(gspca_dev->vdev, &gspca_template, sizeof gspca_template); 1881 + gspca_dev->vdev->parent = &dev->dev; 1882 gspca_dev->module = module; 1883 gspca_dev->present = 1; 1884 + video_set_drvdata(gspca_dev->vdev, gspca_dev); 1885 + ret = video_register_device(gspca_dev->vdev, 1886 VFL_TYPE_GRABBER, 1887 video_nr); 1888 if (ret < 0) { 1889 err("video_register_device err %d", ret); 1890 + video_device_release(gspca_dev->vdev); 1891 goto out; 1892 } 1893 ··· 1893 PDEBUG(D_PROBE, "probe ok"); 1894 return 0; 1895 out: 1896 + kfree(gspca_dev->usb_buf); 1897 + kfree(gspca_dev); 1898 return ret; 1899 } 1900 EXPORT_SYMBOL(gspca_dev_probe); ··· 1911 usb_set_intfdata(intf, NULL); 1912 1913 /* We don't want people trying to open up the device */ 1914 + video_unregister_device(gspca_dev->vdev); 1915 1916 gspca_dev->present = 0; 1917 gspca_dev->streaming = 0;
+1 -1
drivers/media/video/gspca/gspca.h
··· 120 }; 121 122 struct gspca_dev { 123 - struct video_device vdev; /* !! must be the first item */ 124 struct module *module; /* subdriver handling the device */ 125 struct usb_device *dev; 126 struct kref kref;
··· 120 }; 121 122 struct gspca_dev { 123 + struct video_device *vdev; 124 struct module *module; /* subdriver handling the device */ 125 struct usb_device *dev; 126 struct kref kref;