mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	btrfs: synchronize incompat feature bits with sysfs files
The files under /sys/fs/UUID/features get out of sync with the actual incompat bits set for the filesystem if they change after mount (eg. the LZO compression). Synchronize the feature bits with the sysfs files representing them right after we set/clear them. Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
		
							parent
							
								
									444e751698
								
							
						
					
					
						commit
						14e46e0495
					
				
					 4 changed files with 17 additions and 0 deletions
				
			
		|  | @ -23,6 +23,7 @@ | |||
| #include "locking.h" | ||||
| #include "free-space-tree.h" | ||||
| #include "transaction.h" | ||||
| #include "sysfs.h" | ||||
| 
 | ||||
| static int __add_block_group_free_space(struct btrfs_trans_handle *trans, | ||||
| 					struct btrfs_fs_info *fs_info, | ||||
|  | @ -1169,6 +1170,9 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info) | |||
| 	} | ||||
| 
 | ||||
| 	btrfs_set_fs_compat_ro(fs_info, FREE_SPACE_TREE); | ||||
| 	btrfs_sysfs_feature_update(fs_info, | ||||
| 		BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE, FEAT_COMPAT_RO); | ||||
| 
 | ||||
| 	fs_info->creating_free_space_tree = 0; | ||||
| 
 | ||||
| 	ret = btrfs_commit_transaction(trans, tree_root); | ||||
|  | @ -1237,6 +1241,9 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) | |||
| 		return PTR_ERR(trans); | ||||
| 
 | ||||
| 	btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE); | ||||
| 	btrfs_sysfs_feature_update(fs_info, | ||||
| 		BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE, FEAT_COMPAT_RO); | ||||
| 
 | ||||
| 	fs_info->free_space_root = NULL; | ||||
| 
 | ||||
| 	ret = clear_free_space_tree(trans, free_space_root); | ||||
|  |  | |||
|  | @ -1455,6 +1455,8 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, | |||
| 
 | ||||
| 	if (range->compress_type == BTRFS_COMPRESS_LZO) { | ||||
| 		btrfs_set_fs_incompat(root->fs_info, COMPRESS_LZO); | ||||
| 		btrfs_sysfs_feature_update(root->fs_info, | ||||
| 			BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO, FEAT_INCOMPAT); | ||||
| 	} | ||||
| 
 | ||||
| 	ret = defrag_count; | ||||
|  | @ -4063,6 +4065,8 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp) | |||
| 	btrfs_free_path(path); | ||||
| 
 | ||||
| 	btrfs_set_fs_incompat(root->fs_info, DEFAULT_SUBVOL); | ||||
| 	btrfs_sysfs_feature_update(root->fs_info, | ||||
| 		BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL, FEAT_INCOMPAT); | ||||
| 	btrfs_end_transaction(trans, root); | ||||
| out: | ||||
| 	mnt_drop_write_file(file); | ||||
|  |  | |||
|  | @ -58,6 +58,7 @@ | |||
| #include "dev-replace.h" | ||||
| #include "free-space-cache.h" | ||||
| #include "backref.h" | ||||
| #include "sysfs.h" | ||||
| #include "tests/btrfs-tests.h" | ||||
| 
 | ||||
| #include "qgroup.h" | ||||
|  | @ -477,6 +478,9 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
| 				btrfs_clear_opt(info->mount_opt, NODATACOW); | ||||
| 				btrfs_clear_opt(info->mount_opt, NODATASUM); | ||||
| 				btrfs_set_fs_incompat(info, COMPRESS_LZO); | ||||
| 				btrfs_sysfs_feature_update(root->fs_info, | ||||
| 					BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO, | ||||
| 					FEAT_INCOMPAT); | ||||
| 			} else if (strncmp(args[0].from, "no", 2) == 0) { | ||||
| 				compress_type = "no"; | ||||
| 				btrfs_clear_opt(info->mount_opt, COMPRESS); | ||||
|  |  | |||
|  | @ -4468,6 +4468,8 @@ static void check_raid56_incompat_flag(struct btrfs_fs_info *info, u64 type) | |||
| 		return; | ||||
| 
 | ||||
| 	btrfs_set_fs_incompat(info, RAID56); | ||||
| 	btrfs_sysfs_feature_update(info, BTRFS_FEATURE_INCOMPAT_RAID56, | ||||
| 		FEAT_INCOMPAT); | ||||
| } | ||||
| 
 | ||||
| #define BTRFS_MAX_DEVS(r) ((BTRFS_LEAF_DATA_SIZE(r)		\ | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 David Sterba
						David Sterba