forked from mirrors/linux
		
	binder: Add default binder devices through binderfs when configured
Currently, since each binderfs instance needs its own private binder devices, every time a binderfs instance is mounted, all the default binder devices need to be created via the BINDER_CTL_ADD IOCTL. This patch aims to add a solution to automatically create the default binder devices for each binderfs instance that gets mounted. To achieve this goal, when CONFIG_ANDROID_BINDERFS is set, the default binder devices specified by CONFIG_ANDROID_BINDER_DEVICES are created in each binderfs instance instead of global devices being created by the binder driver. Co-developed-by: Christian Brauner <christian.brauner@ubuntu.com> Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com> Signed-off-by: Hridya Valsaraju <hridya@google.com> Reviewed-by: Joel Fernandes (Google) <joel@joelfernandes.org> Link: https://lore.kernel.org/r/20190808222727.132744-2-hridya@google.com Link: https://lore.kernel.org/r/20190904110704.8606-2-christian.brauner@ubuntu.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									028fb5822b
								
							
						
					
					
						commit
						ca2864c6e8
					
				
					 3 changed files with 25 additions and 5 deletions
				
			
		|  | @ -122,7 +122,7 @@ static uint32_t binder_debug_mask = BINDER_DEBUG_USER_ERROR | | |||
| 	BINDER_DEBUG_FAILED_TRANSACTION | BINDER_DEBUG_DEAD_TRANSACTION; | ||||
| module_param_named(debug_mask, binder_debug_mask, uint, 0644); | ||||
| 
 | ||||
| static char *binder_devices_param = CONFIG_ANDROID_BINDER_DEVICES; | ||||
| char *binder_devices_param = CONFIG_ANDROID_BINDER_DEVICES; | ||||
| module_param_named(devices, binder_devices_param, charp, 0444); | ||||
| 
 | ||||
| static DECLARE_WAIT_QUEUE_HEAD(binder_user_error_wait); | ||||
|  | @ -6131,7 +6131,8 @@ static int __init binder_init(void) | |||
| 				    &transaction_log_fops); | ||||
| 	} | ||||
| 
 | ||||
| 	if (strcmp(binder_devices_param, "") != 0) { | ||||
| 	if (!IS_ENABLED(CONFIG_ANDROID_BINDERFS) && | ||||
| 	    strcmp(binder_devices_param, "") != 0) { | ||||
| 		/*
 | ||||
| 		* Copy the module_parameter string, because we don't want to | ||||
| 		* tokenize it in-place. | ||||
|  |  | |||
|  | @ -37,6 +37,8 @@ struct binder_device { | |||
| 
 | ||||
| extern const struct file_operations binder_fops; | ||||
| 
 | ||||
| extern char *binder_devices_param; | ||||
| 
 | ||||
| #ifdef CONFIG_ANDROID_BINDERFS | ||||
| extern bool is_binderfs_device(const struct inode *inode); | ||||
| #else | ||||
|  |  | |||
|  | @ -186,8 +186,7 @@ static int binderfs_binder_device_create(struct inode *ref_inode, | |||
| 	req->major = MAJOR(binderfs_dev); | ||||
| 	req->minor = minor; | ||||
| 
 | ||||
| 	ret = copy_to_user(userp, req, sizeof(*req)); | ||||
| 	if (ret) { | ||||
| 	if (userp && copy_to_user(userp, req, sizeof(*req))) { | ||||
| 		ret = -EFAULT; | ||||
| 		goto err; | ||||
| 	} | ||||
|  | @ -467,6 +466,9 @@ static int binderfs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 	int ret; | ||||
| 	struct binderfs_info *info; | ||||
| 	struct inode *inode = NULL; | ||||
| 	struct binderfs_device device_info = { 0 }; | ||||
| 	const char *name; | ||||
| 	size_t len; | ||||
| 
 | ||||
| 	sb->s_blocksize = PAGE_SIZE; | ||||
| 	sb->s_blocksize_bits = PAGE_SHIFT; | ||||
|  | @ -521,7 +523,22 @@ static int binderfs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 	if (!sb->s_root) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	return binderfs_binder_ctl_create(sb); | ||||
| 	ret = binderfs_binder_ctl_create(sb); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	name = binder_devices_param; | ||||
| 	for (len = strcspn(name, ","); len > 0; len = strcspn(name, ",")) { | ||||
| 		strscpy(device_info.name, name, len + 1); | ||||
| 		ret = binderfs_binder_device_create(inode, NULL, &device_info); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 		name += len; | ||||
| 		if (*name == ',') | ||||
| 			name++; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct dentry *binderfs_mount(struct file_system_type *fs_type, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Hridya Valsaraju
						Hridya Valsaraju