Signed-off-by: Hugo Mills <h...@carfax.org.uk> --- cmds-filesystem.c | 135 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 114 insertions(+), 21 deletions(-)
diff --git a/cmds-filesystem.c b/cmds-filesystem.c index 2210020..8ecc21a 100644 --- a/cmds-filesystem.c +++ b/cmds-filesystem.c @@ -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); -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html