Skip to content

Commit

Permalink
btrfs-progs: Add btrfs device disk-usage command
Browse files Browse the repository at this point in the history
Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it>
Signed-off-by: David Sterba <dsterba@suse.cz>
  • Loading branch information
kreijack authored and kdave committed Dec 4, 2014
1 parent 9002666 commit 330903d
Show file tree
Hide file tree
Showing 3 changed files with 142 additions and 0 deletions.
3 changes: 3 additions & 0 deletions cmds-device.c
Expand Up @@ -28,6 +28,7 @@
#include "ctree.h"
#include "ioctl.h"
#include "utils.h"
#include "cmds-fi-disk_usage.h"

#include "commands.h"

Expand Down Expand Up @@ -456,6 +457,8 @@ const struct cmd_group device_cmd_group = {
{ "scan", cmd_scan_dev, cmd_scan_dev_usage, NULL, 0 },
{ "ready", cmd_ready_dev, cmd_ready_dev_usage, NULL, 0 },
{ "stats", cmd_dev_stats, cmd_dev_stats_usage, NULL, 0 },
{ "disk-usage", cmd_device_disk_usage,
cmd_device_disk_usage_usage, NULL, 0 },
NULL_CMD_STRUCT
}
};
Expand Down
136 changes: 136 additions & 0 deletions cmds-fi-disk_usage.c
Expand Up @@ -942,3 +942,139 @@ int cmd_filesystem_disk_usage(int argc, char **argv)

return 0;
}

static void print_disk_chunks(int fd,
u64 devid,
u64 total_size,
struct chunk_info *chunks_info_ptr,
int chunks_info_count,
int 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 != 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)), "",
df_pretty_sizes(size, mode));

allocated += size;

}
printf(" Unallocated: %*s%10s\n",
(int)(20 - strlen("Unallocated")), "",
df_pretty_sizes(total_size - allocated, mode));

}

static int _cmd_device_disk_usage(int fd, char *path, int mode)
{
int i;
int ret = 0;
int info_count = 0;
struct chunk_info *info_ptr = 0;
struct disk_info *disks_info_ptr = 0;
int disks_info_count = 0;

if (load_chunk_info(fd, &info_ptr, &info_count) ||
load_disks_info(fd, &disks_info_ptr, &disks_info_count)) {
ret = -1;
goto exit;
}

for (i = 0 ; i < disks_info_count ; i++) {
printf("%s\t%10s\n", disks_info_ptr[i].path,
df_pretty_sizes(disks_info_ptr[i].size, mode));

print_disk_chunks(fd, disks_info_ptr[i].devid,
disks_info_ptr[i].size,
info_ptr, info_count,
mode);
printf("\n");

}


exit:

if (disks_info_ptr)
free(disks_info_ptr);
if (info_ptr)
free(info_ptr);

return ret;
}

const char * const cmd_device_disk_usage_usage[] = {
"btrfs device disk-usage [-b] <path> [<path>..]",
"Show which chunks are in a device.",
"",
"-b\tSet byte as unit",
NULL
};

int cmd_device_disk_usage(int argc, char **argv)
{

int flags = DF_HUMAN_UNIT;
int i, more_than_one = 0;

optind = 1;
while (1) {
char c = getopt(argc, argv, "b");

if (c < 0)
break;

switch (c) {
case 'b':
flags &= ~DF_HUMAN_UNIT;
break;
default:
usage(cmd_device_disk_usage_usage);
}
}

if (check_argc_min(argc - optind, 1)) {
usage(cmd_device_disk_usage_usage);
return 21;
}

for (i = optind; i < argc ; i++) {
int r, fd;
DIR *dirstream = NULL;
if (more_than_one)
printf("\n");

fd = open_file_or_dir(argv[i], &dirstream);
if (fd < 0) {
fprintf(stderr, "ERROR: can't access to '%s'\n",
argv[1]);
return 12;
}
r = _cmd_device_disk_usage(fd, argv[i], flags);
close_file_or_dir(fd, dirstream);

if (r)
return r;
more_than_one = 1;

}

return 0;
}
3 changes: 3 additions & 0 deletions cmds-fi-disk_usage.h
Expand Up @@ -25,4 +25,7 @@ int cmd_filesystem_df(int argc, char **argv);
extern const char * const cmd_filesystem_disk_usage_usage[];
int cmd_filesystem_disk_usage(int argc, char **argv);

extern const char * const cmd_device_disk_usage_usage[];
int cmd_device_disk_usage(int argc, char **argv);

#endif

0 comments on commit 330903d

Please sign in to comment.