linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
To: Anand Jain <anand.jain@oracle.com>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH 2/3] btrfs-progs: read from the kernel when disk is mounted
Date: Fri, 30 Aug 2013 10:07:12 +0800	[thread overview]
Message-ID: <521FFE50.90909@cn.fujitsu.com> (raw)
In-Reply-To: <1376657303-14931-3-git-send-email-anand.jain@oracle.com>

On 08/16/2013 08:48 PM, Anand Jain wrote:

ERROR: spaces required around that '?' (ctx:VxV)
#63: FILE: cmds-filesystem.c:279:
+        strlen(label)?label:"none", uuidbuf, path);
                       ^

ERROR: spaces required around that ':' (ctx:VxV)
#63: FILE: cmds-filesystem.c:279:
+        strlen(label)?label:"none", uuidbuf, path);
                             ^

WARNING: space prohibited between function name and open parenthesis '('
#119: FILE: cmds-filesystem.c:335:
+    if ((f = setmntent ("/proc/mounts", "r")) == NULL)

ERROR: do not use assignment in if condition
#119: FILE: cmds-filesystem.c:335:
+    if ((f = setmntent ("/proc/mounts", "r")) == NULL)

WARNING: space prohibited between function name and open parenthesis '('
#122: FILE: cmds-filesystem.c:338:
+    while ((mnt = getmntent (f)) != NULL) {

ERROR: space required before the open brace '{'
#174: FILE: cmds-filesystem.c:391:
+    if( argc > 1 && !strcmp(argv[1], "--all-devices")){

ERROR: space prohibited after that open parenthesis '('
#174: FILE: cmds-filesystem.c:391:
+    if( argc > 1 && !strcmp(argv[1], "--all-devices")){

ERROR: space required before the open parenthesis '('
#174: FILE: cmds-filesystem.c:391:
+    if( argc > 1 && !strcmp(argv[1], "--all-devices")){

ERROR: space prohibited after that '!' (ctx:BxW)
#186: FILE: cmds-filesystem.c:401:
+        if (! (searchstart < argc))
              ^

total: 7 errors, 2 warnings, 194 lines checked

> As of now btrfs filesystem show reads directly from
> disks. So sometimes output can be stale, mainly when
> user want to verify their last operation like,
> labeling or device delete or add... etc.
>
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
>   cmds-filesystem.c |  166 ++++++++++++++++++++++++++++++++++++++++++++++++++---
>   1 files changed, 157 insertions(+), 9 deletions(-)
>
> diff --git a/cmds-filesystem.c b/cmds-filesystem.c
> index be8afde..508ba90 100644
> --- a/cmds-filesystem.c
> +++ b/cmds-filesystem.c
> @@ -22,6 +22,9 @@
>   #include <errno.h>
>   #include <uuid/uuid.h>
>   #include <ctype.h>
> +#include <mntent.h>
> +#include <fcntl.h>
> +#include <linux/limits.h>
>   
>   #include "kerncompat.h"
>   #include "ctree.h"
> @@ -251,8 +254,124 @@ static void print_one_uuid(struct btrfs_fs_devices *fs_devices)
>   	printf("\n");
>   }
>   
> +/* adds up all the used spaces as reported by the space info ioctl
> + */
> +static u64 cal_used_bytes(struct btrfs_ioctl_space_args *si)
> +{
> +	u64 ret = 0;
> +	int i;
> +	for (i = 0; i < si->total_spaces; i++)
> +		ret += si->spaces[i].used_bytes;
> +	return ret;
> +}
> +
> +static int print_one_fs(struct btrfs_ioctl_fs_info_args *fi,
> +		struct btrfs_ioctl_dev_info_args *di_n,
> +		struct btrfs_ioctl_space_args *si_n, char *label, char *path)
> +{
> +	int i;
> +	char uuidbuf[37];
> +	struct btrfs_ioctl_dev_info_args *di = di_n;
> +	u64 flags;
> +
> +	uuid_unparse(fi->fsid, uuidbuf);
> +	printf("Label: %s  uuid: %s mounted: %s\n",
> +		strlen(label)?label:"none", uuidbuf, path);
> +	printf("\tGroup profile:");
> +	for (i = si_n->total_spaces - 1; i >= 0; i--) {
> +		flags = si_n->spaces[i].flags;
> +		if (flags & BTRFS_BLOCK_GROUP_SYSTEM)
> +			continue;
> +		printf(" %s: %s", group_type_str(flags),
> +					group_profile_str(flags));
> +		printf(" ");
> +	}
> +	printf("\n");
> +
> +	printf("\tTotal devices %llu FS bytes used %s\n",
> +				fi->num_devices,
> +			pretty_size(cal_used_bytes(si_n)));
> +
> +	for (i = 0; i < fi->num_devices; i++) {
> +		di = (struct btrfs_ioctl_dev_info_args *)&di_n[i];
> +		printf("\tdevid    %llu size %s used %s path %s\n",
> +			di->devid,
> +			pretty_size(di->total_bytes),
> +			pretty_size(di->bytes_used),
> +			di->path);
> +	}
> +
> +	printf("\n");
> +	return 0;
> +}
> +
> +/* This function checks if the given input parameter is
> + * an uuid or a path
> + * return -1: some error in the given input
> + * return 0: unknow input
> + * return 1: given input is uuid
> + * return 2: given input is path
> + */
> +static int check_arg_type(char *input, u8 *processed)
> +{
> +	int ret = 0;
> +	if (!uuid_parse(input, processed))
> +		ret = 1;
> +	else if (realpath(input, (char *)processed))
> +		ret = 2;
> +	return ret;
> +}
> +
> +static int btrfs_scan_kernel(void *input, int type)
> +{
> +	int ret = 0, fd;
> +	FILE *f;
> +	struct mntent *mnt;
> +	struct btrfs_ioctl_fs_info_args fi;
> +	struct btrfs_ioctl_dev_info_args *di = NULL;
> +	struct btrfs_ioctl_space_args *si;
> +	char label[BTRFS_LABEL_SIZE];
> +
> +	if ((f = setmntent ("/proc/mounts", "r")) == NULL)
> +		return -errno;
> +
> +	while ((mnt = getmntent (f)) != NULL) {
> +		if (strcmp(mnt->mnt_type, "btrfs"))
> +			continue;
> +		ret = get_fs_info(mnt->mnt_dir, &fi, &di);
> +		if (ret)
> +			return ret;
> +
> +		switch (type) {
> +		case 0:
> +			break;
> +		case 1:
> +			if (uuid_compare(fi.fsid, (u8 *)input))
> +				continue;
> +			break;
> +		case 2:
> +			if (strcmp(input, mnt->mnt_dir))
> +				continue;
> +			break;
> +		default:
> +			break;
> +		}
> +
> +		fd = open(mnt->mnt_dir, O_RDONLY);
> +		if (fd > 0 && !get_df(fd, &si)) {
> +			get_label_mounted(mnt->mnt_dir, label);
> +			print_one_fs(&fi, di, si, label, mnt->mnt_dir);
> +			free(si);
> +		}
> +		if (fd > 0)
> +			close(fd);
> +		free(di);
> +	}
> +	return ret;
> +}
> +
>   static const char * const cmd_show_usage[] = {
> -	"btrfs filesystem show [--all-devices|<uuid>]",
> +	"btrfs filesystem show [--all-devices|--mapper|--kernel|<uuid>]",
>   	"Show the structure of a filesystem",
>   	"If no argument is given, structure of all present filesystems is shown.",
>   	NULL
> @@ -264,23 +383,52 @@ static int cmd_show(int argc, char **argv)
>   	struct btrfs_fs_devices *fs_devices;
>   	struct list_head *cur_uuid;
>   	char *search = 0;
> -	int ret;
> +	int ret = 0;
>   	int where = BTRFS_SCAN_PROC;
>   	int searchstart = 1;
> +	u8 processed[PATH_MAX];
>   
> -	if( argc > 1 && !strcmp(argv[1],"--all-devices")){
> +	if( argc > 1 && !strcmp(argv[1], "--all-devices")){
>   		where = BTRFS_SCAN_DEV;
>   		searchstart += 1;
> +	} else if (argc > 1 && !strcmp(argv[1], "--kernel")) {
> +		where = 0;
> +		searchstart += 1;
>   	}
>   
> -	if (check_argc_max(argc, searchstart + 1))
> -		usage(cmd_show_usage);
> +	if (!where) {
> +		/* option --kernel*/
> +		if (! (searchstart < argc))
> +			ret = btrfs_scan_kernel(NULL, 0);
> +
> +		while (searchstart < argc) {
> +			ret = check_arg_type(argv[searchstart], processed);
> +			if (ret < 0) {
> +				fprintf(stderr, "ERROR at input %s\n",
> +							argv[searchstart]);
> +				return 1;
> +			}
> +			if (!ret) {
> +				fprintf(stderr, "ERROR unknown %s\n",
> +					argv[searchstart]);
> +				return 1;
> +			}
>   
> -	ret = scan_for_btrfs(where, 0);
> +			ret = btrfs_scan_kernel(processed, ret);
> +			if (ret)
> +				break;
> +			searchstart++;
> +		}
> +		if (ret)
> +			fprintf(stderr, "ERROR: scan kernel failed, %d\n",
> +				ret);
> +		return ret;
> +	}
>   
> -	if (ret){
> -		fprintf(stderr, "ERROR: error %d while scanning\n", ret);
> -		return 18;
> +	ret = scan_for_btrfs(where, 0);
> +	if (ret) {
> +		fprintf(stderr, "ERROR: %d while scanning\n", ret);
> +		return 1;
>   	}
>   	
>   	if(searchstart < argc)


  reply	other threads:[~2013-08-30  2:09 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-16 12:48 [PATCH 0/3] fi show, dev scan and lblkid Anand Jain
2013-08-16 12:48 ` [PATCH 1/3] btrfs-progs: move out print in cmd_df to another function Anand Jain
2013-08-19 19:20   ` Zach Brown
2013-08-20  6:17     ` Anand Jain
2013-08-20  6:16   ` [PATCH] btrfs-progs: v3, " Anand Jain
2013-08-30  2:01   ` [PATCH 1/3] btrfs-progs: " Wang Shilong
2013-08-30  2:28     ` Anand Jain
2013-08-16 12:48 ` [PATCH 2/3] btrfs-progs: read from the kernel when disk is mounted Anand Jain
2013-08-30  2:07   ` Wang Shilong [this message]
2013-08-16 12:48 ` [PATCH 3/3] btrfs-progs: use lblkid to scan and filesystem show improvements Anand Jain

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=521FFE50.90909@cn.fujitsu.com \
    --to=wangsl.fnst@cn.fujitsu.com \
    --cc=anand.jain@oracle.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).