@@ -39,24 +39,126 @@ static const char * const filesystem_cmd_group_usage[] = {
};
static const char * const cmd_df_usage[] = {
- "btrfs filesystem df <path>",
+ "btrfs filesystem df [options] <path>",
"Show space usage information for a mount point",
+ "",
+ "-r Use old-style RAID-n terminology",
NULL
};
+#define RAID_NAMES_NEW 0
+#define RAID_NAMES_OLD 1
+
+static int write_raid_name(char* buffer, int size, u64 flags, int old_raid)
+{
+ int copies, stripes, parity;
+ int out;
+ int written = 0;
+
+ if (old_raid == RAID_NAMES_OLD) {
+ if (flags & BTRFS_BLOCK_GROUP_RAID0) {
+ return snprintf(buffer, size, "%s", "RAID0");
+ } else if (flags & BTRFS_BLOCK_GROUP_RAID1) {
+ return snprintf(buffer, size, "%s", "RAID1");
+ } else if (flags & BTRFS_BLOCK_GROUP_DUP) {
+ return snprintf(buffer, size, "%s", "DUP");
+ } else if (flags & BTRFS_BLOCK_GROUP_RAID10) {
+ return snprintf(buffer, size, "%s", "RAID10");
+ } else if (flags & BTRFS_BLOCK_GROUP_RAID5) {
+ return snprintf(buffer, size, "%s", "RAID5");
+ } else if (flags & BTRFS_BLOCK_GROUP_RAID6) {
+ return snprintf(buffer, size, "%s", "RAID6");
+ }
+ return 0;
+ }
+
+ if (flags & (BTRFS_BLOCK_GROUP_RAID1
+ | BTRFS_BLOCK_GROUP_RAID10
+ | BTRFS_BLOCK_GROUP_DUP)) {
+ copies = 2;
+ } else {
+ copies = 1;
+ }
+
+ out = snprintf(buffer, size, "%dC", copies);
+ if (size < out)
+ return written + size;
+ written += out;
+ size -= out;
+
+ if (flags & BTRFS_BLOCK_GROUP_DUP) {
+ out = snprintf(buffer+written, size, "D");
+ if (size < out)
+ return written + size;
+ written += out;
+ size -= out;
+ }
+
+ if (flags & (BTRFS_BLOCK_GROUP_RAID0
+ | BTRFS_BLOCK_GROUP_RAID10
+ | BTRFS_BLOCK_GROUP_RAID5
+ | BTRFS_BLOCK_GROUP_RAID6)) {
+ stripes = -1;
+ } else {
+ stripes = 0;
+ }
+
+ if (stripes == -1) {
+ out = snprintf(buffer+written, size, "mS");
+ } else if (stripes == 0) {
+ out = 0;
+ } else {
+ out = snprintf(buffer+written, size, "%dS", stripes);
+ }
+
+ if (size < out)
+ return written + size;
+ written += out;
+ size -= out;
+
+ if (flags & BTRFS_BLOCK_GROUP_RAID5) {
+ parity = 1;
+ } else if (flags & BTRFS_BLOCK_GROUP_RAID6) {
+ parity = 2;
+ } else {
+ parity = 0;
+ }
+
+ if (parity == 0) {
+ out = 0;
+ } else {
+ out = snprintf(buffer+written, size, "%dP", parity);
+ }
+
+ if (size < out)
+ return written + size;
+ written += out;
+ size -= out;
+
+ return written;
+}
+
static int cmd_df(int argc, char **argv)
{
struct btrfs_ioctl_space_args *sargs, *sargs_orig;
+ int path_start = 1;
u64 count = 0, i;
int ret;
int fd;
int e;
char *path;
+ int old_raid;
- if (check_argc_exact(argc, 2))
+ old_raid = RAID_NAMES_NEW;
+ if (argc > 1 && (!strcmp(argv[1], "--raid") || !strcmp(argv[1], "-r"))) {
+ old_raid = RAID_NAMES_OLD;
+ path_start += 1;
+ }
+
+ if (check_argc_exact(argc, path_start+1))
usage(cmd_df_usage);
- path = argv[1];
+ path = argv[path_start];
fd = open_file_or_dir(path);
if (fd < 0) {
@@ -135,24 +237,15 @@ static int cmd_df(int argc, char **argv)
written += 8;
}
- if (flags & BTRFS_BLOCK_GROUP_RAID0) {
- snprintf(description+written, 8, "%s", ", RAID0");
- written += 7;
- } else if (flags & BTRFS_BLOCK_GROUP_RAID1) {
- snprintf(description+written, 8, "%s", ", RAID1");
- written += 7;
- } else if (flags & BTRFS_BLOCK_GROUP_DUP) {
- snprintf(description+written, 6, "%s", ", DUP");
- written += 5;
- } else if (flags & BTRFS_BLOCK_GROUP_RAID10) {
- snprintf(description+written, 9, "%s", ", RAID10");
- written += 8;
- } else if (flags & BTRFS_BLOCK_GROUP_RAID5) {
- snprintf(description+written, 9, "%s", ", RAID5");
- written += 7;
- } else if (flags & BTRFS_BLOCK_GROUP_RAID6) {
- snprintf(description+written, 9, "%s", ", RAID6");
- written += 7;
+ if((flags & ~(BTRFS_BLOCK_GROUP_DATA
+ | BTRFS_BLOCK_GROUP_SYSTEM
+ | BTRFS_BLOCK_GROUP_METADATA)) != 0) {
+ snprintf(description+written, 3, ", ");
+ written += 2;
+ written += write_raid_name(description+written,
+ sizeof(description)-written,
+ flags,
+ old_raid);
}
total_bytes = pretty_sizes(sargs->spaces[i].total_bytes);
Signed-off-by: Hugo Mills <hugo@carfax.org.uk> --- cmds-filesystem.c | 135 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 114 insertions(+), 21 deletions(-)