isdn: Switch to unlocked_ioctl
PATCH 1/1 isdn: Switch to unlocked_ioctl
Push the BKL down into the ISDN drivers ready for eliminating the old ioctl method calls. Would benefit from careful review as the needed changes were quite hairy.
Signed-off-by Alan Cox <[email protected]>
drivers/isdn/capi/capi.c +93 -65
@@ -35,6 +35,7 @@#include <linux/poll.h> #include <linux/capi.h> #include <linux/kernelcapi.h> +#include <linux/smp_lock.h> #include <linux/init.h> #include <linux/device.h> #include <linux/moduleparam.h>
@@ -782,73 +783,86 @@ capi_poll(struct file *file, poll_table * wait)return mask; } -static int -capi_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long capi_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {struct capidev *cdev = file->private_data;struct capi20_appl *ap = &cdev->ap;capi_ioctl_struct data; -int retval = -EINVAL ; +int retval =0 ;void __user *argp = (void __user *)arg; +lock_kernel ();switch (cmd) {case CAPI_REGISTER : { -if (ap->applid) -return -EEXIST ; +if (ap->applid) { + retval = -EEXIST ; +break ; + }if (copy_from_user (&cdev->ap.rparam, argp, -sizeof (struct capi_register_params ))) -return -EFAULT ; +sizeof (struct capi_register_params ))) { + retval = -EFAULT ; +break ; + } cdev->ap.private = cdev; cdev->ap.recv_message = capi_recv_message; cdev->errcode =capi20_register (ap);if (cdev->errcode) { ap->applid =0 ; -return -EIO ; + retval = -EIO ; +break ; } } -return (int )ap->applid; + retval = (int )ap->applid; +break ;case CAPI_GET_VERSION : {if (copy_from_user (&data.contr, argp, -sizeof (data.contr))) -return -EFAULT ; +sizeof (data.contr))) { + retval = -EFAULT ; +break ; + } cdev->errcode =capi20_get_version (data.contr, &data.version);if (cdev->errcode) -return -EIO ; -if (copy_to_user (argp, &data.version, + retval = -EIO ; +else if (copy_to_user (argp, &data.version,sizeof (data.version))) -return -EFAULT ; + retval = -EFAULT ; } -return 0 ; +break ;case CAPI_GET_SERIAL : {if (copy_from_user (&data.contr, argp, -sizeof (data.contr))) -return -EFAULT ; +sizeof (data.contr))) { + retval = -EFAULT ; +break ; + } cdev->errcode =capi20_get_serial (data.contr, data.serial);if (cdev->errcode) -return -EIO ; -if (copy_to_user (argp, data.serial, + retval = -EIO ; +else if (copy_to_user (argp, data.serial,sizeof (data.serial))) -return -EFAULT ; + retval = -EFAULT ; } -return 0 ; +break ;case CAPI_GET_PROFILE : {if (copy_from_user (&data.contr, argp, -sizeof (data.contr))) -return -EFAULT ; +sizeof (data.contr))) { + retval = -EFAULT ; +break ; + }if (data.contr ==0 ) { cdev->errcode =capi20_get_profile (data.contr, &data.profile); -if (cdev->errcode) -return -EIO ; +if (cdev->errcode) { + retval = -EIO ; +break ; + } retval = copy_to_user(argp, &data.profile.ncontroller,
@@ -863,70 +877,77 @@ capi_ioctl(struct inode *inode, struct file *file, sizeof(data.profile)); }if (retval) -return -EFAULT ; + retval = -EFAULT ; } -return 0 ; +break ;case CAPI_GET_MANUFACTURER : {if (copy_from_user (&data.contr, argp, -sizeof (data.contr))) -return -EFAULT ; +sizeof (data.contr))) { + retval = -EFAULT ; +break ; + } cdev->errcode =capi20_get_manufacturer (data.contr, data.manufacturer);if (cdev->errcode) -return -EIO ; - -if (copy_to_user (argp, data.manufacturer, + retval = -EIO ; +else if (copy_to_user (argp, data.manufacturer,sizeof (data.manufacturer))) -return -EFAULT ; + retval = -EFAULT ; } -return 0 ; +break ;case CAPI_GET_ERRCODE : data.errcode = cdev->errcode; cdev->errcode =CAPI_NOERROR ;if (arg) {if (copy_to_user (argp, &data.errcode, -sizeof (data.errcode))) -return -EFAULT ; +sizeof (data.errcode))) { + retval = -EFAULT ; +break ; + } } -return data.errcode; + retval = data.errcode; +break ;case CAPI_INSTALLED : -if (capi20_isinstalled () ==CAPI_NOERROR ) -return 0 ; -return -ENXIO ; +if (capi20_isinstalled () !=CAPI_NOERROR ) + retval = -ENXIO ; +break ;case CAPI_MANUFACTURER_CMD : {struct capi_manufacturer_cmd mcmd;if (!capable (CAP_SYS_ADMIN )) -return -EPERM ; -if (copy_from_user (&mcmd, argp,sizeof (mcmd))) -return -EFAULT ; -return capi20_manufacturer (mcmd.cmd, mcmd.data); + retval = -EPERM ; +else if (copy_from_user (&mcmd, argp,sizeof (mcmd))) + retval = -EFAULT ; +else + retval =capi20_manufacturer (mcmd.cmd, mcmd.data); } -return 0 ; +break ;case CAPI_SET_FLAGS :case CAPI_CLR_FLAGS : {unsigned userflags;if (copy_from_user (&userflags, argp, -sizeof (userflags))) -return -EFAULT ; +sizeof (userflags))) { + retval = -EFAULT ; +break ; + }if (cmd ==CAPI_SET_FLAGS ) cdev->userflags |= userflags;else cdev->userflags &= ~userflags; } -return 0 ; +break ;case CAPI_GET_FLAGS :if (copy_to_user (argp, &cdev->userflags,sizeof (cdev->userflags))) -return -EFAULT ; -return 0 ; + retval = -EFAULT ; +break ;case CAPI_NCCI_OPENCOUNT : {
@@ -936,13 +957,16 @@ capi_ioctl(struct inode *inode, struct file *file,#endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ unsigned ncci;int count =0 ; -if (copy_from_user (&ncci, argp,sizeof (ncci))) -return -EFAULT ; +if (copy_from_user (&ncci, argp,sizeof (ncci))) { + retval = -EFAULT ; +break ; + }mutex_lock (&cdev->ncci_list_mtx);if ((nccip =capincci_find (cdev, (u32 ) ncci)) ==NULL ) {mutex_unlock (&cdev->ncci_list_mtx); -return 0 ; + retval =0 ; +break ; }#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE if ((mp = nccip->minorp) !=NULL ) {
@@ -950,9 +974,9 @@ capi_ioctl(struct inode *inode, struct file *file, }#endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ mutex_unlock (&cdev->ncci_list_mtx); -return count; + retval = count; } -return 0 ; +break ;#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE case CAPI_NCCI_GETUNIT :
@@ -960,24 +984,28 @@ capi_ioctl(struct inode *inode, struct file *file,struct capincci *nccip;struct capiminor *mp;unsigned ncci; -int unit =0 ;if (copy_from_user (&ncci, argp, -sizeof (ncci))) -return -EFAULT ; +sizeof (ncci))) { + retval = -EFAULT ; +break ; + }mutex_lock (&cdev->ncci_list_mtx); nccip =capincci_find (cdev, (u32 ) ncci);if (!nccip || (mp = nccip->minorp) ==NULL ) {mutex_unlock (&cdev->ncci_list_mtx); -return -ESRCH ; + retval = -ESRCH ; +break ; } - unit = mp->minor; + retval = mp->minor;mutex_unlock (&cdev->ncci_list_mtx); -return unit; } -return 0 ; +break ;#endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ +default : + retval = -ENOTTY ; } -return -EINVAL ; +unlock_kernel (); +return retval; } static int
@@ -1010,7 +1038,7 @@ static const struct file_operations capi_fops = .read = capi_read, .write = capi_write, .poll = capi_poll, - .ioctl = capi_ioctl, + .unlocked_ioctl = capi_ioctl, .open = capi_open, .release = capi_release, };
drivers/isdn/divert/divert_procfs.c +57 -30
144 lines not on this page · raw message
drivers/isdn/i4l/isdn_common.c +129 -41
433 lines not on this page · raw message