All of lore.kernel.org
 help / color / mirror / Atom feed
From: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
To: Goffredo Baroncelli <kreijack@gmail.com>, <linux-btrfs@vger.kernel.org>
Cc: Goffredo Baroncelli <kreijack@inwind.it>
Subject: Re: [PATCH 6/7] Print the summary
Date: Tue, 16 Dec 2014 12:27:20 +0900	[thread overview]
Message-ID: <548FA698.1030104@jp.fujitsu.com> (raw)
In-Reply-To: <1418673780-22000-7-git-send-email-kreijack@inwind.it>

(2014/12/16 5:02), Goffredo Baroncelli wrote:
> This patch print 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)
> 
> 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:
> 
> # mkfs.btrfs -L btrfs-test -f -m raid5 -d raid5 /dev/vd[b-k]"
> BTRFS filesystem summary:
>    Label:		btrfs-test
>    UUID:			1073cb19-b675-423d-9aba-caad7f1508a8
> 
>    Node size:		16384
>    Leaf size:		16384
>    Sector size:		4096
>    Initial chunks:
>      Data:		9.01GiB
>      Metadata:		3.61GiB
>      System:		18.06MiB
>    Metadata profile:	RAID5
>    Data profile:		RAID5
>    Mixed mode:		NO
>    SSD detected:		NO
>    Features:		extref, raid56
>    Number of devices:	10
>      UUID                                  ID    SIZE    PATH
>      ------------------------------------  --  --------- -----------
>      62121322-5666-4ecf-bc8e-c9b3d9f60db9   1   50.00GiB /dev/vdb
>      6158cb13-3ae8-42b6-8603-660f1e5c8a7a   2   50.00GiB /dev/vdc
>      b49516db-ddf5-4f54-8831-a4babc79e901   3   50.00GiB /dev/vdd
>      00b03d81-7d29-4894-8050-9dd205f97c41   4   50.00GiB /dev/vde
>      f119a2ec-5ef0-436c-805e-c1b0612b05ca   5   50.00GiB /dev/vdf
>      adee4f58-e094-4bd4-8c56-941527524f8d   6   50.00GiB /dev/vdg
>      a8299171-2024-4057-ba56-1f83bf6d7e2e   7   50.00GiB /dev/vdh
>      b694e275-e454-4dbd-beb0-e33c388cffa2   8    2.00GiB /dev/vdi
>      7cbe04b5-36cd-4ea7-be82-206d5487914e   9    2.00GiB /dev/vdj
>      7c320654-675e-456b-ac23-cfb148b8ea57  10    2.00GiB /dev/vdk
> 
>    Total disks size:                           356.01GiB
> 
> 
> Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it>
> ---
>   mkfs.c | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
>   1 file changed, 142 insertions(+), 28 deletions(-)
> 
> diff --git a/mkfs.c b/mkfs.c
> index 26f8041..e956903 100644
> --- a/mkfs.c
> +++ b/mkfs.c
> @@ -26,6 +26,7 @@
>   #include "ioctl.h"
>   #include <stdio.h>
>   #include <stdlib.h>
> +#include <string.h>
>   #include <sys/types.h>
>   #include <sys/stat.h>
>   #include <sys/dir.h>
> @@ -57,7 +58,16 @@ struct directory_name_entry {
>   	struct list_head list;
>   };
>   
> -static int make_root_dir(struct btrfs_root *root, int mixed)
> +struct block_group_allocation {
> +	u64 data;
> +	u64 metadata;
> +	u64 mixed;
> +	u64 system;
> +};
> +
> +
> +static int make_root_dir(struct btrfs_root *root, int mixed,
> +				struct block_group_allocation *allocation)
>   {
>   	struct btrfs_trans_handle *trans;
>   	struct btrfs_key location;
> @@ -74,6 +84,7 @@ static int make_root_dir(struct btrfs_root *root, int mixed)
>   				     BTRFS_BLOCK_GROUP_SYSTEM,
>   				     BTRFS_FIRST_CHUNK_TREE_OBJECTID,
>   				     0, BTRFS_MKFS_SYSTEM_GROUP_SIZE);
> +	allocation->system += BTRFS_MKFS_SYSTEM_GROUP_SIZE;
>   	BUG_ON(ret);
>   
>   	if (mixed) {
> @@ -92,8 +103,8 @@ static int make_root_dir(struct btrfs_root *root, int mixed)
>   					     BTRFS_BLOCK_GROUP_DATA,
>   					     BTRFS_FIRST_CHUNK_TREE_OBJECTID,
>   					     chunk_start, chunk_size);
> +		allocation->mixed += chunk_size;
>   		BUG_ON(ret);
> -		printf("Created a data/metadata chunk of size %llu\n", chunk_size);
>   	} else {
>   		ret = btrfs_alloc_chunk(trans, root->fs_info->extent_root,
>   					&chunk_start, &chunk_size,
> @@ -107,6 +118,7 @@ static int make_root_dir(struct btrfs_root *root, int mixed)
>   					     BTRFS_BLOCK_GROUP_METADATA,
>   					     BTRFS_FIRST_CHUNK_TREE_OBJECTID,
>   					     chunk_start, chunk_size);
> +		allocation->metadata += chunk_size;
>   		BUG_ON(ret);
>   	}
>   
> @@ -128,6 +140,7 @@ static int make_root_dir(struct btrfs_root *root, int mixed)
>   					     BTRFS_BLOCK_GROUP_DATA,
>   					     BTRFS_FIRST_CHUNK_TREE_OBJECTID,
>   					     chunk_start, chunk_size);
> +		allocation->data += chunk_size;
>   		BUG_ON(ret);
>   	}
>   
> @@ -187,7 +200,9 @@ static void recow_roots(struct btrfs_trans_handle *trans,
>   }
>   
>   static int create_one_raid_group(struct btrfs_trans_handle *trans,
> -			      struct btrfs_root *root, u64 type)
> +			      struct btrfs_root *root, u64 type,
> +			      struct block_group_allocation *allocation)
> +
>   {
>   	u64 chunk_start;
>   	u64 chunk_size;
> @@ -203,6 +218,18 @@ static int create_one_raid_group(struct btrfs_trans_handle *trans,
>   	ret = btrfs_make_block_group(trans, root->fs_info->extent_root, 0,
>   				     type, BTRFS_FIRST_CHUNK_TREE_OBJECTID,
>   				     chunk_start, chunk_size);
> +	if ((type & BTRFS_BLOCK_GROUP_TYPE_MASK) == BTRFS_BLOCK_GROUP_DATA)
> +		allocation->data += chunk_size;
> +	else if ((type & BTRFS_BLOCK_GROUP_TYPE_MASK) == BTRFS_BLOCK_GROUP_METADATA)
> +		allocation->metadata += chunk_size;
> +	else if ((type & BTRFS_BLOCK_GROUP_TYPE_MASK) == BTRFS_BLOCK_GROUP_SYSTEM)
> +		allocation->system += chunk_size;
> +	else if ((type & BTRFS_BLOCK_GROUP_TYPE_MASK) ==
> +			(BTRFS_BLOCK_GROUP_METADATA|BTRFS_BLOCK_GROUP_DATA))
> +		allocation->mixed += chunk_size;
> +	else
> +		BUG_ON(1);
> +
>   	BUG_ON(ret);
>   	return ret;
>   }
> @@ -210,7 +237,8 @@ static int create_one_raid_group(struct btrfs_trans_handle *trans,
>   static int create_raid_groups(struct btrfs_trans_handle *trans,
>   			      struct btrfs_root *root, u64 data_profile,
>   			      int data_profile_opt, u64 metadata_profile,
> -			      int mixed)
> +			      int mixed,
> +			      struct block_group_allocation *allocation)
>   {
>   	u64 num_devices = btrfs_super_num_devices(root->fs_info->super_copy);
>   	int ret;
> @@ -220,21 +248,21 @@ static int create_raid_groups(struct btrfs_trans_handle *trans,
>   
>   		ret = create_one_raid_group(trans, root,
>   					    BTRFS_BLOCK_GROUP_SYSTEM |
> -					    metadata_profile);
> +					    metadata_profile, allocation);
>   		BUG_ON(ret);
>   
>   		if (mixed)
>   			meta_flags |= BTRFS_BLOCK_GROUP_DATA;
>   
>   		ret = create_one_raid_group(trans, root, meta_flags |
> -					    metadata_profile);
> +					    metadata_profile, allocation);
>   		BUG_ON(ret);
>   
>   	}
>   	if (!mixed && num_devices > 1 && data_profile) {
>   		ret = create_one_raid_group(trans, root,
>   					    BTRFS_BLOCK_GROUP_DATA |
> -					    data_profile);
> +					    data_profile, allocation);
>   		BUG_ON(ret);
>   	}
>   	recow_roots(trans, root);
> @@ -920,7 +948,8 @@ static int open_target(char *output_name)
>   
>   static int create_chunks(struct btrfs_trans_handle *trans,
>   			 struct btrfs_root *root, u64 num_of_meta_chunks,
> -			 u64 size_of_data)
> +			 u64 size_of_data,
> +			 struct block_group_allocation *allocation)
>   {
>   	u64 chunk_start;
>   	u64 chunk_size;
> @@ -937,6 +966,7 @@ static int create_chunks(struct btrfs_trans_handle *trans,
>   		ret = btrfs_make_block_group(trans, root->fs_info->extent_root, 0,
>   					     meta_type, BTRFS_FIRST_CHUNK_TREE_OBJECTID,
>   					     chunk_start, chunk_size);
> +		allocation->metadata += chunk_size;
>   		BUG_ON(ret);
>   		set_extent_dirty(&root->fs_info->free_space_cache,
>   				 chunk_start, chunk_start + chunk_size - 1, 0);
> @@ -951,6 +981,7 @@ static int create_chunks(struct btrfs_trans_handle *trans,
>   	ret = btrfs_make_block_group(trans, root->fs_info->extent_root, 0,
>   				     data_type, BTRFS_FIRST_CHUNK_TREE_OBJECTID,
>   				     chunk_start, size_of_data);
> +	allocation->data += size_of_data;
>   	BUG_ON(ret);
>   	set_extent_dirty(&root->fs_info->free_space_cache,
>   			 chunk_start, chunk_start + size_of_data - 1, 0);
> @@ -1221,6 +1252,21 @@ static void process_fs_features(u64 flags)
>   	}
>   }
>   
> +static void print_fs_features(u64 flags)
> +{
> +	int i;
> +	int first = 1;
> +
> +	for (i = 0; i < ARRAY_SIZE(mkfs_features); i++) {
> +		if (flags & mkfs_features[i].flag) {
> +			if (!first)
> +				printf(", %s",mkfs_features[i].name);
> +			else
> +				printf("%s",mkfs_features[i].name);
> +			first=0;

A trivial comment.

if (first) {
	printf(...
	first = 0;
} else {
	printf(...
}

is better.

Thanks,
Satoru

> +		}
> +	}
> +}
>   
>   /*
>    * Return NULL if all features were parsed fine, otherwise return the name of
> @@ -1241,13 +1287,43 @@ static char* parse_fs_features(char *namelist, u64 *flags)
>   	return NULL;
>   }
>   
> +static void list_all_devices(struct btrfs_root *root)
> +{
> +	struct btrfs_fs_devices *fs_devices;
> +	struct btrfs_device *device;
> +	int number_of_disks = 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_disks++;
> +
> +	printf("  Number of devices:\t%d\n", number_of_disks);
> +	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 disks 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];
> @@ -1281,12 +1357,13 @@ int main(int ac, char **av)
>   	int dev_cnt = 0;
>   	int saved_optind;
>   	char estr[100];
> -	char *fs_uuid = NULL;
> +	char fs_uuid[BTRFS_UUID_UNPARSED_SIZE] = { 0 };
>   	u64 features = DEFAULT_MKFS_FEATURES;
> +	struct block_group_allocation allocation = { 0 };
>   
>   	while(1) {
>   		int c;
> -		c = getopt_long(ac, av, "A:b:fl:n:s:m:d:L:O:r:U:VMK",
> +		c = getopt_long(ac, av, "A:b:fl:n:s:m:d:L:O:r:U:VMKqv",
>   				long_options, &option_index);
>   		if (c < 0)
>   			break;
> @@ -1356,7 +1433,8 @@ int main(int ac, char **av)
>   				source_dir_set = 1;
>   				break;
>   			case 'U':
> -				fs_uuid = optarg;
> +				strncpy(fs_uuid,optarg,
> +					BTRFS_UUID_UNPARSED_SIZE - 1);
>   				break;
>   			case 'K':
>   				discard = 0;
> @@ -1387,7 +1465,7 @@ int main(int ac, char **av)
>   		exit(1);
>   	}
>   
> -	if (fs_uuid) {
> +	if (*fs_uuid) {
>   		uuid_t dummy_uuid;
>   
>   		if (uuid_parse(fs_uuid, dummy_uuid) != 0) {
> @@ -1500,9 +1578,11 @@ int main(int ac, char **av)
>   		exit(1);
>   	}
>   
> -	/* if we are here that means all devs are good to btrfsify */
> -	printf("%s\n", BTRFS_BUILD_VERSION);
> -	printf("See http://btrfs.wiki.kernel.org for more information.\n\n");
> +	if (verbose) {
> +		/* if we are here that means all devs are good to btrfsify */
> +		printf("%s\n", BTRFS_BUILD_VERSION);
> +		printf("See http://btrfs.wiki.kernel.org for more information.\n\n");
> +	}
>   
>   	dev_cnt--;
>   
> @@ -1518,7 +1598,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) {
> @@ -1536,7 +1615,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)
> @@ -1574,7 +1652,8 @@ int main(int ac, char **av)
>   		features |= BTRFS_FEATURE_INCOMPAT_RAID56;
>   	}
>   
> -	process_fs_features(features);
> +	if (verbose)
> +		process_fs_features(features);
>   
>   	ret = make_btrfs(fd, file, label, fs_uuid, blocks, dev_block_count,
>   			 nodesize, leafsize,
> @@ -1592,7 +1671,7 @@ int main(int ac, char **av)
>   	}
>   	root->fs_info->alloc_start = alloc_start;
>   
> -	ret = make_root_dir(root, mixed);
> +	ret = make_root_dir(root, mixed, &allocation);
>   	if (ret) {
>   		fprintf(stderr, "failed to setup the root directory\n");
>   		exit(1);
> @@ -1605,6 +1684,7 @@ int main(int ac, char **av)
>   	if (dev_cnt == 0)
>   		goto raid_groups;
>   
> +
>   	while (dev_cnt-- > 0) {
>   		int old_mixed = mixed;
>   
> @@ -1631,6 +1711,7 @@ int main(int ac, char **av)
>   		}
>   		ret = btrfs_prepare_device(fd, file, zero_end, &dev_block_count,
>   					   block_count, &mixed, discard);
> +
>   		if (ret) {
>   			close(fd);
>   			exit(1);
> @@ -1638,7 +1719,8 @@ int main(int ac, char **av)
>   		mixed = old_mixed;
>   
>   		ret = btrfs_add_to_fsid(trans, root, fd, file, dev_block_count,
> -					sectorsize, sectorsize, sectorsize);
> +					sectorsize, sectorsize, sectorsize,
> +					verbose);
>   		BUG_ON(ret);
>   		btrfs_register_one_device(file);
>   	}
> @@ -1647,24 +1729,20 @@ raid_groups:
>   	if (!source_dir_set) {
>   		ret = create_raid_groups(trans, root, data_profile,
>   				 data_profile_opt, metadata_profile,
> -				 mixed);
> +				 mixed, &allocation);
>   		BUG_ON(ret);
>   	}
>   
>   	ret = create_data_reloc_tree(trans, root);
>   	BUG_ON(ret);
>   
> -	printf("fs created label %s on %s\n\tnodesize %u leafsize %u "
> -	    "sectorsize %u size %s\n",
> -	    label, first_file, nodesize, leafsize, sectorsize,
> -	    pretty_size(btrfs_super_total_bytes(root->fs_info->super_copy)));
> -
>   	btrfs_commit_transaction(trans, root);
>   
>   	if (source_dir_set) {
>   		trans = btrfs_start_transaction(root, 1);
>   		ret = create_chunks(trans, root,
> -				    num_of_meta_chunks, size_of_data);
> +				    num_of_meta_chunks, size_of_data,
> +				    &allocation);
>   		BUG_ON(ret);
>   		btrfs_commit_transaction(trans, root);
>   
> @@ -1672,6 +1750,42 @@ raid_groups:
>   		BUG_ON(ret);
>   	}
>   
> +	if (!quiet) {
> +		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("  Leaf size:\t\t%u\n", leafsize);
> +		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",
> +			group_profile_str(metadata_profile));
> +		printf("  Data profile:\t\t%s\n",
> +			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");
> +		printf("  Features:\t\t");
> +		print_fs_features(features);
> +		printf("\n");
> +
> +		list_all_devices(root);
> +
> +	}
> +
> +
>   	ret = close_ctree(root);
>   	BUG_ON(ret);
>   	free(label);
> 


  parent reply	other threads:[~2014-12-16  3:27 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-15 20:02 [RFC][BTRFS-PROGS] Improve output of mkfs.btrfs command Goffredo Baroncelli
2014-12-15 20:02 ` [PATCH 1/7] Add -v -q switches to mkfs.btrfs Goffredo Baroncelli
2014-12-16  4:56   ` Satoru Takeuchi
2014-12-15 20:02 ` [PATCH 2/7] Move group_profile_str() in utils.c Goffredo Baroncelli
2014-12-15 20:02 ` [PATCH 3/7] Add verbose option to btrfs_add_to_fsid() Goffredo Baroncelli
2014-12-15 20:02 ` [PATCH 4/7] Add strdup in btrfs_add_to_fsid() to track the device path Goffredo Baroncelli
2014-12-15 20:02 ` [PATCH 5/7] Return the fsid from make_btrfs() Goffredo Baroncelli
2014-12-15 20:02 ` [PATCH 6/7] Print the summary Goffredo Baroncelli
2014-12-16  1:58   ` Duncan
2014-12-16  3:47     ` Robert White
2014-12-16  9:05       ` Hugo Mills
2014-12-16 21:40         ` Duncan
2014-12-18  5:44         ` Robert White
2014-12-18  8:41           ` Terminology (was Re: [PATCH 6/7] Print the summary) Hugo Mills
2014-12-22 18:38             ` David Sterba
2014-12-17 18:59     ` [PATCH 6/7] Print the summary Goffredo Baroncelli
2014-12-16  3:27   ` Satoru Takeuchi [this message]
2014-12-15 20:03 ` [PATCH 7/7] Add -v and -o switches Goffredo Baroncelli
2014-12-16  3:23 ` [RFC][BTRFS-PROGS] Improve output of mkfs.btrfs command Satoru Takeuchi
2014-12-17 19:49   ` Goffredo Baroncelli
2014-12-17 14:29 ` David Sterba
2014-12-17 15:08 ` Holger Hoffstätte

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=548FA698.1030104@jp.fujitsu.com \
    --to=takeuchi_satoru@jp.fujitsu.com \
    --cc=kreijack@gmail.com \
    --cc=kreijack@inwind.it \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.