From: Hans Verkuil Date: Fri, 18 Jul 2008 13:07:10 +0000 (-0300) Subject: V4L/DVB (8414): videodev/cx18: fix get_index bug and error-handling lock-ups X-Git-Tag: v2.6.27-rc1~966^2~1 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=fac3639d886ae577d74e2da16e6a448620d432c9;p=linux-2.6-omap-h63xx.git V4L/DVB (8414): videodev/cx18: fix get_index bug and error-handling lock-ups Fix a bug in get_index that was introduced earlier. Also fix two error handling lock-ups in videodev and cx18 that where found thanks to that bug. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab --- diff --git a/drivers/media/video/cx18/cx18-streams.c b/drivers/media/video/cx18/cx18-streams.c index f3d20509a8b..1728b1d832a 100644 --- a/drivers/media/video/cx18/cx18-streams.c +++ b/drivers/media/video/cx18/cx18-streams.c @@ -311,8 +311,10 @@ void cx18_streams_cleanup(struct cx18 *cx, int unregister) /* Teardown all streams */ for (type = 0; type < CX18_MAX_STREAMS; type++) { - if (cx->streams[type].dvb.enabled) + if (cx->streams[type].dvb.enabled) { cx18_dvb_unregister(&cx->streams[type]); + cx->streams[type].dvb.enabled = false; + } vdev = cx->streams[type].v4l2dev; diff --git a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c index aca36dec674..6616e657055 100644 --- a/drivers/media/video/videodev.c +++ b/drivers/media/video/videodev.c @@ -2023,7 +2023,7 @@ EXPORT_SYMBOL(video_ioctl2); static int get_index(struct video_device *vdev, int num) { u32 used = 0; - const unsigned max_index = sizeof(used) * 8 - 1; + const int max_index = sizeof(used) * 8 - 1; int i; /* Currently a single v4l driver instance cannot create more than @@ -2145,14 +2145,15 @@ int video_register_device_index(struct video_device *vfd, int type, int nr, vfd->minor=i; ret = get_index(vfd, index); + vfd->index = ret; + + mutex_unlock(&videodev_lock); + if (ret < 0) { printk(KERN_ERR "%s: get_index failed\n", __func__); goto fail_minor; } - vfd->index = ret; - - mutex_unlock(&videodev_lock); mutex_init(&vfd->lock); /* sysfs class */