btrfs-progs: subvolume: add quota info to btrfs sub show

This patch reports on the first-level qgroup, if any, associated with
a particular subvolume.  It displays the usage and limit, subject
to the usual unit parameters.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Jeff Mahoney 2017-10-23 17:09:27 -04:00 committed by David Sterba
parent 1ebfc031cb
commit f114e65591
1 changed files with 50 additions and 1 deletions

View File

@ -918,6 +918,7 @@ static const char * const cmd_subvol_show_usage[] = {
"Show more information about the subvolume (UUIDs, generations, times, snapshots)", "Show more information about the subvolume (UUIDs, generations, times, snapshots)",
"-r|--rootid rootid of the subvolume", "-r|--rootid rootid of the subvolume",
"-u|--uuid uuid of the subvolume", "-u|--uuid uuid of the subvolume",
HELPINFO_UNITS_SHORT_LONG,
"", "",
"If no option is specified, subvolume at <path> will be shown, otherwise", "If no option is specified, subvolume at <path> will be shown, otherwise",
"the rootid or uuid are resolved relative to the <path>.", "the rootid or uuid are resolved relative to the <path>.",
@ -940,6 +941,13 @@ static int cmd_subvol_show(int argc, char **argv)
struct btrfs_util_subvolume_info subvol; struct btrfs_util_subvolume_info subvol;
char *subvol_path = NULL; char *subvol_path = NULL;
enum btrfs_util_error err; enum btrfs_util_error err;
struct btrfs_qgroup_stats stats;
unsigned int unit_mode;
const char *referenced_size;
const char *referenced_limit_size = "-";
unsigned int field_width = 0;
unit_mode = get_unit_mode_from_arg(&argc, argv, 1);
optind = 0; optind = 0;
while (1) { while (1) {
@ -1110,7 +1118,48 @@ static int cmd_subvol_show(int argc, char **argv)
} }
btrfs_util_destroy_subvolume_iterator(iter); btrfs_util_destroy_subvolume_iterator(iter);
ret = 0; ret = btrfs_qgroup_query(fd, subvol.id, &stats);
if (ret && ret != -ENOTTY && ret != -ENODATA) {
fprintf(stderr,
"\nERROR: BTRFS_IOC_QUOTA_QUERY failed: %s\n",
strerror(-ret));
goto out;
}
printf("\tQuota Usage:\t\t");
fflush(stdout);
if (ret) {
if (ret == -ENOTTY)
printf("quotas not enabled\n");
else
printf("quotas not available\n");
goto out;
}
referenced_size = pretty_size_mode(stats.info.referenced, unit_mode);
if (stats.limit.max_referenced)
referenced_limit_size = pretty_size_mode(
stats.limit.max_referenced,
unit_mode);
field_width = max(strlen(referenced_size),
strlen(referenced_limit_size));
printf("%-*s referenced, %s exclusive\n ", field_width,
referenced_size,
pretty_size_mode(stats.info.exclusive, unit_mode));
printf("\tQuota Limits:\t\t");
if (stats.limit.max_referenced || stats.limit.max_exclusive) {
const char *excl = "-";
if (stats.limit.max_exclusive)
excl = pretty_size_mode(stats.limit.max_exclusive,
unit_mode);
printf("%-*s referenced, %s exclusive\n", field_width,
referenced_limit_size, excl);
} else
printf("None\n");
out: out:
free(subvol_path); free(subvol_path);
close_file_or_dir(fd, dirstream1); close_file_or_dir(fd, dirstream1);