mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	btrfs: add helper to describe block group flags
Factor out helper that describes block group flags from describe_relocation. The result will not be longer than the given size. Signed-off-by: Anand Jain <anand.jain@oracle.com> Reviewed-by: David Sterba <dsterba@suse.com> [ add comments ] Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
		
							parent
							
								
									9a6f209e36
								
							
						
					
					
						commit
						f89e09cf45
					
				
					 3 changed files with 58 additions and 27 deletions
				
			
		|  | @ -4185,37 +4185,13 @@ static struct reloc_control *alloc_reloc_control(void) | ||||||
| static void describe_relocation(struct btrfs_fs_info *fs_info, | static void describe_relocation(struct btrfs_fs_info *fs_info, | ||||||
| 				struct btrfs_block_group_cache *block_group) | 				struct btrfs_block_group_cache *block_group) | ||||||
| { | { | ||||||
| 	char buf[128];		/* prefixed by a '|' that'll be dropped */ | 	char buf[128] = {'\0'}; | ||||||
| 	u64 flags = block_group->flags; |  | ||||||
| 
 | 
 | ||||||
| 	/* Shouldn't happen */ | 	btrfs_describe_block_groups(block_group->flags, buf, sizeof(buf)); | ||||||
| 	if (!flags) { |  | ||||||
| 		strcpy(buf, "|NONE"); |  | ||||||
| 	} else { |  | ||||||
| 		char *bp = buf; |  | ||||||
| 
 |  | ||||||
| #define DESCRIBE_FLAG(f, d) \ |  | ||||||
| 		if (flags & BTRFS_BLOCK_GROUP_##f) { \ |  | ||||||
| 			bp += snprintf(bp, buf - bp + sizeof(buf), "|%s", d); \ |  | ||||||
| 			flags &= ~BTRFS_BLOCK_GROUP_##f; \ |  | ||||||
| 		} |  | ||||||
| 		DESCRIBE_FLAG(DATA,     "data"); |  | ||||||
| 		DESCRIBE_FLAG(SYSTEM,   "system"); |  | ||||||
| 		DESCRIBE_FLAG(METADATA, "metadata"); |  | ||||||
| 		DESCRIBE_FLAG(RAID0,    "raid0"); |  | ||||||
| 		DESCRIBE_FLAG(RAID1,    "raid1"); |  | ||||||
| 		DESCRIBE_FLAG(DUP,      "dup"); |  | ||||||
| 		DESCRIBE_FLAG(RAID10,   "raid10"); |  | ||||||
| 		DESCRIBE_FLAG(RAID5,    "raid5"); |  | ||||||
| 		DESCRIBE_FLAG(RAID6,    "raid6"); |  | ||||||
| 		if (flags) |  | ||||||
| 			snprintf(bp, buf - bp + sizeof(buf), "|0x%llx", flags); |  | ||||||
| #undef DESCRIBE_FLAG |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	btrfs_info(fs_info, | 	btrfs_info(fs_info, | ||||||
| 		   "relocating block group %llu flags %s", | 		   "relocating block group %llu flags %s", | ||||||
| 		   block_group->key.objectid, buf + 1); | 		   block_group->key.objectid, buf); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
|  | @ -130,6 +130,60 @@ const char *get_raid_name(enum btrfs_raid_types type) | ||||||
| 	return btrfs_raid_array[type].raid_name; | 	return btrfs_raid_array[type].raid_name; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * Fill @buf with textual description of @bg_flags, no more than @size_buf | ||||||
|  |  * bytes including terminating null byte. | ||||||
|  |  */ | ||||||
|  | void btrfs_describe_block_groups(u64 bg_flags, char *buf, u32 size_buf) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 	int ret; | ||||||
|  | 	char *bp = buf; | ||||||
|  | 	u64 flags = bg_flags; | ||||||
|  | 	u32 size_bp = size_buf; | ||||||
|  | 
 | ||||||
|  | 	if (!flags) { | ||||||
|  | 		strcpy(bp, "NONE"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | #define DESCRIBE_FLAG(flag, desc)						\ | ||||||
|  | 	do {								\ | ||||||
|  | 		if (flags & (flag)) {					\ | ||||||
|  | 			ret = snprintf(bp, size_bp, "%s|", (desc));	\ | ||||||
|  | 			if (ret < 0 || ret >= size_bp)			\ | ||||||
|  | 				goto out_overflow;			\ | ||||||
|  | 			size_bp -= ret;					\ | ||||||
|  | 			bp += ret;					\ | ||||||
|  | 			flags &= ~(flag);				\ | ||||||
|  | 		}							\ | ||||||
|  | 	} while (0) | ||||||
|  | 
 | ||||||
|  | 	DESCRIBE_FLAG(BTRFS_BLOCK_GROUP_DATA, "data"); | ||||||
|  | 	DESCRIBE_FLAG(BTRFS_BLOCK_GROUP_SYSTEM, "system"); | ||||||
|  | 	DESCRIBE_FLAG(BTRFS_BLOCK_GROUP_METADATA, "metadata"); | ||||||
|  | 
 | ||||||
|  | 	DESCRIBE_FLAG(BTRFS_AVAIL_ALLOC_BIT_SINGLE, "single"); | ||||||
|  | 	for (i = 0; i < BTRFS_NR_RAID_TYPES; i++) | ||||||
|  | 		DESCRIBE_FLAG(btrfs_raid_array[i].bg_flag, | ||||||
|  | 			      btrfs_raid_array[i].raid_name); | ||||||
|  | #undef DESCRIBE_FLAG | ||||||
|  | 
 | ||||||
|  | 	if (flags) { | ||||||
|  | 		ret = snprintf(bp, size_bp, "0x%llx|", flags); | ||||||
|  | 		size_bp -= ret; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (size_bp < size_buf) | ||||||
|  | 		buf[size_buf - size_bp - 1] = '\0'; /* remove last | */ | ||||||
|  | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * The text is trimmed, it's up to the caller to provide sufficiently | ||||||
|  | 	 * large buffer | ||||||
|  | 	 */ | ||||||
|  | out_overflow:; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int init_first_rw_device(struct btrfs_trans_handle *trans, | static int init_first_rw_device(struct btrfs_trans_handle *trans, | ||||||
| 				struct btrfs_fs_info *fs_info); | 				struct btrfs_fs_info *fs_info); | ||||||
| static int btrfs_relocate_sys_chunks(struct btrfs_fs_info *fs_info); | static int btrfs_relocate_sys_chunks(struct btrfs_fs_info *fs_info); | ||||||
|  |  | ||||||
|  | @ -438,6 +438,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *path); | ||||||
| int btrfs_balance(struct btrfs_fs_info *fs_info, | int btrfs_balance(struct btrfs_fs_info *fs_info, | ||||||
| 		  struct btrfs_balance_control *bctl, | 		  struct btrfs_balance_control *bctl, | ||||||
| 		  struct btrfs_ioctl_balance_args *bargs); | 		  struct btrfs_ioctl_balance_args *bargs); | ||||||
|  | void btrfs_describe_block_groups(u64 flags, char *buf, u32 size_buf); | ||||||
| int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info); | int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info); | ||||||
| int btrfs_recover_balance(struct btrfs_fs_info *fs_info); | int btrfs_recover_balance(struct btrfs_fs_info *fs_info); | ||||||
| int btrfs_pause_balance(struct btrfs_fs_info *fs_info); | int btrfs_pause_balance(struct btrfs_fs_info *fs_info); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Anand Jain
						Anand Jain