static int cmd_device_usage(int argc, char **argv) { unsigned unit_mode; int ret = 0; int i; unit_mode = get_unit_mode_from_arg(&argc, argv, 1); clean_args_no_options(argc, argv, cmd_device_usage_usage); if (check_argc_min(argc - optind, 1)) usage(cmd_device_usage_usage); for (i = optind; i < argc; i++) { int fd; DIR *dirstream = NULL; if (i > 1) printf("\n"); fd = btrfs_open_dir(argv[i], &dirstream, 1); if (fd < 0) { ret = 1; break; } ret = _cmd_device_usage(fd, argv[i], unit_mode); close_file_or_dir(fd, dirstream); if (ret) break; } return !!ret; }
static int cmd_qgroup_show(int argc, char **argv) { char *path; int ret = 0; int fd; int e; DIR *dirstream = NULL; u64 qgroupid; int filter_flag = 0; unsigned unit_mode; struct btrfs_qgroup_comparer_set *comparer_set; struct btrfs_qgroup_filter_set *filter_set; filter_set = btrfs_qgroup_alloc_filter_set(); comparer_set = btrfs_qgroup_alloc_comparer_set(); unit_mode = get_unit_mode_from_arg(&argc, argv, 0); optind = 1; while (1) { int c; static const struct option long_options[] = { {"sort", required_argument, NULL, 'S'}, { NULL, 0, NULL, 0 } }; c = getopt_long(argc, argv, "pcreFf", long_options, NULL); if (c < 0) break; switch (c) { case 'p': btrfs_qgroup_setup_print_column( BTRFS_QGROUP_PARENT); break; case 'c': btrfs_qgroup_setup_print_column( BTRFS_QGROUP_CHILD); break; case 'r': btrfs_qgroup_setup_print_column( BTRFS_QGROUP_MAX_RFER); break; case 'e': btrfs_qgroup_setup_print_column( BTRFS_QGROUP_MAX_EXCL); break; case 'F': filter_flag |= 0x1; break; case 'f': filter_flag |= 0x2; break; case 'S': ret = btrfs_qgroup_parse_sort_string(optarg, &comparer_set); if (ret) usage(cmd_qgroup_show_usage); break; default: usage(cmd_qgroup_show_usage); } } btrfs_qgroup_setup_units(unit_mode); if (check_argc_exact(argc - optind, 1)) usage(cmd_qgroup_show_usage); path = argv[optind]; fd = btrfs_open_dir(path, &dirstream, 1); if (fd < 0) { btrfs_qgroup_free_filter_set(filter_set); btrfs_qgroup_free_comparer_set(comparer_set); return 1; } if (filter_flag) { qgroupid = btrfs_get_path_rootid(fd); if (filter_flag & 0x1) btrfs_qgroup_setup_filter(&filter_set, BTRFS_QGROUP_FILTER_ALL_PARENT, qgroupid); if (filter_flag & 0x2) btrfs_qgroup_setup_filter(&filter_set, BTRFS_QGROUP_FILTER_PARENT, qgroupid); } ret = btrfs_show_qgroups(fd, filter_set, comparer_set); e = errno; close_file_or_dir(fd, dirstream); if (ret < 0) error("can't list qgroups: %s", strerror(e)); return !!ret; }
int cmd_filesystem_usage(int argc, char **argv) { int ret = 0; unsigned unit_mode; int i; int more_than_one = 0; int tabular = 0; unit_mode = get_unit_mode_from_arg(&argc, argv, 1); optind = 1; while (1) { int c; c = getopt(argc, argv, "T"); if (c < 0) break; switch (c) { case 'T': tabular = 1; break; default: usage(cmd_filesystem_usage_usage); } } if (check_argc_min(argc - optind, 1)) usage(cmd_filesystem_usage_usage); for (i = optind; i < argc; i++) { int fd; DIR *dirstream = NULL; struct chunk_info *chunkinfo = NULL; struct device_info *devinfo = NULL; int chunkcount = 0; int devcount = 0; fd = open_file_or_dir(argv[i], &dirstream); if (fd < 0) { fprintf(stderr, "ERROR: can't access '%s'\n", argv[i]); ret = 1; goto out; } if (more_than_one) printf("\n"); ret = load_chunk_and_device_info(fd, &chunkinfo, &chunkcount, &devinfo, &devcount); if (ret) goto cleanup; ret = print_filesystem_usage_overall(fd, chunkinfo, chunkcount, devinfo, devcount, argv[i], unit_mode); if (ret) goto cleanup; printf("\n"); ret = print_filesystem_usage_by_chunk(fd, chunkinfo, chunkcount, devinfo, devcount, argv[i], unit_mode, tabular); cleanup: close_file_or_dir(fd, dirstream); free(chunkinfo); free(devinfo); if (ret) goto out; more_than_one = 1; } out: return !!ret; }