lkml.org 
[lkml]   [2008]   [May]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] video4linux: Push down the BKL
    For most drivers the generic ioctl handler does the work and we update it
    and it becomes the unlocked_ioctl method. Older drivers use the usercopy
    method so we make it do the work. Finally there are a few special cases.

    Signed-off-by: Alan Cox <alan@redhat.com>

    diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c
    index 2ca3e9c..964fc31 100644
    --- a/drivers/media/video/bt8xx/bttv-driver.c
    +++ b/drivers/media/video/bt8xx/bttv-driver.c
    @@ -3349,7 +3349,7 @@ static const struct file_operations bttv_fops =
    .owner = THIS_MODULE,
    .open = bttv_open,
    .release = bttv_release,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .compat_ioctl = v4l_compat_ioctl32,
    .llseek = no_llseek,
    .read = bttv_read,
    @@ -3630,7 +3630,7 @@ static const struct file_operations radio_fops =
    .read = radio_read,
    .release = radio_release,
    .compat_ioctl = v4l_compat_ioctl32,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .llseek = no_llseek,
    .poll = radio_poll,
    };
    diff --git a/drivers/media/video/bw-qcam.c b/drivers/media/video/bw-qcam.c
    index b364ada..e953bc9 100644
    --- a/drivers/media/video/bw-qcam.c
    +++ b/drivers/media/video/bw-qcam.c
    @@ -863,10 +863,9 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file,
    return 0;
    }

    -static int qcam_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long qcam_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
    {
    - return video_usercopy(inode, file, cmd, arg, qcam_do_ioctl);
    + return video_usercopy(file, cmd, arg, qcam_do_ioctl);
    }

    static ssize_t qcam_read(struct file *file, char __user *buf,
    @@ -897,7 +896,7 @@ static const struct file_operations qcam_fops = {
    .owner = THIS_MODULE,
    .open = video_exclusive_open,
    .release = video_exclusive_release,
    - .ioctl = qcam_ioctl,
    + .unlocked_ioctl = qcam_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/c-qcam.c b/drivers/media/video/c-qcam.c
    index fe1e67b..7541e2c 100644
    --- a/drivers/media/video/c-qcam.c
    +++ b/drivers/media/video/c-qcam.c
    @@ -499,7 +499,7 @@ static long qc_capture(struct qcam_device *q, char __user *buf, unsigned long le
    */

    static int qcam_do_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, void *arg)
    + unsigned int cmd, void *arg)
    {
    struct video_device *dev = video_devdata(file);
    struct qcam_device *qcam=(struct qcam_device *)dev;
    @@ -664,10 +664,9 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file,
    return 0;
    }

    -static int qcam_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long qcam_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
    {
    - return video_usercopy(inode, file, cmd, arg, qcam_do_ioctl);
    + return video_usercopy(file, cmd, arg, qcam_do_ioctl);
    }

    static ssize_t qcam_read(struct file *file, char __user *buf,
    @@ -691,7 +690,7 @@ static const struct file_operations qcam_fops = {
    .owner = THIS_MODULE,
    .open = video_exclusive_open,
    .release = video_exclusive_release,
    - .ioctl = qcam_ioctl,
    + .unlocked_ioctl = qcam_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/cafe_ccic.c b/drivers/media/video/cafe_ccic.c
    index 5195b1f..8b697e3 100644
    --- a/drivers/media/video/cafe_ccic.c
    +++ b/drivers/media/video/cafe_ccic.c
    @@ -1764,7 +1764,7 @@ static const struct file_operations cafe_v4l_fops = {
    .read = cafe_v4l_read,
    .poll = cafe_v4l_poll,
    .mmap = cafe_v4l_mmap,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .llseek = no_llseek,
    };

    diff --git a/drivers/media/video/cpia.c b/drivers/media/video/cpia.c
    index 2a81376..93766a1 100644
    --- a/drivers/media/video/cpia.c
    +++ b/drivers/media/video/cpia.c
    @@ -3725,10 +3725,9 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file,
    return retval;
    }

    -static int cpia_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long cpia_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
    {
    - return video_usercopy(inode, file, cmd, arg, cpia_do_ioctl);
    + return video_usercopy(file, cmd, arg, cpia_do_ioctl);
    }


    @@ -3791,7 +3790,7 @@ static const struct file_operations cpia_fops = {
    .release = cpia_close,
    .read = cpia_read,
    .mmap = cpia_mmap,
    - .ioctl = cpia_ioctl,
    + .unlocked_ioctl = cpia_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/cpia2/cpia2_v4l.c b/drivers/media/video/cpia2/cpia2_v4l.c
    index 7ce2789..bf551f8 100644
    --- a/drivers/media/video/cpia2/cpia2_v4l.c
    +++ b/drivers/media/video/cpia2/cpia2_v4l.c
    @@ -1847,10 +1847,10 @@ static int cpia2_do_ioctl(struct inode *inode, struct file *file,
    return retval;
    }

    -static int cpia2_ioctl(struct inode *inode, struct file *file,
    - unsigned int ioctl_nr, unsigned long iarg)
    +static long cpia2_ioctl(struct file *file, unsigned int ioctl_nr,
    + unsigned long iarg)
    {
    - return video_usercopy(inode, file, ioctl_nr, iarg, cpia2_do_ioctl);
    + return video_usercopy(file, ioctl_nr, iarg, cpia2_do_ioctl);
    }

    /******************************************************************************
    @@ -1925,7 +1925,7 @@ static const struct file_operations fops_template = {
    .release = cpia2_close,
    .read = cpia2_v4l_read,
    .poll = cpia2_v4l_poll,
    - .ioctl = cpia2_ioctl,
    + .unlocked_ioctl = cpia2_ioctl,
    .llseek = no_llseek,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    diff --git a/drivers/media/video/cx18/cx18-ioctl.c b/drivers/media/video/cx18/cx18-ioctl.c
    index dbdcb86..faf3a31 100644
    --- a/drivers/media/video/cx18/cx18-ioctl.c
    +++ b/drivers/media/video/cx18/cx18-ioctl.c
    @@ -837,15 +837,16 @@ static int cx18_v4l2_do_ioctl(struct inode *inode, struct file *filp,
    return 0;
    }

    -int cx18_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
    - unsigned long arg)
    +long cx18_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
    {
    struct cx18_open_id *id = (struct cx18_open_id *)filp->private_data;
    struct cx18 *cx = id->cx;
    int res;

    + lock_kernel();
    mutex_lock(&cx->serialize_lock);
    - res = video_usercopy(inode, filp, cmd, arg, cx18_v4l2_do_ioctl);
    + res = video_usercopy(filp, cmd, arg, cx18_v4l2_do_ioctl);
    mutex_unlock(&cx->serialize_lock);
    + unlock_kernel();
    return res;
    }
    diff --git a/drivers/media/video/cx18/cx18-ioctl.h b/drivers/media/video/cx18/cx18-ioctl.h
    index 9f4c7eb..32bede3 100644
    --- a/drivers/media/video/cx18/cx18-ioctl.h
    +++ b/drivers/media/video/cx18/cx18-ioctl.h
    @@ -1,4 +1,4 @@
    -/*
    + /*
    * cx18 ioctl system call
    *
    * Derived from ivtv-ioctl.h
    @@ -24,7 +24,6 @@
    u16 cx18_service2vbi(int type);
    void cx18_expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal);
    u16 cx18_get_service_set(struct v4l2_sliced_vbi_format *fmt);
    -int cx18_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
    - unsigned long arg);
    +long cx18_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
    int cx18_v4l2_ioctls(struct cx18 *cx, struct file *filp, unsigned cmd,
    void *arg);
    diff --git a/drivers/media/video/cx18/cx18-streams.c b/drivers/media/video/cx18/cx18-streams.c
    index afb141b..7348b82 100644
    --- a/drivers/media/video/cx18/cx18-streams.c
    +++ b/drivers/media/video/cx18/cx18-streams.c
    @@ -39,7 +39,7 @@ static struct file_operations cx18_v4l2_enc_fops = {
    .owner = THIS_MODULE,
    .read = cx18_v4l2_read,
    .open = cx18_v4l2_open,
    - .ioctl = cx18_v4l2_ioctl,
    + .unlocked_ioctl = cx18_v4l2_ioctl,
    .release = cx18_v4l2_close,
    .poll = cx18_v4l2_enc_poll,
    };
    diff --git a/drivers/media/video/cx23885/cx23885-417.c b/drivers/media/video/cx23885/cx23885-417.c
    index acdd3b6..8530c60 100644
    --- a/drivers/media/video/cx23885/cx23885-417.c
    +++ b/drivers/media/video/cx23885/cx23885-417.c
    @@ -1542,10 +1542,9 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
    return 0;
    }

    -static int mpeg_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static int mpeg_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
    {
    - return video_usercopy(inode, file, cmd, arg, mpeg_do_ioctl);
    + return video_usercopy(file, cmd, arg, mpeg_do_ioctl);
    }

    static int mpeg_open(struct inode *inode, struct file *file)
    @@ -1670,7 +1669,7 @@ static struct file_operations mpeg_fops = {
    .read = mpeg_read,
    .poll = mpeg_poll,
    .mmap = mpeg_mmap,
    - .ioctl = mpeg_ioctl,
    + .unlocked_ioctl= mpeg_ioctl,
    .llseek = no_llseek,
    };

    diff --git a/drivers/media/video/cx23885/cx23885-video.c b/drivers/media/video/cx23885/cx23885-video.c
    index 8465221..c4059fa 100644
    --- a/drivers/media/video/cx23885/cx23885-video.c
    +++ b/drivers/media/video/cx23885/cx23885-video.c
    @@ -1428,7 +1428,7 @@ static const struct file_operations video_fops = {
    .read = video_read,
    .poll = video_poll,
    .mmap = video_mmap,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .compat_ioctl = v4l_compat_ioctl32,
    .llseek = no_llseek,
    };
    @@ -1479,7 +1479,7 @@ static const struct file_operations radio_fops = {
    .owner = THIS_MODULE,
    .open = video_open,
    .release = video_release,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .compat_ioctl = v4l_compat_ioctl32,
    .llseek = no_llseek,
    };
    diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c
    index 6c0c94c..9b5f761 100644
    --- a/drivers/media/video/cx88/cx88-blackbird.c
    +++ b/drivers/media/video/cx88/cx88-blackbird.c
    @@ -1169,7 +1169,7 @@ static const struct file_operations mpeg_fops =
    .read = mpeg_read,
    .poll = mpeg_poll,
    .mmap = mpeg_mmap,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl= video_ioctl2,
    .llseek = no_llseek,
    };

    diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c
    index eea23f9..ee1d29b 100644
    --- a/drivers/media/video/cx88/cx88-video.c
    +++ b/drivers/media/video/cx88/cx88-video.c
    @@ -1677,7 +1677,7 @@ static const struct file_operations video_fops =
    .read = video_read,
    .poll = video_poll,
    .mmap = video_mmap,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .compat_ioctl = v4l_compat_ioctl32,
    .llseek = no_llseek,
    };
    @@ -1730,7 +1730,7 @@ static const struct file_operations radio_fops =
    .owner = THIS_MODULE,
    .open = video_open,
    .release = video_release,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .compat_ioctl = v4l_compat_ioctl32,
    .llseek = no_llseek,
    };
    diff --git a/drivers/media/video/dabusb.c b/drivers/media/video/dabusb.c
    index 8d1f8ee..ae26ade 100644
    --- a/drivers/media/video/dabusb.c
    +++ b/drivers/media/video/dabusb.c
    @@ -636,7 +636,8 @@ static int dabusb_release (struct inode *inode, struct file *file)
    return 0;
    }

    -static int dabusb_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
    +static long dabusb_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg)
    {
    pdabusb_t s = (pdabusb_t) file->private_data;
    pbulk_transfer_t pbulk;
    @@ -700,7 +701,7 @@ static const struct file_operations dabusb_fops =
    .owner = THIS_MODULE,
    .llseek = no_llseek,
    .read = dabusb_read,
    - .ioctl = dabusb_ioctl,
    + .unlocked_ioctl = dabusb_ioctl,
    .open = dabusb_open,
    .release = dabusb_release,
    };
    diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c
    index 8996175..f1e08b2 100644
    --- a/drivers/media/video/em28xx/em28xx-video.c
    +++ b/drivers/media/video/em28xx/em28xx-video.c
    @@ -1756,7 +1756,7 @@ static const struct file_operations em28xx_v4l_fops = {
    .read = em28xx_v4l2_read,
    .poll = em28xx_v4l2_poll,
    .mmap = em28xx_v4l2_mmap,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl= video_ioctl2,
    .llseek = no_llseek,
    .compat_ioctl = v4l_compat_ioctl32,
    };
    @@ -1765,7 +1765,7 @@ static const struct file_operations radio_fops = {
    .owner = THIS_MODULE,
    .open = em28xx_v4l2_open,
    .release = em28xx_v4l2_close,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl= video_ioctl2,
    .compat_ioctl = v4l_compat_ioctl32,
    .llseek = no_llseek,
    };
    diff --git a/drivers/media/video/et61x251/et61x251_core.c b/drivers/media/video/et61x251/et61x251_core.c
    index 5e749c5..9f13cca 100644
    --- a/drivers/media/video/et61x251/et61x251_core.c
    +++ b/drivers/media/video/et61x251/et61x251_core.c
    @@ -2391,8 +2391,8 @@ et61x251_vidioc_s_parm(struct et61x251_device* cam, void __user * arg)
    }


    -static int et61x251_ioctl_v4l2(struct inode* inode, struct file* filp,
    - unsigned int cmd, void __user * arg)
    +static int et61x251_ioctl_v4l2(struct file* filp, unsigned int cmd,
    + void __user * arg)
    {
    struct et61x251_device* cam = video_get_drvdata(video_devdata(filp));

    @@ -2486,8 +2486,8 @@ static int et61x251_ioctl_v4l2(struct inode* inode, struct file* filp,
    }


    -static int et61x251_ioctl(struct inode* inode, struct file* filp,
    - unsigned int cmd, unsigned long arg)
    +static long et61x251_ioctl(struct file* filp, unsigned int cmd,
    + unsigned long arg)
    {
    struct et61x251_device* cam = video_get_drvdata(video_devdata(filp));
    int err = 0;
    @@ -2510,7 +2510,9 @@ static int et61x251_ioctl(struct inode* inode, struct file* filp,

    V4LDBG(3, "et61x251", cmd);

    - err = et61x251_ioctl_v4l2(inode, filp, cmd, (void __user *)arg);
    + lock_kernel();
    + err = et61x251_ioctl_v4l2(filp, cmd, (void __user *)arg);
    + unlock_kernel();

    mutex_unlock(&cam->fileop_mutex);

    @@ -2522,7 +2524,7 @@ static const struct file_operations et61x251_fops = {
    .owner = THIS_MODULE,
    .open = et61x251_open,
    .release = et61x251_release,
    - .ioctl = et61x251_ioctl,
    + .unlocked_ioctl = et61x251_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/ivtv/ivtv-ioctl.c b/drivers/media/video/ivtv/ivtv-ioctl.c
    index d508b5d..a481b2d 100644
    --- a/drivers/media/video/ivtv/ivtv-ioctl.c
    +++ b/drivers/media/video/ivtv/ivtv-ioctl.c
    @@ -1726,7 +1726,7 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
    return 0;
    }

    -static int ivtv_serialized_ioctl(struct ivtv *itv, struct inode *inode, struct file *filp,
    +static int ivtv_serialized_ioctl(struct ivtv *itv, struct file *filp,
    unsigned int cmd, unsigned long arg)
    {
    /* Filter dvb ioctls that cannot be handled by video_usercopy */
    @@ -1761,18 +1761,19 @@ static int ivtv_serialized_ioctl(struct ivtv *itv, struct inode *inode, struct f
    default:
    break;
    }
    - return video_usercopy(inode, filp, cmd, arg, ivtv_v4l2_do_ioctl);
    + return video_usercopy(filp, cmd, arg, ivtv_v4l2_do_ioctl);
    }

    -int ivtv_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
    - unsigned long arg)
    +long ivtv_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
    {
    struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
    struct ivtv *itv = id->itv;
    int res;

    + lock_kernel();
    mutex_lock(&itv->serialize_lock);
    - res = ivtv_serialized_ioctl(itv, inode, filp, cmd, arg);
    + res = ivtv_serialized_ioctl(itv, filp, cmd, arg);
    mutex_unlock(&itv->serialize_lock);
    + unlock_kernel();
    return res;
    }
    diff --git a/drivers/media/video/ivtv/ivtv-ioctl.h b/drivers/media/video/ivtv/ivtv-ioctl.h
    index a03351b..6708ea0 100644
    --- a/drivers/media/video/ivtv/ivtv-ioctl.h
    +++ b/drivers/media/video/ivtv/ivtv-ioctl.h
    @@ -24,8 +24,7 @@
    u16 service2vbi(int type);
    void expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal);
    u16 get_service_set(struct v4l2_sliced_vbi_format *fmt);
    -int ivtv_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
    - unsigned long arg);
    +long ivtv_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
    int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void *arg);
    void ivtv_set_osd_alpha(struct ivtv *itv);
    int ivtv_set_speed(struct ivtv *itv, int speed);
    diff --git a/drivers/media/video/ivtv/ivtv-streams.c b/drivers/media/video/ivtv/ivtv-streams.c
    index 4ab8d36..3131f68 100644
    --- a/drivers/media/video/ivtv/ivtv-streams.c
    +++ b/drivers/media/video/ivtv/ivtv-streams.c
    @@ -48,7 +48,7 @@ static const struct file_operations ivtv_v4l2_enc_fops = {
    .read = ivtv_v4l2_read,
    .write = ivtv_v4l2_write,
    .open = ivtv_v4l2_open,
    - .ioctl = ivtv_v4l2_ioctl,
    + .unlocked_ioctl = ivtv_v4l2_ioctl,
    .release = ivtv_v4l2_close,
    .poll = ivtv_v4l2_enc_poll,
    };
    @@ -58,7 +58,7 @@ static const struct file_operations ivtv_v4l2_dec_fops = {
    .read = ivtv_v4l2_read,
    .write = ivtv_v4l2_write,
    .open = ivtv_v4l2_open,
    - .ioctl = ivtv_v4l2_ioctl,
    + .unlocked_ioctl = ivtv_v4l2_ioctl,
    .release = ivtv_v4l2_close,
    .poll = ivtv_v4l2_dec_poll,
    };
    diff --git a/drivers/media/video/meye.c b/drivers/media/video/meye.c
    index e7ccbc8..a92c0ba 100644
    --- a/drivers/media/video/meye.c
    +++ b/drivers/media/video/meye.c
    @@ -1687,7 +1687,7 @@ static const struct file_operations meye_fops = {
    .open = meye_open,
    .release = meye_release,
    .mmap = meye_mmap,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/ov511.c b/drivers/media/video/ov511.c
    index eafb0c7..3e3f70b 100644
    --- a/drivers/media/video/ov511.c
    +++ b/drivers/media/video/ov511.c
    @@ -4440,9 +4440,8 @@ redo:
    return 0;
    }

    -static int
    -ov51x_v4l1_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long
    +ov51x_v4l1_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
    {
    struct video_device *vdev = file->private_data;
    struct usb_ov511 *ov = video_get_drvdata(vdev);
    @@ -4451,7 +4450,7 @@ ov51x_v4l1_ioctl(struct inode *inode, struct file *file,
    if (mutex_lock_interruptible(&ov->lock))
    return -EINTR;

    - rc = video_usercopy(inode, file, cmd, arg, ov51x_v4l1_ioctl_internal);
    + rc = video_usercopy(file, cmd, arg, ov51x_v4l1_ioctl_internal);

    mutex_unlock(&ov->lock);
    return rc;
    @@ -4653,16 +4652,16 @@ ov51x_v4l1_mmap(struct file *file, struct vm_area_struct *vma)
    }

    static const struct file_operations ov511_fops = {
    - .owner = THIS_MODULE,
    - .open = ov51x_v4l1_open,
    - .release = ov51x_v4l1_close,
    - .read = ov51x_v4l1_read,
    - .mmap = ov51x_v4l1_mmap,
    - .ioctl = ov51x_v4l1_ioctl,
    + .owner = THIS_MODULE,
    + .open = ov51x_v4l1_open,
    + .release = ov51x_v4l1_close,
    + .read = ov51x_v4l1_read,
    + .mmap = ov51x_v4l1_mmap,
    + .unlocked_ioctl = ov51x_v4l1_ioctl,
    #ifdef CONFIG_COMPAT
    - .compat_ioctl = v4l_compat_ioctl32,
    + .compat_ioctl = v4l_compat_ioctl32,
    #endif
    - .llseek = no_llseek,
    + .llseek = no_llseek,
    };

    static struct video_device vdev_template = {
    diff --git a/drivers/media/video/pms.c b/drivers/media/video/pms.c
    index 51b1461..4cfe7aa 100644
    --- a/drivers/media/video/pms.c
    +++ b/drivers/media/video/pms.c
    @@ -861,10 +861,9 @@ static int pms_do_ioctl(struct inode *inode, struct file *file,
    return 0;
    }

    -static int pms_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long pms_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
    {
    - return video_usercopy(inode, file, cmd, arg, pms_do_ioctl);
    + return video_usercopy(file, cmd, arg, pms_do_ioctl);
    }

    static ssize_t pms_read(struct file *file, char __user *buf,
    @@ -884,7 +883,7 @@ static const struct file_operations pms_fops = {
    .owner = THIS_MODULE,
    .open = video_exclusive_open,
    .release = video_exclusive_release,
    - .ioctl = pms_ioctl,
    + .unlocked_ioctl = pms_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
    index e9b5d4e..5deb006 100644
    --- a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
    +++ b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
    @@ -862,7 +862,7 @@ static void pvr2_v4l2_internal_check(struct pvr2_channel *chp)
    }


    -static int pvr2_v4l2_ioctl(struct inode *inode, struct file *file,
    +static long pvr2_v4l2_ioctl(struct file *file,
    unsigned int cmd, unsigned long arg)
    {

    @@ -870,7 +870,7 @@ static int pvr2_v4l2_ioctl(struct inode *inode, struct file *file,
    #define IVTV_IOC_G_CODEC 0xFFEE7703
    #define IVTV_IOC_S_CODEC 0xFFEE7704
    if (cmd == IVTV_IOC_G_CODEC || cmd == IVTV_IOC_S_CODEC) return 0;
    - return video_usercopy(inode, file, cmd, arg, pvr2_v4l2_do_ioctl);
    + return video_usercopy(file, cmd, arg, pvr2_v4l2_do_ioctl);
    }


    @@ -1154,7 +1154,7 @@ static const struct file_operations vdev_fops = {
    .open = pvr2_v4l2_open,
    .release = pvr2_v4l2_release,
    .read = pvr2_v4l2_read,
    - .ioctl = pvr2_v4l2_ioctl,
    + .unlocked_ioctl = pvr2_v4l2_ioctl,
    .llseek = no_llseek,
    .poll = pvr2_v4l2_poll,
    };
    diff --git a/drivers/media/video/pwc/pwc-if.c b/drivers/media/video/pwc/pwc-if.c
    index 423fa7c..d907966 100644
    --- a/drivers/media/video/pwc/pwc-if.c
    +++ b/drivers/media/video/pwc/pwc-if.c
    @@ -147,8 +147,8 @@ static int pwc_video_close(struct inode *inode, struct file *file);
    static ssize_t pwc_video_read(struct file *file, char __user *buf,
    size_t count, loff_t *ppos);
    static unsigned int pwc_video_poll(struct file *file, poll_table *wait);
    -static int pwc_video_ioctl(struct inode *inode, struct file *file,
    - unsigned int ioctlnr, unsigned long arg);
    +static long pwc_video_ioctl(struct file *file, unsigned int ioctlnr,
    + unsigned long arg);
    static int pwc_video_mmap(struct file *file, struct vm_area_struct *vma);

    static const struct file_operations pwc_fops = {
    @@ -158,7 +158,7 @@ static const struct file_operations pwc_fops = {
    .read = pwc_video_read,
    .poll = pwc_video_poll,
    .mmap = pwc_video_mmap,
    - .ioctl = pwc_video_ioctl,
    + .unlocked_ioctl = pwc_video_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    @@ -1400,8 +1400,8 @@ static unsigned int pwc_video_poll(struct file *file, poll_table *wait)
    return 0;
    }

    -static int pwc_video_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long pwc_video_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg)
    {
    struct video_device *vdev = file->private_data;
    struct pwc_device *pdev;
    @@ -1413,7 +1413,7 @@ static int pwc_video_ioctl(struct inode *inode, struct file *file,

    mutex_lock(&pdev->modlock);
    if (!pdev->unplugged)
    - r = video_usercopy(inode, file, cmd, arg, pwc_video_do_ioctl);
    + r = video_usercopy(file, cmd, arg, pwc_video_do_ioctl);
    mutex_unlock(&pdev->modlock);
    out:
    return r;
    diff --git a/drivers/media/video/saa5246a.c b/drivers/media/video/saa5246a.c
    index 996b494..9691ac1 100644
    --- a/drivers/media/video/saa5246a.c
    +++ b/drivers/media/video/saa5246a.c
    @@ -715,8 +715,8 @@ static inline unsigned int vtx_fix_command(unsigned int cmd)
    /*
    * Handle the locking
    */
    -static int saa5246a_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static int saa5246a_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg)
    {
    struct video_device *vd = video_devdata(file);
    struct saa5246a_device *t = vd->priv;
    @@ -724,7 +724,7 @@ static int saa5246a_ioctl(struct inode *inode, struct file *file,

    cmd = vtx_fix_command(cmd);
    mutex_lock(&t->lock);
    - err = video_usercopy(inode, file, cmd, arg, do_saa5246a_ioctl);
    + err = video_usercopy(file, cmd, arg, do_saa5246a_ioctl);
    mutex_unlock(&t->lock);
    return err;
    }
    @@ -822,7 +822,7 @@ static const struct file_operations saa_fops = {
    .owner = THIS_MODULE,
    .open = saa5246a_open,
    .release = saa5246a_release,
    - .ioctl = saa5246a_ioctl,
    + .unlocked_ioctl = saa5246a_ioctl,
    .llseek = no_llseek,
    };

    diff --git a/drivers/media/video/saa5249.c b/drivers/media/video/saa5249.c
    index ec8c65d..159f7f0 100644
    --- a/drivers/media/video/saa5249.c
    +++ b/drivers/media/video/saa5249.c
    @@ -611,8 +611,8 @@ static inline unsigned int vtx_fix_command(unsigned int cmd)
    * Handle the locking
    */

    -static int saa5249_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long saa5249_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg)
    {
    struct video_device *vd = video_devdata(file);
    struct saa5249_device *t=vd->priv;
    @@ -620,7 +620,7 @@ static int saa5249_ioctl(struct inode *inode, struct file *file,

    cmd = vtx_fix_command(cmd);
    mutex_lock(&t->lock);
    - err = video_usercopy(inode,file,cmd,arg,do_saa5249_ioctl);
    + err = video_usercopy(file,cmd,arg,do_saa5249_ioctl);
    mutex_unlock(&t->lock);
    return err;
    }
    @@ -700,7 +700,7 @@ static const struct file_operations saa_fops = {
    .owner = THIS_MODULE,
    .open = saa5249_open,
    .release = saa5249_release,
    - .ioctl = saa5249_ioctl,
    + .unlocked_ioctl = saa5249_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c
    index 1314522..a768f70 100644
    --- a/drivers/media/video/saa7134/saa7134-empress.c
    +++ b/drivers/media/video/saa7134/saa7134-empress.c
    @@ -339,7 +339,7 @@ static const struct file_operations ts_fops =
    .read = ts_read,
    .poll = ts_poll,
    .mmap = ts_mmap,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .llseek = no_llseek,
    };

    diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c
    index 48e1a01..abdd5c3 100644
    --- a/drivers/media/video/saa7134/saa7134-video.c
    +++ b/drivers/media/video/saa7134/saa7134-video.c
    @@ -2322,7 +2322,7 @@ static const struct file_operations video_fops =
    .read = video_read,
    .poll = video_poll,
    .mmap = video_mmap,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .compat_ioctl = v4l_compat_ioctl32,
    .llseek = no_llseek,
    };
    @@ -2332,7 +2332,7 @@ static const struct file_operations radio_fops =
    .owner = THIS_MODULE,
    .open = video_open,
    .release = video_release,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .compat_ioctl = v4l_compat_ioctl32,
    .llseek = no_llseek,
    };
    diff --git a/drivers/media/video/se401.c b/drivers/media/video/se401.c
    index 1cd6293..f02fdc0 100644
    --- a/drivers/media/video/se401.c
    +++ b/drivers/media/video/se401.c
    @@ -1133,10 +1133,10 @@ static int se401_do_ioctl(struct inode *inode, struct file *file,
    return 0;
    }

    -static int se401_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long se401_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg)
    {
    - return video_usercopy(inode, file, cmd, arg, se401_do_ioctl);
    + return video_usercopy(file, cmd, arg, se401_do_ioctl);
    }

    static ssize_t se401_read(struct file *file, char __user *buf,
    @@ -1223,7 +1223,7 @@ static const struct file_operations se401_fops = {
    .release = se401_close,
    .read = se401_read,
    .mmap = se401_mmap,
    - .ioctl = se401_ioctl,
    + .unlocked_ioctl = se401_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/sn9c102/sn9c102_core.c b/drivers/media/video/sn9c102/sn9c102_core.c
    index 5748b1e..fa6eaef 100644
    --- a/drivers/media/video/sn9c102/sn9c102_core.c
    +++ b/drivers/media/video/sn9c102/sn9c102_core.c
    @@ -3082,8 +3082,8 @@ sn9c102_vidioc_s_audio(struct sn9c102_device* cam, void __user * arg)
    }


    -static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp,
    - unsigned int cmd, void __user * arg)
    +static long sn9c102_ioctl_v4l2(struct file* filp, unsigned int cmd,
    + void __user * arg)
    {
    struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));

    @@ -3186,8 +3186,8 @@ static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp,
    }


    -static int sn9c102_ioctl(struct inode* inode, struct file* filp,
    - unsigned int cmd, unsigned long arg)
    +static long sn9c102_ioctl(struct file* filp, unsigned int cmd,
    + unsigned long arg)
    {
    struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
    int err = 0;
    @@ -3210,8 +3210,9 @@ static int sn9c102_ioctl(struct inode* inode, struct file* filp,

    V4LDBG(3, "sn9c102", cmd);

    - err = sn9c102_ioctl_v4l2(inode, filp, cmd, (void __user *)arg);
    -
    + lock_kernel();
    + err = sn9c102_ioctl_v4l2(filp, cmd, (void __user *)arg);
    + unlock_kernel();
    mutex_unlock(&cam->fileop_mutex);

    return err;
    @@ -3223,7 +3224,7 @@ static const struct file_operations sn9c102_fops = {
    .owner = THIS_MODULE,
    .open = sn9c102_open,
    .release = sn9c102_release,
    - .ioctl = sn9c102_ioctl,
    + .unlocked_ioctl = sn9c102_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c
    index a1b9244..2f6ede2 100644
    --- a/drivers/media/video/soc_camera.c
    +++ b/drivers/media/video/soc_camera.c
    @@ -334,7 +334,7 @@ static struct file_operations soc_camera_fops = {
    .owner = THIS_MODULE,
    .open = soc_camera_open,
    .release = soc_camera_close,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .read = soc_camera_read,
    .mmap = soc_camera_mmap,
    .poll = soc_camera_poll,
    diff --git a/drivers/media/video/stk-webcam.c b/drivers/media/video/stk-webcam.c
    index 9276ed9..bd32c58 100644
    --- a/drivers/media/video/stk-webcam.c
    +++ b/drivers/media/video/stk-webcam.c
    @@ -1313,7 +1313,7 @@ static struct file_operations v4l_stk_fops = {
    .read = v4l_stk_read,
    .poll = v4l_stk_poll,
    .mmap = v4l_stk_mmap,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/stradis.c b/drivers/media/video/stradis.c
    index c109511..3ad0f39 100644
    --- a/drivers/media/video/stradis.c
    +++ b/drivers/media/video/stradis.c
    @@ -1274,11 +1274,11 @@ static void make_clip_tab(struct saa7146 *saa, struct video_clip *cr, int ncr)
    clip_draw_rectangle(clipmap, 0, 0, 1024, -saa->win.y);
    }

    -static int saa_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long argl)
    +static long saa_ioctl(struct file *file, unsigned int cmd, unsigned long argl)
    {
    struct saa7146 *saa = file->private_data;
    void __user *arg = (void __user *)argl;
    + long ret;

    switch (cmd) {
    case VIDIOCGCAP:
    @@ -1301,6 +1301,7 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    case VIDIOCGPICT:
    {
    struct video_picture p = saa->picture;
    + lock_kernel();
    if (saa->win.depth == 8)
    p.palette = VIDEO_PALETTE_HI240;
    if (saa->win.depth == 15)
    @@ -1311,6 +1312,7 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    p.palette = VIDEO_PALETTE_RGB24;
    if (saa->win.depth == 32)
    p.palette = VIDEO_PALETTE_RGB32;
    + unlock_kernel();
    if (copy_to_user(arg, &p, sizeof(p)))
    return -EFAULT;
    return 0;
    @@ -1321,6 +1323,7 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    u32 format;
    if (copy_from_user(&p, arg, sizeof(p)))
    return -EFAULT;
    + lock_kernel();
    if (p.palette < ARRAY_SIZE(palette2fmt)) {
    format = palette2fmt[p.palette];
    saa->win.color_fmt = format;
    @@ -1336,6 +1339,7 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    SAA7146_MC2_UPLD_HPS_V) << 16) |
    SAA7146_MC2_UPLD_HPS_H |
    SAA7146_MC2_UPLD_HPS_V, SAA7146_MC2);
    + unlock_kernel();
    return 0;
    }
    case VIDIOCSWIN:
    @@ -1359,6 +1363,7 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    i = vw.x - i;
    vw.width -= i;
    }
    + lock_kernel();
    saa->win.x = vw.x;
    saa->win.y = vw.y;
    saa->win.width = vw.width;
    @@ -1376,6 +1381,7 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    /* stop capture */
    saawrite((SAA7146_MC1_TR_E_1 << 16), SAA7146_MC1);
    saa7146_set_winsize(saa);
    + unlock_kernel();

    /*
    * Do any clips.
    @@ -1400,6 +1406,7 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    } else /* nothing clipped */
    memset(saa->dmavid2, 0, VIDEO_CLIPMAP_SIZE);

    + lock_kernel();
    make_clip_tab(saa, vcp, vw.clipcount);
    if (vw.clipcount > 0)
    vfree(vcp);
    @@ -1409,15 +1416,18 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    saawrite(((SAA7146_MC1_TR_E_1 |
    SAA7146_MC1_TR_E_2) << 16) | 0xffff,
    SAA7146_MC1);
    + unlock_kernel();
    return 0;
    }
    case VIDIOCGWIN:
    {
    struct video_window vw;
    + lock_kernel();
    vw.x = saa->win.x;
    vw.y = saa->win.y;
    vw.width = saa->win.width;
    vw.height = saa->win.height;
    + unlock_kernel();
    vw.chromakey = 0;
    vw.flags = 0;
    if (copy_to_user(arg, &vw, sizeof(vw)))
    @@ -1430,27 +1440,35 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    if (copy_from_user(&v, arg, sizeof(v)))
    return -EFAULT;
    if (v == 0) {
    + lock_kernel();
    saa->cap &= ~1;
    saawrite((SAA7146_MC1_TR_E_1 << 16),
    SAA7146_MC1);
    + unlock_kernel();
    } else {
    + lock_kernel();
    if (saa->win.vidadr == 0 || saa->win.width == 0
    - || saa->win.height == 0)
    + || saa->win.height == 0) {
    + unlock_kernel();
    return -EINVAL;
    + }
    saa->cap |= 1;
    saawrite((SAA7146_MC1_TR_E_1 << 16) | 0xffff,
    SAA7146_MC1);
    + unlock_kernel();
    }
    return 0;
    }
    case VIDIOCGFBUF:
    {
    struct video_buffer v;
    + lock_kernel();
    v.base = (void *)saa->win.vidadr;
    v.height = saa->win.sheight;
    v.width = saa->win.swidth;
    v.depth = saa->win.depth;
    v.bytesperline = saa->win.bpl;
    + unlock_kernel();
    if (copy_to_user(arg, &v, sizeof(v)))
    return -EFAULT;
    return 0;
    @@ -1467,6 +1485,7 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    v.depth != 24 && v.depth != 32 && v.width > 16 &&
    v.height > 16 && v.bytesperline > 16)
    return -EINVAL;
    + lock_kernel();
    if (v.base)
    saa->win.vidadr = (unsigned long)v.base;
    saa->win.sheight = v.height;
    @@ -1479,6 +1498,7 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    "bpl %d\n", v.base, v.width, v.height,
    saa->win.bpp, saa->win.bpl));
    saa7146_set_winsize(saa);
    + unlock_kernel();
    return 0;
    }
    case VIDIOCKEY:
    @@ -1490,7 +1510,9 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    case VIDIOCGAUDIO:
    {
    struct video_audio v;
    + lock_kernel();
    v = saa->audio_dev;
    + unlock_kernel();
    v.flags &= ~(VIDEO_AUDIO_MUTE | VIDEO_AUDIO_MUTABLE);
    v.flags |= VIDEO_AUDIO_MUTABLE | VIDEO_AUDIO_VOLUME;
    strcpy(v.name, "MPEG");
    @@ -1505,6 +1527,7 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    int i;
    if (copy_from_user(&v, arg, sizeof(v)))
    return -EFAULT;
    + lock_kernel();
    i = (~(v.volume >> 8)) & 0xff;
    if (!HaveCS4341) {
    if (v.flags & VIDEO_AUDIO_MUTE)
    @@ -1526,13 +1549,16 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    cs4341_setlevel(saa, i, i);
    }
    saa->audio_dev = v;
    + unlock_kernel();
    return 0;
    }

    case VIDIOCGUNIT:
    {
    struct video_unit vu;
    + lock_kernel();
    vu.video = saa->video_dev.minor;
    + unlock_kernel();
    vu.vbi = VIDEO_NO_UNIT;
    vu.radio = VIDEO_NO_UNIT;
    vu.audio = VIDEO_NO_UNIT;
    @@ -1552,15 +1578,20 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    if (pmode.p1 != VIDEO_MODE_NTSC &&
    pmode.p1 != VIDEO_MODE_PAL)
    return -EINVAL;
    + lock_kernel();
    set_out_format(saa, pmode.p1);
    + unlock_kernel();
    return 0;
    case VID_PLAY_GENLOCK:
    + lock_kernel();
    debiwrite(saa, debNormal, XILINX_CTL0,
    pmode.p1 ? 0x8000 : 0x8080, 2);
    if (NewCard)
    set_genlock_offset(saa, pmode.p2);
    + unlock_kernel();
    return 0;
    case VID_PLAY_NORMAL:
    + lock_kernel();
    debiwrite(saa, debNormal,
    IBM_MP2_CHIP_CONTROL, ChipControl, 2);
    ibm_send_command(saa, IBM_MP2_PLAY, 0, 0);
    @@ -1570,6 +1601,7 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    /* IBM removed the PAUSE command */
    /* they say use SINGLE_FRAME now */
    case VID_PLAY_SINGLE_FRAME:
    + lock_kernel();
    ibm_send_command(saa, IBM_MP2_SINGLE_FRAME,0,0);
    if (saa->playmode == pmode.mode) {
    debiwrite(saa, debNormal,
    @@ -1577,25 +1609,33 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    ChipControl, 2);
    }
    saa->playmode = pmode.mode;
    + unlock_kernel();
    return 0;
    case VID_PLAY_FAST_FORWARD:
    + lock_kernel();
    ibm_send_command(saa, IBM_MP2_FAST_FORWARD,0,0);
    saa->playmode = pmode.mode;
    + unlock_kernel();
    return 0;
    case VID_PLAY_SLOW_MOTION:
    + lock_kernel();
    ibm_send_command(saa, IBM_MP2_SLOW_MOTION,
    pmode.p1, 0);
    saa->playmode = pmode.mode;
    + unlock_kernel();
    return 0;
    case VID_PLAY_IMMEDIATE_NORMAL:
    + lock_kernel();
    /* ensure transfers resume */
    debiwrite(saa, debNormal,
    IBM_MP2_CHIP_CONTROL, ChipControl, 2);
    ibm_send_command(saa, IBM_MP2_IMED_NORM_PLAY,
    0, 0);
    saa->playmode = VID_PLAY_NORMAL;
    + unlock_kernel();
    return 0;
    case VID_PLAY_SWITCH_CHANNELS:
    + lock_kernel();
    saa->audhead = saa->audtail = 0;
    saa->vidhead = saa->vidtail = 0;
    ibm_send_command(saa, IBM_MP2_FREEZE_FRAME,0,1);
    @@ -1609,29 +1649,39 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    ChipControl, 2);
    ibm_send_command(saa, IBM_MP2_PLAY, 0, 0);
    saa->playmode = VID_PLAY_NORMAL;
    + unlock_kernel();
    return 0;
    case VID_PLAY_FREEZE_FRAME:
    + lock_kernel();
    ibm_send_command(saa, IBM_MP2_FREEZE_FRAME,0,0);
    saa->playmode = pmode.mode;
    + unlock_kernel();
    return 0;
    case VID_PLAY_STILL_MODE:
    + lock_kernel();
    ibm_send_command(saa, IBM_MP2_SET_STILL_MODE,
    0, 0);
    saa->playmode = pmode.mode;
    + unlock_kernel();
    return 0;
    case VID_PLAY_MASTER_MODE:
    + lock_kernel();
    if (pmode.p1 == VID_PLAY_MASTER_NONE)
    saa->boardcfg[1] = 0x13;
    else if (pmode.p1 == VID_PLAY_MASTER_VIDEO)
    saa->boardcfg[1] = 0x23;
    else if (pmode.p1 == VID_PLAY_MASTER_AUDIO)
    saa->boardcfg[1] = 0x43;
    - else
    + else {
    + unlock_kernel();
    return -EINVAL;
    + }
    debiwrite(saa, debNormal,
    IBM_MP2_CHIP_CONTROL, ChipControl, 2);
    + unlock_kernel();
    return 0;
    case VID_PLAY_ACTIVE_SCANLINES:
    + lock_kernel();
    if (CurrentMode == VIDEO_MODE_PAL) {
    if (pmode.p1 < 1 || pmode.p2 > 625)
    return -EINVAL;
    @@ -1646,23 +1696,35 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    (pmode.p2 / 2) - 4) & 0xff;
    }
    set_out_format(saa, CurrentMode);
    + unlock_kernel();
    case VID_PLAY_RESET:
    - return do_ibm_reset(saa);
    + lock_kernel();
    + ret = do_ibm_reset(saa);
    + unlock_kernel();
    + return ret;
    +
    case VID_PLAY_END_MARK:
    + lock_kernel();
    + ret = 0;
    if (saa->endmarktail < saa->endmarkhead) {
    if (saa->endmarkhead -
    saa->endmarktail < 2)
    - return -ENOSPC;
    + ret = -ENOSPC;
    } else if (saa->endmarkhead <=saa->endmarktail){
    if (saa->endmarktail - saa->endmarkhead
    > (MAX_MARKS - 2))
    - return -ENOSPC;
    + ret = -ENOSPC;
    } else
    - return -ENOSPC;
    - saa->endmark[saa->endmarktail] = saa->audtail;
    - saa->endmarktail++;
    - if (saa->endmarktail >= MAX_MARKS)
    - saa->endmarktail = 0;
    + ret = -ENOSPC;
    + if (ret == 0) {
    + saa->endmark[saa->endmarktail] =
    + saa->audtail;
    + saa->endmarktail++;
    + if (saa->endmarktail >= MAX_MARKS)
    + saa->endmarktail = 0;
    + }
    + unlock_kernel();
    + return ret;
    }
    return -EINVAL;
    }
    @@ -1676,7 +1738,9 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    mode == VID_WRITE_CC ||
    mode == VID_WRITE_TTX ||
    mode == VID_WRITE_OSD) {
    + lock_kernel();
    saa->writemode = mode;
    + unlock_kernel();
    return 0;
    }
    return -EINVAL;
    @@ -1686,6 +1750,8 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    struct video_code ucode;
    __u8 *udata;
    int i;
    + if (!capable(CAP_SYS_RAWIO))
    + return -EPERM;
    if (copy_from_user(&ucode, arg, sizeof(ucode)))
    return -EFAULT;
    if (ucode.datasize > 65536 || ucode.datasize < 1024 ||
    @@ -1698,11 +1764,13 @@ static int saa_ioctl(struct inode *inode, struct file *file,
    return -EFAULT;
    }
    ucode.data = udata;
    + lock_kernel();
    if (!strncmp(ucode.loadwhat, "decoder.aud", 11) ||
    !strncmp(ucode.loadwhat, "decoder.vid", 11))
    i = initialize_ibmmpeg2(&ucode);
    else
    i = initialize_fpga(&ucode);
    + unlock_kernel();
    vfree(udata);
    if (i)
    return -EINVAL;
    @@ -1905,7 +1973,7 @@ static const struct file_operations saa_fops = {
    .owner = THIS_MODULE,
    .open = saa_open,
    .release = saa_release,
    - .ioctl = saa_ioctl,
    + .unlocked_ioctl = saa_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/stv680.c b/drivers/media/video/stv680.c
    index d7f130b..2d38d76 100644
    --- a/drivers/media/video/stv680.c
    +++ b/drivers/media/video/stv680.c
    @@ -1295,10 +1295,10 @@ static int stv680_do_ioctl (struct inode *inode, struct file *file,
    return 0;
    }

    -static int stv680_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long stv680_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg)
    {
    - return video_usercopy(inode, file, cmd, arg, stv680_do_ioctl);
    + return video_usercopy(file, cmd, arg, stv680_do_ioctl);
    }

    static int stv680_mmap (struct file *file, struct vm_area_struct *vma)
    @@ -1393,7 +1393,7 @@ static const struct file_operations stv680_fops = {
    .release = stv_close,
    .read = stv680_read,
    .mmap = stv680_mmap,
    - .ioctl = stv680_ioctl,
    + .unlocked_ioctl = stv680_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/usbvideo/usbvideo.c b/drivers/media/video/usbvideo/usbvideo.c
    index 4128ee2..b48a8fb 100644
    --- a/drivers/media/video/usbvideo/usbvideo.c
    +++ b/drivers/media/video/usbvideo/usbvideo.c
    @@ -41,8 +41,8 @@ module_param(video_nr, int, 0);
    static void usbvideo_Disconnect(struct usb_interface *intf);
    static void usbvideo_CameraRelease(struct uvd *uvd);

    -static int usbvideo_v4l_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg);
    +static long usbvideo_v4l_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg);
    static int usbvideo_v4l_mmap(struct file *file, struct vm_area_struct *vma);
    static int usbvideo_v4l_open(struct inode *inode, struct file *file);
    static ssize_t usbvideo_v4l_read(struct file *file, char __user *buf,
    @@ -945,7 +945,7 @@ static const struct file_operations usbvideo_fops = {
    .release =usbvideo_v4l_close,
    .read = usbvideo_v4l_read,
    .mmap = usbvideo_v4l_mmap,
    - .ioctl = usbvideo_v4l_ioctl,
    + .unlocked_ioctl = usbvideo_v4l_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    @@ -1477,10 +1477,10 @@ static int usbvideo_v4l_do_ioctl(struct inode *inode, struct file *file,
    return 0;
    }

    -static int usbvideo_v4l_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long usbvideo_v4l_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg)
    {
    - return video_usercopy(inode, file, cmd, arg, usbvideo_v4l_do_ioctl);
    + return video_usercopy(file, cmd, arg, usbvideo_v4l_do_ioctl);
    }

    /*
    diff --git a/drivers/media/video/usbvideo/vicam.c b/drivers/media/video/usbvideo/vicam.c
    index 17f542d..e7cd160 100644
    --- a/drivers/media/video/usbvideo/vicam.c
    +++ b/drivers/media/video/usbvideo/vicam.c
    @@ -504,8 +504,8 @@ set_camera_power(struct vicam_camera *cam, int state)
    return 0;
    }

    -static int
    -vicam_ioctl(struct inode *inode, struct file *file, unsigned int ioctlnr, unsigned long arg)
    +static long
    +vicam_ioctl(struct file *file, unsigned int ioctlnr, unsigned long arg)
    {
    void __user *user_arg = (void __user *)arg;
    struct vicam_camera *cam = file->private_data;
    @@ -600,10 +600,11 @@ vicam_ioctl(struct inode *inode, struct file *file, unsigned int ioctlnr, unsign
    break;
    }

    + lock_kernel();
    DBG("VIDIOCSPICT depth = %d, pal = %d\n", vp.depth,
    vp.palette);
    -
    cam->gain = vp.brightness >> 8;
    + unlock_kernel();

    if (vp.depth != 24
    || vp.palette != VIDEO_PALETTE_RGB24)
    @@ -648,7 +649,7 @@ vicam_ioctl(struct inode *inode, struct file *file, unsigned int ioctlnr, unsign
    DBG("VIDIOCSWIN %d x %d\n", vw.width, vw.height);

    if ( vw.width != 320 || vw.height != 240 )
    - retval = -EFAULT;
    + retval = -EINVAL;

    break;
    }
    @@ -706,11 +707,12 @@ vicam_ioctl(struct inode *inode, struct file *file, unsigned int ioctlnr, unsign
    break;
    }
    DBG("VIDIOCSYNC: %d\n", frame);
    -
    + lock_kernel();
    read_frame(cam, frame);
    vicam_decode_color(cam->raw_image,
    cam->framebuf +
    frame * VICAM_MAX_FRAME_SIZE );
    + unlock_kernel();

    break;
    }
    @@ -737,7 +739,7 @@ vicam_ioctl(struct inode *inode, struct file *file, unsigned int ioctlnr, unsign
    retval = -EINVAL;
    break;
    default:
    - retval = -ENOIOCTLCMD;
    + retval = -ENOTTY;
    break;
    }

    @@ -1059,7 +1061,7 @@ static const struct file_operations vicam_fops = {
    .release = vicam_close,
    .read = vicam_read,
    .mmap = vicam_mmap,
    - .ioctl = vicam_ioctl,
    + .unlocked_ioctl = vicam_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/usbvision/usbvision-video.c b/drivers/media/video/usbvision/usbvision-video.c
    index d97261a..3a7453f 100644
    --- a/drivers/media/video/usbvision/usbvision-video.c
    +++ b/drivers/media/video/usbvision/usbvision-video.c
    @@ -1376,10 +1376,10 @@ static int usbvision_do_vbi_ioctl(struct inode *inode, struct file *file,
    return -ENOIOCTLCMD;
    }

    -static int usbvision_vbi_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long usbvision_vbi_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg)
    {
    - return video_usercopy(inode, file, cmd, arg, usbvision_do_vbi_ioctl);
    + return video_usercopy(file, cmd, arg, usbvision_do_vbi_ioctl);
    }


    @@ -1394,7 +1394,7 @@ static const struct file_operations usbvision_fops = {
    .release = usbvision_v4l2_close,
    .read = usbvision_v4l2_read,
    .mmap = usbvision_v4l2_mmap,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .llseek = no_llseek,
    /* .poll = video_poll, */
    .compat_ioctl = v4l_compat_ioctl32,
    @@ -1447,7 +1447,7 @@ static const struct file_operations usbvision_radio_fops = {
    .owner = THIS_MODULE,
    .open = usbvision_radio_open,
    .release = usbvision_radio_close,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .llseek = no_llseek,
    .compat_ioctl = v4l_compat_ioctl32,
    };
    @@ -1483,7 +1483,7 @@ static const struct file_operations usbvision_vbi_fops = {
    .owner = THIS_MODULE,
    .open = usbvision_vbi_open,
    .release = usbvision_vbi_close,
    - .ioctl = usbvision_vbi_ioctl,
    + .unlocked_ioctl = usbvision_vbi_ioctl,
    .llseek = no_llseek,
    .compat_ioctl = v4l_compat_ioctl32,
    };
    diff --git a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c
    index 31e8af0..520aafc 100644
    --- a/drivers/media/video/videodev.c
    +++ b/drivers/media/video/videodev.c
    @@ -36,7 +36,8 @@
    #include <linux/init.h>
    #include <linux/kmod.h>
    #include <linux/slab.h>
    -#include <asm/uaccess.h>
    +#include <linux/smp_lock.h>
    +#include <linux/uaccess.h>
    #include <asm/system.h>

    #define __OLD_VIDIOC_ /* To allow fixing old calls*/
    @@ -556,8 +557,7 @@ video_fix_command(unsigned int cmd)
    /*
    * Obsolete usercopy function - Should be removed soon
    */
    -int
    -video_usercopy(struct inode *inode, struct file *file,
    +long video_usercopy(struct file *file,
    unsigned int cmd, unsigned long arg,
    int (*func)(struct inode *inode, struct file *file,
    unsigned int cmd, void *arg))
    @@ -565,10 +565,11 @@ video_usercopy(struct inode *inode, struct file *file,
    char sbuf[128];
    void *mbuf = NULL;
    void *parg = NULL;
    - int err = -EINVAL;
    + long err = -EINVAL;
    int is_ext_ctrl;
    size_t ctrls_size = 0;
    void __user *user_ptr = NULL;
    + struct inode *inode = file->f_path.dentry->d_inode;

    #ifdef __OLD_VIDIOC_
    cmd = video_fix_command(cmd);
    @@ -621,8 +622,10 @@ video_usercopy(struct inode *inode, struct file *file,
    }
    }

    - /* call driver */
    + /* call driver old style method */
    + lock_kernel();
    err = func(inode, file, cmd, parg);
    + unlock_kernel();
    if (err == -ENOIOCTLCMD)
    err = -EINVAL;
    if (is_ext_ctrl) {
    @@ -1881,8 +1884,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
    return ret;
    }

    -int video_ioctl2 (struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +long video_ioctl2 (struct file *file, unsigned int cmd, unsigned long arg)
    {
    char sbuf[128];
    void *mbuf = NULL;
    @@ -1891,6 +1893,7 @@ int video_ioctl2 (struct inode *inode, struct file *file,
    int is_ext_ctrl;
    size_t ctrls_size = 0;
    void __user *user_ptr = NULL;
    + struct inode *inode = file->f_path.dentry->d_inode;

    #ifdef __OLD_VIDIOC_
    cmd = video_fix_command(cmd);
    @@ -1945,7 +1948,9 @@ int video_ioctl2 (struct inode *inode, struct file *file,
    }

    /* Handles IOCTL */
    + lock_kernel();
    err = __video_do_ioctl(inode, file, cmd, parg);
    + unlock_kernel();
    if (err == -ENOIOCTLCMD)
    err = -EINVAL;
    if (is_ext_ctrl) {
    diff --git a/drivers/media/video/vivi.c b/drivers/media/video/vivi.c
    index 845be18..1a7cd3a 100644
    --- a/drivers/media/video/vivi.c
    +++ b/drivers/media/video/vivi.c
    @@ -1051,7 +1051,7 @@ static const struct file_operations vivi_fops = {
    .release = vivi_close,
    .read = vivi_read,
    .poll = vivi_poll,
    - .ioctl = video_ioctl2, /* V4L2 ioctl handler */
    + .unlocked_ioctl = video_ioctl2, /* V4L2 ioctl handler */
    .compat_ioctl = v4l_compat_ioctl32,
    .mmap = vivi_mmap,
    .llseek = no_llseek,
    diff --git a/drivers/media/video/w9966.c b/drivers/media/video/w9966.c
    index 33f7026..7ea1b64 100644
    --- a/drivers/media/video/w9966.c
    +++ b/drivers/media/video/w9966.c
    @@ -178,8 +178,8 @@ static int w9966_i2c_wbyte(struct w9966_dev* cam, int data);
    static int w9966_i2c_rbyte(struct w9966_dev* cam);
    #endif

    -static int w9966_v4l_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg);
    +static long w9966_v4l_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg);
    static ssize_t w9966_v4l_read(struct file *file, char __user *buf,
    size_t count, loff_t *ppos);

    @@ -187,7 +187,7 @@ static const struct file_operations w9966_fops = {
    .owner = THIS_MODULE,
    .open = video_exclusive_open,
    .release = video_exclusive_release,
    - .ioctl = w9966_v4l_ioctl,
    + .unlocked_ioctl = w9966_v4l_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    @@ -863,10 +863,10 @@ static int w9966_v4l_do_ioctl(struct inode *inode, struct file *file,
    return 0;
    }

    -static int w9966_v4l_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long w9966_v4l_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg)
    {
    - return video_usercopy(inode, file, cmd, arg, w9966_v4l_do_ioctl);
    + return video_usercopy(file, cmd, arg, w9966_v4l_do_ioctl);
    }

    // Capture data
    diff --git a/drivers/media/video/w9968cf.c b/drivers/media/video/w9968cf.c
    index 8405224..1a711a3 100644
    --- a/drivers/media/video/w9968cf.c
    +++ b/drivers/media/video/w9968cf.c
    @@ -402,10 +402,9 @@ static const struct file_operations w9968cf_fops;
    static int w9968cf_open(struct inode*, struct file*);
    static int w9968cf_release(struct inode*, struct file*);
    static int w9968cf_mmap(struct file*, struct vm_area_struct*);
    -static int w9968cf_ioctl(struct inode*, struct file*, unsigned, unsigned long);
    +static long w9968cf_ioctl(struct file*, unsigned, unsigned long);
    static ssize_t w9968cf_read(struct file*, char __user *, size_t, loff_t*);
    -static int w9968cf_v4l_ioctl(struct inode*, struct file*, unsigned int,
    - void __user *);
    +static long w9968cf_v4l_ioctl(struct file*, unsigned int, void __user *);

    /* USB-specific */
    static int w9968cf_start_transfer(struct w9968cf_device*);
    @@ -2884,9 +2883,8 @@ static int w9968cf_mmap(struct file* filp, struct vm_area_struct *vma)
    }


    -static int
    -w9968cf_ioctl(struct inode* inode, struct file* filp,
    - unsigned int cmd, unsigned long arg)
    +static long w9968cf_ioctl(struct file * filp, unsigned int cmd,
    + unsigned long arg)
    {
    struct w9968cf_device* cam;
    int err;
    @@ -2907,16 +2905,16 @@ w9968cf_ioctl(struct inode* inode, struct file* filp,
    mutex_unlock(&cam->fileop_mutex);
    return -EIO;
    }
    -
    - err = w9968cf_v4l_ioctl(inode, filp, cmd, (void __user *)arg);
    -
    + lock_kernel();
    + err = w9968cf_v4l_ioctl(filp, cmd, (void __user *)arg);
    + unlock_kernel();
    mutex_unlock(&cam->fileop_mutex);
    return err;
    }


    -static int w9968cf_v4l_ioctl(struct inode* inode, struct file* filp,
    - unsigned int cmd, void __user * arg)
    +static long w9968cf_v4l_ioctl(struct file* filp, unsigned int cmd,
    + void __user * arg)
    {
    struct w9968cf_device* cam;
    const char* v4l1_ioctls[] = {
    @@ -3460,7 +3458,7 @@ static const struct file_operations w9968cf_fops = {
    .open = w9968cf_open,
    .release = w9968cf_release,
    .read = w9968cf_read,
    - .ioctl = w9968cf_ioctl,
    + .unlocked_ioctl = w9968cf_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/zc0301/zc0301_core.c b/drivers/media/video/zc0301/zc0301_core.c
    index 363dd2b..759db81 100644
    --- a/drivers/media/video/zc0301/zc0301_core.c
    +++ b/drivers/media/video/zc0301/zc0301_core.c
    @@ -1793,8 +1793,8 @@ zc0301_vidioc_s_parm(struct zc0301_device* cam, void __user * arg)
    }


    -static int zc0301_ioctl_v4l2(struct inode* inode, struct file* filp,
    - unsigned int cmd, void __user * arg)
    +static long zc0301_ioctl_v4l2(struct file* filp, unsigned int cmd,
    + void __user * arg)
    {
    struct zc0301_device* cam = video_get_drvdata(video_devdata(filp));

    @@ -1888,8 +1888,8 @@ static int zc0301_ioctl_v4l2(struct inode* inode, struct file* filp,
    }


    -static int zc0301_ioctl(struct inode* inode, struct file* filp,
    - unsigned int cmd, unsigned long arg)
    +static long zc0301_ioctl(struct file* filp, unsigned int cmd,
    + unsigned long arg)
    {
    struct zc0301_device* cam = video_get_drvdata(video_devdata(filp));
    int err = 0;
    @@ -1912,7 +1912,9 @@ static int zc0301_ioctl(struct inode* inode, struct file* filp,

    V4LDBG(3, "zc0301", cmd);

    - err = zc0301_ioctl_v4l2(inode, filp, cmd, (void __user *)arg);
    + lock_kernel();
    + err = zc0301_ioctl_v4l2(filp, cmd, (void __user *)arg);
    + unlock_kernel();

    mutex_unlock(&cam->fileop_mutex);

    @@ -1924,7 +1926,7 @@ static const struct file_operations zc0301_fops = {
    .owner = THIS_MODULE,
    .open = zc0301_open,
    .release = zc0301_release,
    - .ioctl = zc0301_ioctl,
    + .unlocked_ioctl = zc0301_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/zoran_driver.c b/drivers/media/video/zoran_driver.c
    index 0134bec..28fe8e3 100644
    --- a/drivers/media/video/zoran_driver.c
    +++ b/drivers/media/video/zoran_driver.c
    @@ -4198,13 +4198,12 @@ zoran_do_ioctl (struct inode *inode,
    }


    -static int
    -zoran_ioctl (struct inode *inode,
    - struct file *file,
    +static long
    +zoran_ioctl (struct file *file,
    unsigned int cmd,
    unsigned long arg)
    {
    - return video_usercopy(inode, file, cmd, arg, zoran_do_ioctl);
    + return video_usercopy(file, cmd, arg, zoran_do_ioctl);
    }

    static unsigned int
    @@ -4631,7 +4630,7 @@ static const struct file_operations zoran_fops = {
    .owner = THIS_MODULE,
    .open = zoran_open,
    .release = zoran_close,
    - .ioctl = zoran_ioctl,
    + .unlocked_ioctl = zoran_ioctl,
    #ifdef CONFIG_COMPAT
    .compat_ioctl = v4l_compat_ioctl32,
    #endif
    diff --git a/drivers/media/video/zr364xx.c b/drivers/media/video/zr364xx.c
    index a0e49dc..15780fa 100644
    --- a/drivers/media/video/zr364xx.c
    +++ b/drivers/media/video/zr364xx.c
    @@ -757,7 +757,7 @@ static const struct file_operations zr364xx_fops = {
    .release = zr364xx_release,
    .read = zr364xx_read,
    .mmap = zr364xx_mmap,
    - .ioctl = video_ioctl2,
    + .unlocked_ioctl = video_ioctl2,
    .llseek = no_llseek,
    };

    diff --git a/drivers/net/tun.c b/drivers/net/tun.c
    index 0ce07a3..0a6e4f0 100644
    --- a/drivers/net/tun.c
    +++ b/drivers/net/tun.c
    @@ -596,8 +596,8 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
    return err;
    }

    -static int tun_chr_ioctl(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg)
    +static long tun_chr_ioctl(struct file *file, unsigned int cmd,
    + unsigned long arg)
    {
    struct tun_struct *tun = file->private_data;
    void __user* argp = (void __user*)arg;
    @@ -633,36 +633,42 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
    switch (cmd) {
    case TUNSETNOCSUM:
    /* Disable/Enable checksum */
    + lock_kernel();
    if (arg)
    tun->flags |= TUN_NOCHECKSUM;
    else
    tun->flags &= ~TUN_NOCHECKSUM;
    -
    + unlock_kernel();
    DBG(KERN_INFO "%s: checksum %s\n",
    tun->dev->name, arg ? "disabled" : "enabled");
    break;

    case TUNSETPERSIST:
    /* Disable/Enable persist mode */
    + lock_kernel();
    if (arg)
    tun->flags |= TUN_PERSIST;
    else
    tun->flags &= ~TUN_PERSIST;
    -
    + unlock_kernel();
    DBG(KERN_INFO "%s: persist %s\n",
    tun->dev->name, arg ? "enabled" : "disabled");
    break;

    case TUNSETOWNER:
    /* Set owner of the device */
    + lock_kernel();
    tun->owner = (uid_t) arg;
    + unlock_kernel();

    DBG(KERN_INFO "%s: owner set to %d\n", tun->dev->name, tun->owner);
    break;

    case TUNSETGROUP:
    /* Set group of the device */
    + lock_kernel();
    tun->group= (gid_t) arg;
    + unlock_kernel();

    DBG(KERN_INFO "%s: group set to %d\n", tun->dev->name, tun->group);
    break;
    @@ -688,12 +694,16 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,

    #ifdef TUN_DEBUG
    case TUNSETDEBUG:
    + lock_kernel();
    tun->debug = arg;
    + unlock_kernel();
    break;
    #endif

    case SIOCGIFFLAGS:
    + lock_kernel();
    ifr.ifr_flags = tun->if_flags;
    + unlock_kernel();
    if (copy_to_user( argp, &ifr, sizeof ifr))
    return -EFAULT;
    return 0;
    @@ -701,15 +711,19 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
    case SIOCSIFFLAGS:
    /** Set the character device's interface flags. Currently only
    * IFF_PROMISC and IFF_ALLMULTI are used. */
    + lock_kernel();
    tun->if_flags = ifr.ifr_flags;
    DBG(KERN_INFO "%s: interface flags 0x%lx\n",
    tun->dev->name, tun->if_flags);
    + unlock_kernel();
    return 0;

    case SIOCGIFHWADDR:
    /* Note: the actual net device's address may be different */
    + lock_kernel();
    memcpy(ifr.ifr_hwaddr.sa_data, tun->dev_addr,
    min(sizeof ifr.ifr_hwaddr.sa_data, sizeof tun->dev_addr));
    + unlock_kernel();
    if (copy_to_user( argp, &ifr, sizeof ifr))
    return -EFAULT;
    return 0;
    @@ -719,6 +733,7 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
    /* try to set the actual net device's hw address */
    int ret;

    + lock_kernel();
    rtnl_lock();
    ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr);
    rtnl_unlock();
    @@ -734,6 +749,7 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
    tun->dev_addr[0], tun->dev_addr[1], tun->dev_addr[2],
    tun->dev_addr[3], tun->dev_addr[4], tun->dev_addr[5]);
    }
    + unlock_kernel();

    return ret;
    }
    @@ -765,7 +781,7 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
    return 0;

    default:
    - return -EINVAL;
    + return -ENOTTY;
    };

    return 0;
    @@ -841,7 +857,7 @@ static const struct file_operations tun_fops = {
    .write = do_sync_write,
    .aio_write = tun_chr_aio_write,
    .poll = tun_chr_poll,
    - .ioctl = tun_chr_ioctl,
    + .unlocked_ioctl = tun_chr_ioctl,
    .open = tun_chr_open,
    .release = tun_chr_close,
    .fasync = tun_chr_fasync
    diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h
    index a807d2f..a08773b 100644
    --- a/include/media/v4l2-dev.h
    +++ b/include/media/v4l2-dev.h
    @@ -344,8 +344,8 @@ void *priv;
    /* Version 2 functions */
    extern int video_register_device(struct video_device *vfd, int type, int nr);
    void video_unregister_device(struct video_device *);
    -extern int video_ioctl2(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg);
    +extern long video_ioctl2(struct file *file, unsigned int cmd,
    + unsigned long arg);

    /* helper functions to alloc / release struct video_device, the
    later can be used for video_device->release() */
    @@ -353,8 +353,8 @@ struct video_device *video_device_alloc(void);
    void video_device_release(struct video_device *vfd);

    /* Include support for obsoleted stuff */
    -extern int video_usercopy(struct inode *inode, struct file *file,
    - unsigned int cmd, unsigned long arg,
    +extern long video_usercopy(struct file *file, unsigned int cmd,
    + unsigned long arg,
    int (*func)(struct inode *inode, struct file *file,
    unsigned int cmd, void *arg));


    \
     
     \ /
      Last update: 2008-05-22 23:53    [W:0.136 / U:59.808 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site