[media] media: Add 64--32 bit compat ioctl handler
Provide an ioctl handler for 32-bit binaries on 64-bit systems. Signed-off-by: Sakari Ailus <sakari.ailus@iki.fi> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Tested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
		
					parent
					
						
							
								cab3e1ffbe
							
						
					
				
			
			
				commit
				
					
						c6c1d50b51
					
				
			
		
					 2 changed files with 29 additions and 3 deletions
				
			
		|  | @ -116,19 +116,41 @@ static unsigned int media_poll(struct file *filp, | |||
| 	return mdev->fops->poll(filp, poll); | ||||
| } | ||||
| 
 | ||||
| static long media_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||||
| static long | ||||
| __media_ioctl(struct file *filp, unsigned int cmd, unsigned long arg, | ||||
| 	      long (*ioctl_func)(struct file *filp, unsigned int cmd, | ||||
| 				 unsigned long arg)) | ||||
| { | ||||
| 	struct media_devnode *mdev = media_devnode_data(filp); | ||||
| 
 | ||||
| 	if (!mdev->fops->ioctl) | ||||
| 	if (!ioctl_func) | ||||
| 		return -ENOTTY; | ||||
| 
 | ||||
| 	if (!media_devnode_is_registered(mdev)) | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	return mdev->fops->ioctl(filp, cmd, arg); | ||||
| 	return ioctl_func(filp, cmd, arg); | ||||
| } | ||||
| 
 | ||||
| static long media_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||||
| { | ||||
| 	struct media_devnode *mdev = media_devnode_data(filp); | ||||
| 
 | ||||
| 	return __media_ioctl(filp, cmd, arg, mdev->fops->ioctl); | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_COMPAT | ||||
| 
 | ||||
| static long media_compat_ioctl(struct file *filp, unsigned int cmd, | ||||
| 			       unsigned long arg) | ||||
| { | ||||
| 	struct media_devnode *mdev = media_devnode_data(filp); | ||||
| 
 | ||||
| 	return __media_ioctl(filp, cmd, arg, mdev->fops->compat_ioctl); | ||||
| } | ||||
| 
 | ||||
| #endif /* CONFIG_COMPAT */ | ||||
| 
 | ||||
| /* Override for the open function */ | ||||
| static int media_open(struct inode *inode, struct file *filp) | ||||
| { | ||||
|  | @ -188,6 +210,9 @@ static const struct file_operations media_devnode_fops = { | |||
| 	.write = media_write, | ||||
| 	.open = media_open, | ||||
| 	.unlocked_ioctl = media_ioctl, | ||||
| #ifdef CONFIG_COMPAT | ||||
| 	.compat_ioctl = media_compat_ioctl, | ||||
| #endif /* CONFIG_COMPAT */ | ||||
| 	.release = media_release, | ||||
| 	.poll = media_poll, | ||||
| 	.llseek = no_llseek, | ||||
|  |  | |||
|  | @ -46,6 +46,7 @@ struct media_file_operations { | |||
| 	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); | ||||
| 	unsigned int (*poll) (struct file *, struct poll_table_struct *); | ||||
| 	long (*ioctl) (struct file *, unsigned int, unsigned long); | ||||
| 	long (*compat_ioctl) (struct file *, unsigned int, unsigned long); | ||||
| 	int (*open) (struct file *); | ||||
| 	int (*release) (struct file *); | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Sakari Ailus
				Sakari Ailus