btrfs-progs: fix wrong data ratio for raid56 in btrfs-file-usage

When run btrfs-file-usage on a btrfs with data profile raid5/6,
the output message for "Free" & "Data to device ratio" seems wrong
as follows:
    ...
    Device size:		 100.00GiB
    Device allocated:		   2.04GiB
    Device unallocated:		  97.96GiB
    Used:			   1.12MiB
    Free (Estimated):		 197.89GiB <== Free > Device size
    Data to device ratio:	     198 % <== > 100%
    Global reserve:		     0.00B
    ...

It is because the function get_raid56_used() is not iterating the
chunk_info array correctly, it is just repeating adding the first
chunk_info statistics.
Just add a ptr to iterate over the array.

Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
This commit is contained in:
Gui Hecheng 2014-07-24 11:21:52 +08:00 committed by David Sterba
parent 373110d84f
commit b2784b0fa1
1 changed files with 6 additions and 4 deletions

View File

@ -293,14 +293,16 @@ static struct btrfs_ioctl_space_args *load_space_info(int fd, char *path)
static void get_raid56_used(int fd, struct chunk_info *chunks, int chunkcount,
u64 *raid5_used, u64 *raid6_used)
{
struct chunk_info *info_ptr = chunks;
*raid5_used = 0;
*raid6_used = 0;
while (chunkcount-- > 0) {
if (chunks->type & BTRFS_BLOCK_GROUP_RAID5)
(*raid5_used) += chunks->size / (chunks->num_stripes - 1);
if (chunks->type & BTRFS_BLOCK_GROUP_RAID6)
(*raid6_used) += chunks->size / (chunks->num_stripes - 2);
if (info_ptr->type & BTRFS_BLOCK_GROUP_RAID5)
(*raid5_used) += info_ptr->size / (info_ptr->num_stripes - 1);
if (info_ptr->type & BTRFS_BLOCK_GROUP_RAID6)
(*raid6_used) += info_ptr->size / (info_ptr->num_stripes - 2);
info_ptr++;
}
}