btrfs: dev delete should remove sysfs entry
when we delete the device from the mounted btrfs, we would need its corresponding sysfs enty to be removed as well. Signed-off-by: Anand Jain <Anand.Jain@oracle.com> Reviewed-by: David Sterba <dsterba@suse.cz> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
		
					parent
					
						
							
								9b4eaf43f4
							
						
					
				
			
			
				commit
				
					
						99994cde9c
					
				
			
		
					 3 changed files with 26 additions and 0 deletions
				
			
		|  | @ -605,6 +605,26 @@ static void init_feature_attrs(void) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | int btrfs_kobj_rm_device(struct btrfs_fs_info *fs_info, | ||||||
|  | 		struct btrfs_device *one_device) | ||||||
|  | { | ||||||
|  | 	struct hd_struct *disk; | ||||||
|  | 	struct kobject *disk_kobj; | ||||||
|  | 
 | ||||||
|  | 	if (!fs_info->device_dir_kobj) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	if (one_device) { | ||||||
|  | 		disk = one_device->bdev->bd_part; | ||||||
|  | 		disk_kobj = &part_to_dev(disk)->kobj; | ||||||
|  | 
 | ||||||
|  | 		sysfs_remove_link(fs_info->device_dir_kobj, | ||||||
|  | 						disk_kobj->name); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int btrfs_kobj_add_device(struct btrfs_fs_info *fs_info) | static int btrfs_kobj_add_device(struct btrfs_fs_info *fs_info) | ||||||
| { | { | ||||||
| 	int error = 0; | 	int error = 0; | ||||||
|  |  | ||||||
|  | @ -66,4 +66,6 @@ char *btrfs_printable_features(enum btrfs_feature_set set, u64 flags); | ||||||
| extern const char * const btrfs_feature_set_names[3]; | extern const char * const btrfs_feature_set_names[3]; | ||||||
| extern struct kobj_type space_info_ktype; | extern struct kobj_type space_info_ktype; | ||||||
| extern struct kobj_type btrfs_raid_ktype; | extern struct kobj_type btrfs_raid_ktype; | ||||||
|  | int btrfs_kobj_rm_device(struct btrfs_fs_info *fs_info, | ||||||
|  |                 struct btrfs_device *one_device); | ||||||
| #endif /* _BTRFS_SYSFS_H_ */ | #endif /* _BTRFS_SYSFS_H_ */ | ||||||
|  |  | ||||||
|  | @ -40,6 +40,7 @@ | ||||||
| #include "rcu-string.h" | #include "rcu-string.h" | ||||||
| #include "math.h" | #include "math.h" | ||||||
| #include "dev-replace.h" | #include "dev-replace.h" | ||||||
|  | #include "sysfs.h" | ||||||
| 
 | 
 | ||||||
| static int init_first_rw_device(struct btrfs_trans_handle *trans, | static int init_first_rw_device(struct btrfs_trans_handle *trans, | ||||||
| 				struct btrfs_root *root, | 				struct btrfs_root *root, | ||||||
|  | @ -1680,6 +1681,9 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) | ||||||
| 	if (device->bdev) | 	if (device->bdev) | ||||||
| 		device->fs_devices->open_devices--; | 		device->fs_devices->open_devices--; | ||||||
| 
 | 
 | ||||||
|  | 	/* remove sysfs entry */ | ||||||
|  | 	btrfs_kobj_rm_device(root->fs_info, device); | ||||||
|  | 
 | ||||||
| 	call_rcu(&device->rcu, free_device); | 	call_rcu(&device->rcu, free_device); | ||||||
| 
 | 
 | ||||||
| 	num_devices = btrfs_super_num_devices(root->fs_info->super_copy) - 1; | 	num_devices = btrfs_super_num_devices(root->fs_info->super_copy) - 1; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Anand Jain
				Anand Jain