void print_device_chunks(int fd, struct device_info *devinfo, struct chunk_info *chunks_info_ptr, int chunks_info_count, unsigned unit_mode) { int i; u64 allocated = 0; for (i = 0 ; i < chunks_info_count ; i++) { const char *description; const char *r_mode; u64 flags; u64 size; if (chunks_info_ptr[i].devid != devinfo->devid) continue; flags = chunks_info_ptr[i].type; description = btrfs_group_type_str(flags); r_mode = btrfs_group_profile_str(flags); size = calc_chunk_size(chunks_info_ptr+i); printf(" %s,%s:%*s%10s\n", description, r_mode, (int)(20 - strlen(description) - strlen(r_mode)), "", pretty_size_mode(size, unit_mode)); allocated += size; } printf(" Unallocated: %*s%10s\n", (int)(20 - strlen("Unallocated")), "", pretty_size_mode(devinfo->size - allocated, unit_mode)); }
/* * This function print the results of the command "btrfs fi usage" * in linear format */ static void _cmd_filesystem_usage_linear(unsigned unit_mode, struct btrfs_ioctl_space_args *sargs, struct chunk_info *info_ptr, int info_count, struct device_info *device_info_ptr, int device_info_count) { int i; for (i = 0; i < sargs->total_spaces; i++) { const char *description; const char *r_mode; u64 flags = sargs->spaces[i].flags; if (flags & BTRFS_SPACE_INFO_GLOBAL_RSV) continue; description = btrfs_group_type_str(flags); r_mode = btrfs_group_profile_str(flags); printf("%s,%s: Size:%s, ", description, r_mode, pretty_size_mode(sargs->spaces[i].total_bytes, unit_mode)); printf("Used:%s\n", pretty_size_mode(sargs->spaces[i].used_bytes, unit_mode)); print_chunk_device(flags, info_ptr, info_count, device_info_ptr, device_info_count, unit_mode); printf("\n"); } printf("Unallocated:\n"); print_unused(info_ptr, info_count, device_info_ptr, device_info_count, unit_mode); }
/* * This function print the results of the command "btrfs fi usage" * in tabular format */ static void _cmd_filesystem_usage_tabular(unsigned unit_mode, struct btrfs_ioctl_space_args *sargs, struct chunk_info *chunks_info_ptr, int chunks_info_count, struct device_info *device_info_ptr, int device_info_count) { int i; u64 total_unused = 0; struct string_table *matrix = 0; int ncols, nrows; ncols = sargs->total_spaces + 2; nrows = 2 + 1 + device_info_count + 1 + 2; matrix = table_create(ncols, nrows); if (!matrix) { fprintf(stderr, "ERROR: not enough memory\n"); return; } /* header */ for (i = 0; i < sargs->total_spaces; i++) { const char *description; u64 flags = sargs->spaces[i].flags; if (flags & BTRFS_SPACE_INFO_GLOBAL_RSV) continue; description = btrfs_group_type_str(flags); table_printf(matrix, 1+i, 0, "<%s", description); } for (i = 0; i < sargs->total_spaces; i++) { const char *r_mode; u64 flags = sargs->spaces[i].flags; r_mode = btrfs_group_profile_str(flags); table_printf(matrix, 1+i, 1, "<%s", r_mode); } table_printf(matrix, 1+sargs->total_spaces, 1, "<Unallocated"); /* body */ for (i = 0; i < device_info_count; i++) { int k, col; char *p; u64 total_allocated = 0, unused; p = strrchr(device_info_ptr[i].path, '/'); if (!p) p = device_info_ptr[i].path; else p++; table_printf(matrix, 0, i + 3, "<%s", device_info_ptr[i].path); for (col = 1, k = 0 ; k < sargs->total_spaces ; k++) { u64 flags = sargs->spaces[k].flags; u64 devid = device_info_ptr[i].devid; int j; u64 size = 0; for (j = 0 ; j < chunks_info_count ; j++) { if (chunks_info_ptr[j].type != flags ) continue; if (chunks_info_ptr[j].devid != devid) continue; size += calc_chunk_size(chunks_info_ptr+j); } if (size) table_printf(matrix, col, i+3, ">%s", pretty_size_mode(size, unit_mode)); else table_printf(matrix, col, i+3, ">-"); total_allocated += size; col++; } unused = get_partition_size(device_info_ptr[i].path) - total_allocated; table_printf(matrix, sargs->total_spaces + 1, i + 3, ">%s", pretty_size_mode(unused, unit_mode)); total_unused += unused; } for (i = 0; i <= sargs->total_spaces; i++) table_printf(matrix, i + 1, device_info_count + 3, "="); /* footer */ table_printf(matrix, 0, device_info_count + 4, "<Total"); for (i = 0; i < sargs->total_spaces; i++) table_printf(matrix, 1 + i, device_info_count + 4, ">%s", pretty_size_mode(sargs->spaces[i].total_bytes, unit_mode)); table_printf(matrix, sargs->total_spaces + 1, device_info_count + 4, ">%s", pretty_size_mode(total_unused, unit_mode)); table_printf(matrix, 0, device_info_count + 5, "<Used"); for (i = 0; i < sargs->total_spaces; i++) table_printf(matrix, 1 + i, device_info_count+5, ">%s", pretty_size_mode(sargs->spaces[i].used_bytes, unit_mode)); table_dump(matrix); table_free(matrix); }
/* * This function print the results of the command "btrfs fi usage" * in tabular format */ static void _cmd_filesystem_usage_tabular(unsigned unit_mode, struct btrfs_ioctl_space_args *sargs, struct chunk_info *chunks_info_ptr, int chunks_info_count, struct device_info *device_info_ptr, int device_info_count) { int i; u64 total_unused = 0; struct string_table *matrix = NULL; int ncols, nrows; int col; int unallocated_col; int spaceinfos_col; const int vhdr_skip = 3; /* amount of vertical header space */ /* id, path, unallocated */ ncols = 3; spaceinfos_col = 2; /* Properly count the real space infos */ for (i = 0; i < sargs->total_spaces; i++) { if (sargs->spaces[i].flags & BTRFS_SPACE_INFO_GLOBAL_RSV) continue; ncols++; } /* 2 for header, empty line, devices, ===, total, used */ nrows = vhdr_skip + device_info_count + 1 + 2; matrix = table_create(ncols, nrows); if (!matrix) { error("not enough memory"); return; } /* * We have to skip the global block reserve everywhere as it's an * artificial blockgroup */ /* header */ for (i = 0, col = spaceinfos_col; i < sargs->total_spaces; i++) { u64 flags = sargs->spaces[i].flags; if (flags & BTRFS_SPACE_INFO_GLOBAL_RSV) continue; table_printf(matrix, col, 0, "<%s", btrfs_group_type_str(flags)); table_printf(matrix, col, 1, "<%s", btrfs_group_profile_str(flags)); col++; } unallocated_col = col; table_printf(matrix, 0, 1, "<Id"); table_printf(matrix, 1, 1, "<Path"); table_printf(matrix, unallocated_col, 1, "<Unallocated"); /* body */ for (i = 0; i < device_info_count; i++) { int k; char *p; u64 total_allocated = 0, unused; p = strrchr(device_info_ptr[i].path, '/'); if (!p) p = device_info_ptr[i].path; else p++; table_printf(matrix, 0, vhdr_skip + i, ">%llu", device_info_ptr[i].devid); table_printf(matrix, 1, vhdr_skip + i, "<%s", device_info_ptr[i].path); for (col = spaceinfos_col, k = 0; k < sargs->total_spaces; k++) { u64 flags = sargs->spaces[k].flags; u64 devid = device_info_ptr[i].devid; int j; u64 size = 0; if (flags & BTRFS_SPACE_INFO_GLOBAL_RSV) continue; for (j = 0 ; j < chunks_info_count ; j++) { if (chunks_info_ptr[j].type != flags ) continue; if (chunks_info_ptr[j].devid != devid) continue; size += calc_chunk_size(chunks_info_ptr+j); } if (size) table_printf(matrix, col, vhdr_skip+ i, ">%s", pretty_size_mode(size, unit_mode)); else table_printf(matrix, col, vhdr_skip + i, ">-"); total_allocated += size; col++; } unused = get_partition_size(device_info_ptr[i].path) - total_allocated; table_printf(matrix, unallocated_col, vhdr_skip + i, ">%s", pretty_size_mode(unused, unit_mode)); total_unused += unused; } for (i = 0; i < spaceinfos_col; i++) { table_printf(matrix, i, vhdr_skip - 1, "*-"); table_printf(matrix, i, vhdr_skip + device_info_count, "*-"); } for (i = 0, col = spaceinfos_col; i < sargs->total_spaces; i++) { if (sargs->spaces[i].flags & BTRFS_SPACE_INFO_GLOBAL_RSV) continue; table_printf(matrix, col, vhdr_skip - 1, "*-"); table_printf(matrix, col, vhdr_skip + device_info_count, "*-"); col++; } /* One for Unallocated */ table_printf(matrix, col, vhdr_skip - 1, "*-"); table_printf(matrix, col, vhdr_skip + device_info_count, "*-"); /* footer */ table_printf(matrix, 1, vhdr_skip + device_info_count + 1, "<Total"); for (i = 0, col = spaceinfos_col; i < sargs->total_spaces; i++) { if (sargs->spaces[i].flags & BTRFS_SPACE_INFO_GLOBAL_RSV) continue; table_printf(matrix, col++, vhdr_skip + device_info_count + 1, ">%s", pretty_size_mode(sargs->spaces[i].total_bytes, unit_mode)); } table_printf(matrix, unallocated_col, vhdr_skip + device_info_count + 1, ">%s", pretty_size_mode(total_unused, unit_mode)); table_printf(matrix, 1, vhdr_skip + device_info_count + 2, "<Used"); for (i = 0, col = spaceinfos_col; i < sargs->total_spaces; i++) { if (sargs->spaces[i].flags & BTRFS_SPACE_INFO_GLOBAL_RSV) continue; table_printf(matrix, col++, vhdr_skip + device_info_count + 2, ">%s", pretty_size_mode(sargs->spaces[i].used_bytes, unit_mode)); } table_dump(matrix); table_free(matrix); }