Skip to contentSkip to conversation

isdn: Switch to unlocked_ioctl

PATCH New Alan Cox 1 participant 1 message May 22, 2008

lore
Share & tools
lore

Alan Cox

author
#0 lore raw

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.

drivers/isdn/capi/capi.c +93 -65
index 6ca0bb9..f2a2e8a 100644
@@ -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