diff options
| -rw-r--r-- | drivers/media/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/media/video/cx231xx/cx231xx-417.c | 6 | ||||
| -rw-r--r-- | drivers/media/video/cx23885/cx23885-417.c | 9 | ||||
| -rw-r--r-- | drivers/media/video/cx23885/cx23885-video.c | 5 | ||||
| -rw-r--r-- | drivers/media/video/se401.c | 7 | ||||
| -rw-r--r-- | drivers/media/video/stk-webcam.c | 4 | ||||
| -rw-r--r-- | drivers/media/video/tlg2300/pd-main.c | 13 | ||||
| -rw-r--r-- | drivers/media/video/usbvideo/vicam.c | 29 | ||||
| -rw-r--r-- | drivers/media/video/v4l2-dev.c | 7 | ||||
| -rw-r--r-- | drivers/media/video/zoran/zoran.h | 1 | ||||
| -rw-r--r-- | drivers/media/video/zoran/zoran_card.c | 1 | ||||
| -rw-r--r-- | drivers/media/video/zoran/zoran_driver.c | 27 |
12 files changed, 51 insertions, 59 deletions
diff --git a/drivers/media/Kconfig b/drivers/media/Kconfig index bad2cedb8d96..a28541b2b1a2 100644 --- a/drivers/media/Kconfig +++ b/drivers/media/Kconfig | |||
| @@ -19,7 +19,6 @@ comment "Multimedia core support" | |||
| 19 | 19 | ||
| 20 | config VIDEO_DEV | 20 | config VIDEO_DEV |
| 21 | tristate "Video For Linux" | 21 | tristate "Video For Linux" |
| 22 | depends on BKL # used in many drivers for ioctl handling, need to kill | ||
| 23 | ---help--- | 22 | ---help--- |
| 24 | V4L core support for video capture and overlay devices, webcams and | 23 | V4L core support for video capture and overlay devices, webcams and |
| 25 | AM/FM radio cards. | 24 | AM/FM radio cards. |
diff --git a/drivers/media/video/cx231xx/cx231xx-417.c b/drivers/media/video/cx231xx/cx231xx-417.c index aab21f3ce472..4c7cac3b6254 100644 --- a/drivers/media/video/cx231xx/cx231xx-417.c +++ b/drivers/media/video/cx231xx/cx231xx-417.c | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
| 32 | #include <linux/device.h> | 32 | #include <linux/device.h> |
| 33 | #include <linux/firmware.h> | 33 | #include <linux/firmware.h> |
| 34 | #include <linux/smp_lock.h> | ||
| 35 | #include <linux/vmalloc.h> | 34 | #include <linux/vmalloc.h> |
| 36 | #include <media/v4l2-common.h> | 35 | #include <media/v4l2-common.h> |
| 37 | #include <media/v4l2-ioctl.h> | 36 | #include <media/v4l2-ioctl.h> |
| @@ -1927,10 +1926,9 @@ static int mpeg_open(struct file *file) | |||
| 1927 | dev = h; | 1926 | dev = h; |
| 1928 | } | 1927 | } |
| 1929 | 1928 | ||
| 1930 | if (dev == NULL) { | 1929 | if (dev == NULL) |
| 1931 | unlock_kernel(); | ||
| 1932 | return -ENODEV; | 1930 | return -ENODEV; |
| 1933 | } | 1931 | |
| 1934 | mutex_lock(&dev->lock); | 1932 | mutex_lock(&dev->lock); |
| 1935 | 1933 | ||
| 1936 | /* allocate + initialize per filehandle data */ | 1934 | /* allocate + initialize per filehandle data */ |
diff --git a/drivers/media/video/cx23885/cx23885-417.c b/drivers/media/video/cx23885/cx23885-417.c index a6cc12f8736c..9a98dc55f657 100644 --- a/drivers/media/video/cx23885/cx23885-417.c +++ b/drivers/media/video/cx23885/cx23885-417.c | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
| 32 | #include <linux/device.h> | 32 | #include <linux/device.h> |
| 33 | #include <linux/firmware.h> | 33 | #include <linux/firmware.h> |
| 34 | #include <linux/smp_lock.h> | ||
| 35 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
| 36 | #include <media/v4l2-common.h> | 35 | #include <media/v4l2-common.h> |
| 37 | #include <media/v4l2-ioctl.h> | 36 | #include <media/v4l2-ioctl.h> |
| @@ -1576,12 +1575,8 @@ static int mpeg_open(struct file *file) | |||
| 1576 | 1575 | ||
| 1577 | /* allocate + initialize per filehandle data */ | 1576 | /* allocate + initialize per filehandle data */ |
| 1578 | fh = kzalloc(sizeof(*fh), GFP_KERNEL); | 1577 | fh = kzalloc(sizeof(*fh), GFP_KERNEL); |
| 1579 | if (NULL == fh) { | 1578 | if (!fh) |
| 1580 | unlock_kernel(); | ||
| 1581 | return -ENOMEM; | 1579 | return -ENOMEM; |
| 1582 | } | ||
| 1583 | |||
| 1584 | lock_kernel(); | ||
| 1585 | 1580 | ||
| 1586 | file->private_data = fh; | 1581 | file->private_data = fh; |
| 1587 | fh->dev = dev; | 1582 | fh->dev = dev; |
| @@ -1592,8 +1587,6 @@ static int mpeg_open(struct file *file) | |||
| 1592 | V4L2_FIELD_INTERLACED, | 1587 | V4L2_FIELD_INTERLACED, |
| 1593 | sizeof(struct cx23885_buffer), | 1588 | sizeof(struct cx23885_buffer), |
| 1594 | fh, NULL); | 1589 | fh, NULL); |
| 1595 | unlock_kernel(); | ||
| 1596 | |||
| 1597 | return 0; | 1590 | return 0; |
| 1598 | } | 1591 | } |
| 1599 | 1592 | ||
diff --git a/drivers/media/video/cx23885/cx23885-video.c b/drivers/media/video/cx23885/cx23885-video.c index 93af9c65b484..3cc9f462d08d 100644 --- a/drivers/media/video/cx23885/cx23885-video.c +++ b/drivers/media/video/cx23885/cx23885-video.c | |||
| @@ -26,7 +26,6 @@ | |||
| 26 | #include <linux/kmod.h> | 26 | #include <linux/kmod.h> |
| 27 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
| 28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
| 29 | #include <linux/smp_lock.h> | ||
| 30 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
| 31 | #include <linux/delay.h> | 30 | #include <linux/delay.h> |
| 32 | #include <linux/kthread.h> | 31 | #include <linux/kthread.h> |
| @@ -743,8 +742,6 @@ static int video_open(struct file *file) | |||
| 743 | if (NULL == fh) | 742 | if (NULL == fh) |
| 744 | return -ENOMEM; | 743 | return -ENOMEM; |
| 745 | 744 | ||
| 746 | lock_kernel(); | ||
| 747 | |||
| 748 | file->private_data = fh; | 745 | file->private_data = fh; |
| 749 | fh->dev = dev; | 746 | fh->dev = dev; |
| 750 | fh->radio = radio; | 747 | fh->radio = radio; |
| @@ -762,8 +759,6 @@ static int video_open(struct file *file) | |||
| 762 | 759 | ||
| 763 | dprintk(1, "post videobuf_queue_init()\n"); | 760 | dprintk(1, "post videobuf_queue_init()\n"); |
| 764 | 761 | ||
| 765 | unlock_kernel(); | ||
| 766 | |||
| 767 | return 0; | 762 | return 0; |
| 768 | } | 763 | } |
| 769 | 764 | ||
diff --git a/drivers/media/video/se401.c b/drivers/media/video/se401.c index 41d0166c0f95..41360d7c3e96 100644 --- a/drivers/media/video/se401.c +++ b/drivers/media/video/se401.c | |||
| @@ -31,7 +31,6 @@ static const char version[] = "0.24"; | |||
| 31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
| 32 | #include <linux/vmalloc.h> | 32 | #include <linux/vmalloc.h> |
| 33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
| 34 | #include <linux/smp_lock.h> | ||
| 35 | #include <linux/pagemap.h> | 34 | #include <linux/pagemap.h> |
| 36 | #include <linux/usb.h> | 35 | #include <linux/usb.h> |
| 37 | #include "se401.h" | 36 | #include "se401.h" |
| @@ -951,9 +950,9 @@ static int se401_open(struct file *file) | |||
| 951 | struct usb_se401 *se401 = (struct usb_se401 *)dev; | 950 | struct usb_se401 *se401 = (struct usb_se401 *)dev; |
| 952 | int err = 0; | 951 | int err = 0; |
| 953 | 952 | ||
| 954 | lock_kernel(); | 953 | mutex_lock(&se401->lock); |
| 955 | if (se401->user) { | 954 | if (se401->user) { |
| 956 | unlock_kernel(); | 955 | mutex_unlock(&se401->lock); |
| 957 | return -EBUSY; | 956 | return -EBUSY; |
| 958 | } | 957 | } |
| 959 | se401->fbuf = rvmalloc(se401->maxframesize * SE401_NUMFRAMES); | 958 | se401->fbuf = rvmalloc(se401->maxframesize * SE401_NUMFRAMES); |
| @@ -962,7 +961,7 @@ static int se401_open(struct file *file) | |||
| 962 | else | 961 | else |
| 963 | err = -ENOMEM; | 962 | err = -ENOMEM; |
| 964 | se401->user = !err; | 963 | se401->user = !err; |
| 965 | unlock_kernel(); | 964 | mutex_unlock(&se401->lock); |
| 966 | 965 | ||
| 967 | return err; | 966 | return err; |
| 968 | } | 967 | } |
diff --git a/drivers/media/video/stk-webcam.c b/drivers/media/video/stk-webcam.c index f07a0f6b71c4..b5afe5f841ce 100644 --- a/drivers/media/video/stk-webcam.c +++ b/drivers/media/video/stk-webcam.c | |||
| @@ -27,7 +27,6 @@ | |||
| 27 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
| 28 | #include <linux/errno.h> | 28 | #include <linux/errno.h> |
| 29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
| 30 | #include <linux/smp_lock.h> | ||
| 31 | 30 | ||
| 32 | #include <linux/usb.h> | 31 | #include <linux/usb.h> |
| 33 | #include <linux/mm.h> | 32 | #include <linux/mm.h> |
| @@ -673,14 +672,11 @@ static int v4l_stk_open(struct file *fp) | |||
| 673 | vdev = video_devdata(fp); | 672 | vdev = video_devdata(fp); |
| 674 | dev = vdev_to_camera(vdev); | 673 | dev = vdev_to_camera(vdev); |
| 675 | 674 | ||
| 676 | lock_kernel(); | ||
| 677 | if (dev == NULL || !is_present(dev)) { | 675 | if (dev == NULL || !is_present(dev)) { |
| 678 | unlock_kernel(); | ||
| 679 | return -ENXIO; | 676 | return -ENXIO; |
| 680 | } | 677 | } |
| 681 | fp->private_data = dev; | 678 | fp->private_data = dev; |
| 682 | usb_autopm_get_interface(dev->interface); | 679 | usb_autopm_get_interface(dev->interface); |
| 683 | unlock_kernel(); | ||
| 684 | 680 | ||
| 685 | return 0; | 681 | return 0; |
| 686 | } | 682 | } |
diff --git a/drivers/media/video/tlg2300/pd-main.c b/drivers/media/video/tlg2300/pd-main.c index 4555f4a5f4c8..c91424c0c135 100644 --- a/drivers/media/video/tlg2300/pd-main.c +++ b/drivers/media/video/tlg2300/pd-main.c | |||
| @@ -36,7 +36,6 @@ | |||
| 36 | #include <linux/string.h> | 36 | #include <linux/string.h> |
| 37 | #include <linux/types.h> | 37 | #include <linux/types.h> |
| 38 | #include <linux/firmware.h> | 38 | #include <linux/firmware.h> |
| 39 | #include <linux/smp_lock.h> | ||
| 40 | 39 | ||
| 41 | #include "vendorcmds.h" | 40 | #include "vendorcmds.h" |
| 42 | #include "pd-common.h" | 41 | #include "pd-common.h" |
| @@ -485,15 +484,11 @@ static void poseidon_disconnect(struct usb_interface *interface) | |||
| 485 | /*unregister v4l2 device */ | 484 | /*unregister v4l2 device */ |
| 486 | v4l2_device_unregister(&pd->v4l2_dev); | 485 | v4l2_device_unregister(&pd->v4l2_dev); |
| 487 | 486 | ||
| 488 | lock_kernel(); | 487 | pd_dvb_usb_device_exit(pd); |
| 489 | { | 488 | poseidon_fm_exit(pd); |
| 490 | pd_dvb_usb_device_exit(pd); | ||
| 491 | poseidon_fm_exit(pd); | ||
| 492 | 489 | ||
| 493 | poseidon_audio_free(pd); | 490 | poseidon_audio_free(pd); |
| 494 | pd_video_exit(pd); | 491 | pd_video_exit(pd); |
| 495 | } | ||
| 496 | unlock_kernel(); | ||
| 497 | 492 | ||
| 498 | usb_set_intfdata(interface, NULL); | 493 | usb_set_intfdata(interface, NULL); |
| 499 | kref_put(&pd->kref, poseidon_delete); | 494 | kref_put(&pd->kref, poseidon_delete); |
diff --git a/drivers/media/video/usbvideo/vicam.c b/drivers/media/video/usbvideo/vicam.c index 5d6fd01f918a..dc17cce2fbb6 100644 --- a/drivers/media/video/usbvideo/vicam.c +++ b/drivers/media/video/usbvideo/vicam.c | |||
| @@ -43,7 +43,6 @@ | |||
| 43 | #include <linux/vmalloc.h> | 43 | #include <linux/vmalloc.h> |
| 44 | #include <linux/mm.h> | 44 | #include <linux/mm.h> |
| 45 | #include <linux/slab.h> | 45 | #include <linux/slab.h> |
| 46 | #include <linux/smp_lock.h> | ||
| 47 | #include <linux/mutex.h> | 46 | #include <linux/mutex.h> |
| 48 | #include <linux/firmware.h> | 47 | #include <linux/firmware.h> |
| 49 | #include <linux/ihex.h> | 48 | #include <linux/ihex.h> |
| @@ -483,29 +482,28 @@ vicam_open(struct file *file) | |||
| 483 | return -EINVAL; | 482 | return -EINVAL; |
| 484 | } | 483 | } |
| 485 | 484 | ||
| 486 | /* the videodev_lock held above us protects us from | 485 | /* cam_lock/open_count protects us from simultaneous opens |
| 487 | * simultaneous opens...for now. we probably shouldn't | 486 | * ... for now. we probably shouldn't rely on this fact forever. |
| 488 | * rely on this fact forever. | ||
| 489 | */ | 487 | */ |
| 490 | 488 | ||
| 491 | lock_kernel(); | 489 | mutex_lock(&cam->cam_lock); |
| 492 | if (cam->open_count > 0) { | 490 | if (cam->open_count > 0) { |
| 493 | printk(KERN_INFO | 491 | printk(KERN_INFO |
| 494 | "vicam_open called on already opened camera"); | 492 | "vicam_open called on already opened camera"); |
| 495 | unlock_kernel(); | 493 | mutex_unlock(&cam->cam_lock); |
| 496 | return -EBUSY; | 494 | return -EBUSY; |
| 497 | } | 495 | } |
| 498 | 496 | ||
| 499 | cam->raw_image = kmalloc(VICAM_MAX_READ_SIZE, GFP_KERNEL); | 497 | cam->raw_image = kmalloc(VICAM_MAX_READ_SIZE, GFP_KERNEL); |
| 500 | if (!cam->raw_image) { | 498 | if (!cam->raw_image) { |
| 501 | unlock_kernel(); | 499 | mutex_unlock(&cam->cam_lock); |
| 502 | return -ENOMEM; | 500 | return -ENOMEM; |
| 503 | } | 501 | } |
| 504 | 502 | ||
| 505 | cam->framebuf = rvmalloc(VICAM_MAX_FRAME_SIZE * VICAM_FRAMES); | 503 | cam->framebuf = rvmalloc(VICAM_MAX_FRAME_SIZE * VICAM_FRAMES); |
| 506 | if (!cam->framebuf) { | 504 | if (!cam->framebuf) { |
| 507 | kfree(cam->raw_image); | 505 | kfree(cam->raw_image); |
| 508 | unlock_kernel(); | 506 | mutex_unlock(&cam->cam_lock); |
| 509 | return -ENOMEM; | 507 | return -ENOMEM; |
| 510 | } | 508 | } |
| 511 | 509 | ||
| @@ -513,10 +511,17 @@ vicam_open(struct file *file) | |||
| 513 | if (!cam->cntrlbuf) { | 511 | if (!cam->cntrlbuf) { |
| 514 | kfree(cam->raw_image); | 512 | kfree(cam->raw_image); |
| 515 | rvfree(cam->framebuf, VICAM_MAX_FRAME_SIZE * VICAM_FRAMES); | 513 | rvfree(cam->framebuf, VICAM_MAX_FRAME_SIZE * VICAM_FRAMES); |
| 516 | unlock_kernel(); | 514 | mutex_unlock(&cam->cam_lock); |
| 517 | return -ENOMEM; | 515 | return -ENOMEM; |
| 518 | } | 516 | } |
| 519 | 517 | ||
| 518 | cam->needsDummyRead = 1; | ||
| 519 | cam->open_count++; | ||
| 520 | |||
| 521 | file->private_data = cam; | ||
| 522 | mutex_unlock(&cam->cam_lock); | ||
| 523 | |||
| 524 | |||
| 520 | // First upload firmware, then turn the camera on | 525 | // First upload firmware, then turn the camera on |
| 521 | 526 | ||
| 522 | if (!cam->is_initialized) { | 527 | if (!cam->is_initialized) { |
| @@ -527,12 +532,6 @@ vicam_open(struct file *file) | |||
| 527 | 532 | ||
| 528 | set_camera_power(cam, 1); | 533 | set_camera_power(cam, 1); |
| 529 | 534 | ||
| 530 | cam->needsDummyRead = 1; | ||
| 531 | cam->open_count++; | ||
| 532 | |||
| 533 | file->private_data = cam; | ||
| 534 | unlock_kernel(); | ||
| 535 | |||
| 536 | return 0; | 535 | return 0; |
| 537 | } | 536 | } |
| 538 | 537 | ||
diff --git a/drivers/media/video/v4l2-dev.c b/drivers/media/video/v4l2-dev.c index 0ca7978654b5..03f7f4670e9b 100644 --- a/drivers/media/video/v4l2-dev.c +++ b/drivers/media/video/v4l2-dev.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <linux/init.h> | 25 | #include <linux/init.h> |
| 26 | #include <linux/kmod.h> | 26 | #include <linux/kmod.h> |
| 27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
| 28 | #include <linux/smp_lock.h> | ||
| 29 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
| 30 | #include <asm/system.h> | 29 | #include <asm/system.h> |
| 31 | 30 | ||
| @@ -247,10 +246,12 @@ static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
| 247 | mutex_unlock(vdev->lock); | 246 | mutex_unlock(vdev->lock); |
| 248 | } else if (vdev->fops->ioctl) { | 247 | } else if (vdev->fops->ioctl) { |
| 249 | /* TODO: convert all drivers to unlocked_ioctl */ | 248 | /* TODO: convert all drivers to unlocked_ioctl */ |
| 250 | lock_kernel(); | 249 | static DEFINE_MUTEX(v4l2_ioctl_mutex); |
| 250 | |||
| 251 | mutex_lock(&v4l2_ioctl_mutex); | ||
| 251 | if (video_is_registered(vdev)) | 252 | if (video_is_registered(vdev)) |
| 252 | ret = vdev->fops->ioctl(filp, cmd, arg); | 253 | ret = vdev->fops->ioctl(filp, cmd, arg); |
| 253 | unlock_kernel(); | 254 | mutex_unlock(&v4l2_ioctl_mutex); |
| 254 | } else | 255 | } else |
| 255 | ret = -ENOTTY; | 256 | ret = -ENOTTY; |
| 256 | 257 | ||
diff --git a/drivers/media/video/zoran/zoran.h b/drivers/media/video/zoran/zoran.h index 37fe16181e3c..27f05551183f 100644 --- a/drivers/media/video/zoran/zoran.h +++ b/drivers/media/video/zoran/zoran.h | |||
| @@ -388,6 +388,7 @@ struct zoran { | |||
| 388 | struct videocodec *vfe; /* video front end */ | 388 | struct videocodec *vfe; /* video front end */ |
| 389 | 389 | ||
| 390 | struct mutex resource_lock; /* prevent evil stuff */ | 390 | struct mutex resource_lock; /* prevent evil stuff */ |
| 391 | struct mutex other_lock; /* please merge with above */ | ||
| 391 | 392 | ||
| 392 | u8 initialized; /* flag if zoran has been correctly initialized */ | 393 | u8 initialized; /* flag if zoran has been correctly initialized */ |
| 393 | int user; /* number of current users */ | 394 | int user; /* number of current users */ |
diff --git a/drivers/media/video/zoran/zoran_card.c b/drivers/media/video/zoran/zoran_card.c index 0aac376c3f7a..7e6d62467eaa 100644 --- a/drivers/media/video/zoran/zoran_card.c +++ b/drivers/media/video/zoran/zoran_card.c | |||
| @@ -1227,6 +1227,7 @@ static int __devinit zoran_probe(struct pci_dev *pdev, | |||
| 1227 | snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id); | 1227 | snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id); |
| 1228 | spin_lock_init(&zr->spinlock); | 1228 | spin_lock_init(&zr->spinlock); |
| 1229 | mutex_init(&zr->resource_lock); | 1229 | mutex_init(&zr->resource_lock); |
| 1230 | mutex_init(&zr->other_lock); | ||
| 1230 | if (pci_enable_device(pdev)) | 1231 | if (pci_enable_device(pdev)) |
| 1231 | goto zr_unreg; | 1232 | goto zr_unreg; |
| 1232 | pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION, &zr->revision); | 1233 | pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION, &zr->revision); |
diff --git a/drivers/media/video/zoran/zoran_driver.c b/drivers/media/video/zoran/zoran_driver.c index 401082b853f0..67a52e844ae6 100644 --- a/drivers/media/video/zoran/zoran_driver.c +++ b/drivers/media/video/zoran/zoran_driver.c | |||
| @@ -49,7 +49,6 @@ | |||
| 49 | #include <linux/module.h> | 49 | #include <linux/module.h> |
| 50 | #include <linux/delay.h> | 50 | #include <linux/delay.h> |
| 51 | #include <linux/slab.h> | 51 | #include <linux/slab.h> |
| 52 | #include <linux/smp_lock.h> | ||
| 53 | #include <linux/pci.h> | 52 | #include <linux/pci.h> |
| 54 | #include <linux/vmalloc.h> | 53 | #include <linux/vmalloc.h> |
| 55 | #include <linux/wait.h> | 54 | #include <linux/wait.h> |
| @@ -913,7 +912,7 @@ static int zoran_open(struct file *file) | |||
| 913 | dprintk(2, KERN_INFO "%s: %s(%s, pid=[%d]), users(-)=%d\n", | 912 | dprintk(2, KERN_INFO "%s: %s(%s, pid=[%d]), users(-)=%d\n", |
| 914 | ZR_DEVNAME(zr), __func__, current->comm, task_pid_nr(current), zr->user + 1); | 913 | ZR_DEVNAME(zr), __func__, current->comm, task_pid_nr(current), zr->user + 1); |
| 915 | 914 | ||
| 916 | lock_kernel(); | 915 | mutex_lock(&zr->other_lock); |
| 917 | 916 | ||
| 918 | if (zr->user >= 2048) { | 917 | if (zr->user >= 2048) { |
| 919 | dprintk(1, KERN_ERR "%s: too many users (%d) on device\n", | 918 | dprintk(1, KERN_ERR "%s: too many users (%d) on device\n", |
| @@ -963,14 +962,14 @@ static int zoran_open(struct file *file) | |||
| 963 | file->private_data = fh; | 962 | file->private_data = fh; |
| 964 | fh->zr = zr; | 963 | fh->zr = zr; |
| 965 | zoran_open_init_session(fh); | 964 | zoran_open_init_session(fh); |
| 966 | unlock_kernel(); | 965 | mutex_unlock(&zr->other_lock); |
| 967 | 966 | ||
| 968 | return 0; | 967 | return 0; |
| 969 | 968 | ||
| 970 | fail_fh: | 969 | fail_fh: |
| 971 | kfree(fh); | 970 | kfree(fh); |
| 972 | fail_unlock: | 971 | fail_unlock: |
| 973 | unlock_kernel(); | 972 | mutex_unlock(&zr->other_lock); |
| 974 | 973 | ||
| 975 | dprintk(2, KERN_INFO "%s: open failed (%d), users(-)=%d\n", | 974 | dprintk(2, KERN_INFO "%s: open failed (%d), users(-)=%d\n", |
| 976 | ZR_DEVNAME(zr), res, zr->user); | 975 | ZR_DEVNAME(zr), res, zr->user); |
| @@ -989,7 +988,7 @@ zoran_close(struct file *file) | |||
| 989 | 988 | ||
| 990 | /* kernel locks (fs/device.c), so don't do that ourselves | 989 | /* kernel locks (fs/device.c), so don't do that ourselves |
| 991 | * (prevents deadlocks) */ | 990 | * (prevents deadlocks) */ |
| 992 | /*mutex_lock(&zr->resource_lock);*/ | 991 | mutex_lock(&zr->other_lock); |
| 993 | 992 | ||
| 994 | zoran_close_end_session(fh); | 993 | zoran_close_end_session(fh); |
| 995 | 994 | ||
| @@ -1023,6 +1022,7 @@ zoran_close(struct file *file) | |||
| 1023 | encoder_call(zr, video, s_routing, 2, 0, 0); | 1022 | encoder_call(zr, video, s_routing, 2, 0, 0); |
| 1024 | } | 1023 | } |
| 1025 | } | 1024 | } |
| 1025 | mutex_unlock(&zr->other_lock); | ||
| 1026 | 1026 | ||
| 1027 | file->private_data = NULL; | 1027 | file->private_data = NULL; |
| 1028 | kfree(fh->overlay_mask); | 1028 | kfree(fh->overlay_mask); |
| @@ -3370,11 +3370,26 @@ static const struct v4l2_ioctl_ops zoran_ioctl_ops = { | |||
| 3370 | #endif | 3370 | #endif |
| 3371 | }; | 3371 | }; |
| 3372 | 3372 | ||
| 3373 | /* please use zr->resource_lock consistently and kill this wrapper */ | ||
| 3374 | static long zoran_ioctl(struct file *file, unsigned int cmd, | ||
| 3375 | unsigned long arg) | ||
| 3376 | { | ||
| 3377 | struct zoran_fh *fh = file->private_data; | ||
| 3378 | struct zoran *zr = fh->zr; | ||
| 3379 | int ret; | ||
| 3380 | |||
| 3381 | mutex_lock(&zr->other_lock); | ||
| 3382 | ret = video_ioctl2(file, cmd, arg); | ||
| 3383 | mutex_unlock(&zr->other_lock); | ||
| 3384 | |||
| 3385 | return ret; | ||
| 3386 | } | ||
| 3387 | |||
| 3373 | static const struct v4l2_file_operations zoran_fops = { | 3388 | static const struct v4l2_file_operations zoran_fops = { |
| 3374 | .owner = THIS_MODULE, | 3389 | .owner = THIS_MODULE, |
| 3375 | .open = zoran_open, | 3390 | .open = zoran_open, |
| 3376 | .release = zoran_close, | 3391 | .release = zoran_close, |
| 3377 | .ioctl = video_ioctl2, | 3392 | .unlocked_ioctl = zoran_ioctl, |
| 3378 | .read = zoran_read, | 3393 | .read = zoran_read, |
| 3379 | .write = zoran_write, | 3394 | .write = zoran_write, |
| 3380 | .mmap = zoran_mmap, | 3395 | .mmap = zoran_mmap, |
