btrfs-progs: enable negative numbers for unallocated device space

The unallocated space is not calculated correctly when a device
deltion/replace is in progress. This appears as huge number, EiB-sized.
It's really a negative number, because we don't have entire information
available and mixing numbers that do and don't take the deleted device
size into account.

We have to query search ioctl to retrieve the missing information, also
this requires root access for the ioctl, so we still need a workaround
for non-root case. Here the negative numbers seem to be a bit more
practical than EiB numbers.

Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
David Sterba 2017-01-03 18:26:43 +01:00
parent 72ae343f77
commit f49fb67a25
1 changed files with 8 additions and 6 deletions

View File

@ -471,7 +471,7 @@ static int print_filesystem_usage_overall(int fd, struct chunk_info *chunkinfo,
printf(" Device allocated:\t\t%*s\n", width, printf(" Device allocated:\t\t%*s\n", width,
pretty_size_mode(r_total_chunks, unit_mode)); pretty_size_mode(r_total_chunks, unit_mode));
printf(" Device unallocated:\t\t%*s\n", width, printf(" Device unallocated:\t\t%*s\n", width,
pretty_size_mode(r_total_unused, unit_mode)); pretty_size_mode(r_total_unused, unit_mode | UNITS_NEGATIVE));
printf(" Device missing:\t\t%*s\n", width, printf(" Device missing:\t\t%*s\n", width,
pretty_size_mode(r_total_missing, unit_mode)); pretty_size_mode(r_total_missing, unit_mode));
printf(" Used:\t\t\t%*s\n", width, printf(" Used:\t\t\t%*s\n", width,
@ -736,8 +736,8 @@ static void _cmd_filesystem_usage_tabular(unsigned unit_mode,
unused = get_partition_size(device_info_ptr[i].path) unused = get_partition_size(device_info_ptr[i].path)
- total_allocated; - total_allocated;
table_printf(matrix, unallocated_col, vhdr_skip + i, table_printf(matrix, unallocated_col, vhdr_skip + i, ">%s",
">%s", pretty_size_mode(unused, unit_mode)); pretty_size_mode(unused, unit_mode | UNITS_NEGATIVE));
total_unused += unused; total_unused += unused;
} }
@ -771,7 +771,8 @@ static void _cmd_filesystem_usage_tabular(unsigned unit_mode,
} }
table_printf(matrix, unallocated_col, vhdr_skip + device_info_count + 1, table_printf(matrix, unallocated_col, vhdr_skip + device_info_count + 1,
">%s", pretty_size_mode(total_unused, unit_mode)); ">%s",
pretty_size_mode(total_unused, unit_mode | UNITS_NEGATIVE));
table_printf(matrix, 1, vhdr_skip + device_info_count + 2, "<Used"); table_printf(matrix, 1, vhdr_skip + device_info_count + 2, "<Used");
for (i = 0, col = spaceinfos_col; i < sargs->total_spaces; i++) { for (i = 0, col = spaceinfos_col; i < sargs->total_spaces; i++) {
@ -884,7 +885,7 @@ static void _cmd_filesystem_usage_linear(unsigned unit_mode,
printf("Unallocated:\n"); printf("Unallocated:\n");
print_unused(info_ptr, info_count, device_info_ptr, device_info_count, print_unused(info_ptr, info_count, device_info_ptr, device_info_count,
unit_mode); unit_mode | UNITS_NEGATIVE);
} }
static int print_filesystem_usage_by_chunk(int fd, static int print_filesystem_usage_by_chunk(int fd,
@ -1027,7 +1028,8 @@ void print_device_chunks(int fd, struct device_info *devinfo,
} }
printf(" Unallocated: %*s%10s\n", printf(" Unallocated: %*s%10s\n",
(int)(20 - strlen("Unallocated")), "", (int)(20 - strlen("Unallocated")), "",
pretty_size_mode(devinfo->size - allocated, unit_mode)); pretty_size_mode(devinfo->size - allocated,
unit_mode | UNITS_NEGATIVE));
} }
void print_device_sizes(int fd, struct device_info *devinfo, unsigned unit_mode) void print_device_sizes(int fd, struct device_info *devinfo, unsigned unit_mode)