btrfs-progs: mkfs: print the summary
authorGoffredo Baroncelli <kreijack@inwind.it>
Mon, 8 Jun 2015 11:00:50 +0000 (13:00 +0200)
committerDavid Sterba <dsterba@suse.cz>
Mon, 8 Jun 2015 15:50:47 +0000 (17:50 +0200)
This patch prints the summary of the filesystem after the creation.
The main fileds printed are:
- devices list with their uuid, devid, path and size
- raid profile (dup,single,raid0...)
- leafsize/nodesize/sectorsize
- filesystem features (raid56, extref, mixed-bg)
- chunk size and type

If the '-v' switched is passed, the output is more verbose; if the '-q'
switched is passed, only the errors are printed.

Below an example:

BTRFS filesystem summary:
  Label:                btrfs-test
  UUID:                 14ae8a88-98ac-4f22-8441-79f76ec622f7

  Node size:            4096
  Leaf size:            4096
  Sector size:          4096
  Initial chunks:
    Data+Metadata:      9.01GiB
    System:             18.06MiB
  Metadata profile:     RAID5
  Data profile:         RAID5
  Mixed mode:           YES
  SSD detected:         NO
  Incompat features:    mixed-bg, extref, raid56
  Number of devices:    10
    UUID                                  ID    SIZE    PATH
    ------------------------------------  --  --------- -----------
    df1c7f50-1980-4da2-8bc9-7ee6ffb0b554   1   50.00GiB /dev/vdb
    32c808a0-cd7b-4497-a2c0-1d77a9854af9   2   50.00GiB /dev/vdc
    3159782e-d108-40bc-9e15-090ecac160b4   3   50.00GiB /dev/vdd
    db7eaf0c-beb8-4093-a9d0-b9c25c146305   4   50.00GiB /dev/vde
    c367ca04-1f71-49c0-a331-11fc0b87e9fc   5   50.00GiB /dev/vdf
    e9b73c86-4058-4b3a-90ac-18741a276e70   6   50.00GiB /dev/vdg
    c4298b7a-ad41-4690-bf10-bf748b319413   7   50.00GiB /dev/vdh
    1cf048c8-af8a-4225-b09a-5d12e9b217fa   8    2.00GiB /dev/vdi
    7e157869-768a-4725-bad5-82e6bd05fd17   9    2.00GiB /dev/vdj
    2c9431ac-c7f0-45a5-8529-cef8cf6e4033  10    2.00GiB /dev/vdk

  Total devices size:                         356.01GiB

Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it>
Signed-off-by: David Sterba <dsterba@suse.cz>
mkfs.c

diff --git a/mkfs.c b/mkfs.c
index 10481b87fef33f7ac11b640bfa0ed95f24efbcb0..6cff69f41778976c1343230414c1aad13f731786 100644 (file)
--- a/mkfs.c
+++ b/mkfs.c
@@ -1132,13 +1132,43 @@ static int is_ssd(const char *file)
        return !atoi((const char *)&rotational);
 }
 
+static void list_all_devices(struct btrfs_root *root)
+{
+       struct btrfs_fs_devices *fs_devices;
+       struct btrfs_device *device;
+       int number_of_devices = 0;
+       u64 total_block_count = 0;
+
+       fs_devices = root->fs_info->fs_devices;
+
+       list_for_each_entry(device, &fs_devices->devices, dev_list)
+               number_of_devices++;
+
+       printf("  Number of devices:\t%d\n", number_of_devices);
+       printf("    UUID                                  ID    SIZE    PATH\n");
+       printf("    ------------------------------------  --  --------- -----------\n");
+       list_for_each_entry_reverse(device, &fs_devices->devices, dev_list) {
+               char dev_uuid[BTRFS_UUID_UNPARSED_SIZE];
+
+               uuid_unparse(device->uuid, dev_uuid);
+               printf("    %s %3llu %10s %s\n",
+                       dev_uuid, device->devid,
+                       pretty_size(device->total_bytes),
+                       device->name);
+               total_block_count += device->total_bytes;
+       }
+
+       printf("\n");
+       printf("  Total devices size: %10s\n",
+               pretty_size(total_block_count));
+}
+
 int main(int ac, char **av)
 {
        char *file;
        struct btrfs_root *root;
        struct btrfs_trans_handle *trans;
        char *label = NULL;
-       char *first_file;
        u64 block_count = 0;
        u64 dev_block_count = 0;
        u64 blocks[7];
@@ -1423,7 +1453,6 @@ int main(int ac, char **av)
                                strerror(errno));
                        exit(1);
                }
-               first_file = file;
                ret = btrfs_prepare_device(fd, file, zero_end, &dev_block_count,
                                           block_count, &mixed, discard);
                if (ret) {
@@ -1441,7 +1470,6 @@ int main(int ac, char **av)
                        exit(1);
                }
 
-               first_file = file;
                source_dir_size = size_sourcedir(source_dir, sectorsize,
                                             &num_of_meta_chunks, &size_of_data);
                if(block_count < source_dir_size)
@@ -1485,9 +1513,6 @@ int main(int ac, char **av)
                features |= BTRFS_FEATURE_INCOMPAT_RAID56;
        }
 
-       if (verbose)
-               btrfs_process_fs_features(features);
-
        ret = make_btrfs(fd, file, label, fs_uuid, blocks, dev_block_count,
                         nodesize, sectorsize, stripesize, features);
        if (ret) {
@@ -1576,13 +1601,6 @@ raid_groups:
        ret = create_data_reloc_tree(trans, root);
        BUG_ON(ret);
 
-       if (verbose) {
-               printf(
-       "fs created label %s on %s\n\tnodesize %u leafsize %u sectorsize %u size %s\n",
-                   label, first_file, nodesize, nodesize, sectorsize,
-                   pretty_size(btrfs_super_total_bytes(root->fs_info->super_copy)));
-       }
-
        btrfs_commit_transaction(trans, root);
 
        if (source_dir_set) {
@@ -1597,6 +1615,41 @@ raid_groups:
                BUG_ON(ret);
        }
 
+       if (verbose) {
+               char features_buf[64];
+
+               printf("BTRFS filesystem summary:\n");
+               printf("  Label:\t\t%s\n", label);
+               printf("  UUID:\t\t\t%s\n", fs_uuid);
+               printf("\n");
+
+               printf("  Node size:\t\t%u\n", nodesize);
+               printf("  Sector size:\t\t%u\n", sectorsize);
+               printf("  Initial chunks:\n");
+               if (allocation.data)
+                       printf("    Data:\t\t%s\n",
+                               pretty_size(allocation.data));
+               if (allocation.metadata)
+                       printf("    Metadata:\t\t%s\n",
+                               pretty_size(allocation.metadata));
+               if (allocation.mixed)
+                       printf("    Data+Metadata:\t%s\n",
+                               pretty_size(allocation.mixed));
+               printf("    System:\t\t%s\n",
+                       pretty_size(allocation.system));
+               printf("  Metadata profile:\t%s\n",
+                       btrfs_group_profile_str(metadata_profile));
+               printf("  Data profile:\t\t%s\n",
+                       btrfs_group_profile_str(data_profile));
+               printf("  Mixed mode:\t\t%s\n", mixed ? "YES" : "NO");
+               printf("  SSD detected:\t\t%s\n", ssd ? "YES" : "NO");
+               btrfs_parse_features_to_string(features_buf, features);
+               printf("  Incompat features:\t%s", features_buf);
+               printf("\n");
+
+               list_all_devices(root);
+       }
+
        ret = close_ctree(root);
        BUG_ON(ret);
        free(label);