Re: [PATCH 1/1] xfs_io: allow callers to dump fs stats individually

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 7/2/21 9:58 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@xxxxxxxxxx>
> 
> Enable callers to decide if they want to see statfs, fscounts, or
> geometry information (or any combination) from the xfs_io statfs
> command.
> 
> Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx>
> ---
>  io/stat.c         |  149 +++++++++++++++++++++++++++++++++++++++--------------
>  man/man8/xfs_io.8 |   17 ++++++
>  2 files changed, 127 insertions(+), 39 deletions(-)
> 
> 
> diff --git a/io/stat.c b/io/stat.c
> index 49c4c27c..1993247c 100644
> --- a/io/stat.c
> +++ b/io/stat.c
> @@ -171,6 +171,26 @@ stat_f(
>  	return 0;
>  }
>  
> +static void
> +statfs_help(void)
> +{
> +        printf(_(
> +"\n"
> +" Display file system status.\n"
> +"\n"
> +" Options:\n"
> +" -a -- Print statfs, geometry, and fs summary count data.\n"
> +" -c -- Print fs summary count data.\n"
> +" -g -- Print fs geometry data.\n"
> +" -s -- Print statfs data.\n"
> +"\n"));
> +}
> +
> +#define REPORT_STATFS		(1 << 0)
> +#define REPORT_GEOMETRY		(1 << 1)
> +#define REPORT_FSCOUNTS		(1 << 2)
> +#define REPORT_DEFAULT		(1 << 31)
> +
>  static int
>  statfs_f(
>  	int			argc,
> @@ -179,55 +199,102 @@ statfs_f(
>  	struct xfs_fsop_counts	fscounts;
>  	struct xfs_fsop_geom	fsgeo;
>  	struct statfs		st;
> +	unsigned int		flags = REPORT_DEFAULT;

Nitpicking this only because the patch will need to be resent anyway ;)
Why not just "flags = 0" and "if !flags flags = ALL|THREE|FLAGS;" ?

(OTOH I don't really care, just wasn't sure about the need for it)

> +	int			c;
>  	int			ret;
>  
> +	while ((c = getopt(argc, argv, "acgs")) != EOF) {
> +		switch (c) {
> +		case 'a':
> +			flags = REPORT_STATFS | REPORT_GEOMETRY |
> +				REPORT_FSCOUNTS;
> +			break;
> +		case 'c':
> +			flags &= ~REPORT_DEFAULT;
> +			flags |= REPORT_FSCOUNTS;
> +			break;
> +		case 'g':
> +			flags &= ~REPORT_GEOMETRY;
> +			flags |= REPORT_FSCOUNTS;

this looks ... wrong. ITYM:

+		case 'g':
+			flags &= ~REPORT_DEFAULT;
+			flags |= REPORT_GEOMETRY;

?

> +			break;
> +		case 's':
> +			flags &= ~REPORT_STATFS;
> +			flags |= REPORT_FSCOUNTS;

similar here

> +			break;
> +		default:
> +			exitcode = 1;
> +			return command_usage(&statfs_cmd);
> +		}
> +	}
> +
> +	if (flags & REPORT_DEFAULT)
> +		flags = REPORT_STATFS | REPORT_GEOMETRY | REPORT_FSCOUNTS;
> +
>  	printf(_("fd.path = \"%s\"\n"), file->name);
> -	if (platform_fstatfs(file->fd, &st) < 0) {
> -		perror("fstatfs");
> -		exitcode = 1;
> -	} else {
> -		printf(_("statfs.f_bsize = %lld\n"), (long long) st.f_bsize);
> -		printf(_("statfs.f_blocks = %lld\n"), (long long) st.f_blocks);
> -		printf(_("statfs.f_bavail = %lld\n"), (long long) st.f_bavail);
> -		printf(_("statfs.f_files = %lld\n"), (long long) st.f_files);
> -		printf(_("statfs.f_ffree = %lld\n"), (long long) st.f_ffree);
> +	if (flags & REPORT_STATFS) {
> +		ret = platform_fstatfs(file->fd, &st);
> +		if (ret < 0) {
> +			perror("fstatfs");
> +			exitcode = 1;
> +		} else {
> +			printf(_("statfs.f_bsize = %lld\n"),
> +					(long long) st.f_bsize);
> +			printf(_("statfs.f_blocks = %lld\n"),
> +					(long long) st.f_blocks);
> +			printf(_("statfs.f_bavail = %lld\n"),
> +					(long long) st.f_bavail);
> +			printf(_("statfs.f_files = %lld\n"),
> +					(long long) st.f_files);
> +			printf(_("statfs.f_ffree = %lld\n"),
> +					(long long) st.f_ffree);
>  #ifdef HAVE_STATFS_FLAGS
> -		printf(_("statfs.f_flags = 0x%llx\n"), (long long) st.f_flags);
> +			printf(_("statfs.f_flags = 0x%llx\n"),
> +					(long long) st.f_flags);
>  #endif
> +		}
>  	}
> +
>  	if (file->flags & IO_FOREIGN)
>  		return 0;
> -	ret = -xfrog_geometry(file->fd, &fsgeo);
> -	if (ret) {
> -		xfrog_perror(ret, "XFS_IOC_FSGEOMETRY");
> -		exitcode = 1;
> -	} else {
> -		printf(_("geom.bsize = %u\n"), fsgeo.blocksize);
> -		printf(_("geom.agcount = %u\n"), fsgeo.agcount);
> -		printf(_("geom.agblocks = %u\n"), fsgeo.agblocks);
> -		printf(_("geom.datablocks = %llu\n"),
> -			(unsigned long long) fsgeo.datablocks);
> -		printf(_("geom.rtblocks = %llu\n"),
> -			(unsigned long long) fsgeo.rtblocks);
> -		printf(_("geom.rtextents = %llu\n"),
> -			(unsigned long long) fsgeo.rtextents);
> -		printf(_("geom.rtextsize = %u\n"), fsgeo.rtextsize);
> -		printf(_("geom.sunit = %u\n"), fsgeo.sunit);
> -		printf(_("geom.swidth = %u\n"), fsgeo.swidth);
> +
> +	if (flags & REPORT_GEOMETRY) {
> +		ret = -xfrog_geometry(file->fd, &fsgeo);
> +		if (ret) {
> +			xfrog_perror(ret, "XFS_IOC_FSGEOMETRY");
> +			exitcode = 1;
> +		} else {
> +			printf(_("geom.bsize = %u\n"), fsgeo.blocksize);
> +			printf(_("geom.agcount = %u\n"), fsgeo.agcount);
> +			printf(_("geom.agblocks = %u\n"), fsgeo.agblocks);
> +			printf(_("geom.datablocks = %llu\n"),
> +				(unsigned long long) fsgeo.datablocks);
> +			printf(_("geom.rtblocks = %llu\n"),
> +				(unsigned long long) fsgeo.rtblocks);
> +			printf(_("geom.rtextents = %llu\n"),
> +				(unsigned long long) fsgeo.rtextents);
> +			printf(_("geom.rtextsize = %u\n"), fsgeo.rtextsize);
> +			printf(_("geom.sunit = %u\n"), fsgeo.sunit);
> +			printf(_("geom.swidth = %u\n"), fsgeo.swidth);
> +		}
>  	}
> -	if ((xfsctl(file->name, file->fd, XFS_IOC_FSCOUNTS, &fscounts)) < 0) {
> -		perror("XFS_IOC_FSCOUNTS");
> -		exitcode = 1;
> -	} else {
> -		printf(_("counts.freedata = %llu\n"),
> -			(unsigned long long) fscounts.freedata);
> -		printf(_("counts.freertx = %llu\n"),
> -			(unsigned long long) fscounts.freertx);
> -		printf(_("counts.freeino = %llu\n"),
> -			(unsigned long long) fscounts.freeino);
> -		printf(_("counts.allocino = %llu\n"),
> -			(unsigned long long) fscounts.allocino);
> +
> +	if (flags & REPORT_FSCOUNTS) {
> +		ret = ioctl(file->fd, XFS_IOC_FSCOUNTS, &fscounts);
> +		if (ret < 0) {
> +			perror("XFS_IOC_FSCOUNTS");
> +			exitcode = 1;
> +		} else {
> +			printf(_("counts.freedata = %llu\n"),
> +				(unsigned long long) fscounts.freedata);
> +			printf(_("counts.freertx = %llu\n"),
> +				(unsigned long long) fscounts.freertx);
> +			printf(_("counts.freeino = %llu\n"),
> +				(unsigned long long) fscounts.freeino);
> +			printf(_("counts.allocino = %llu\n"),
> +				(unsigned long long) fscounts.allocino);
> +		}
>  	}
> +
>  	return 0;
>  }
>  
> @@ -407,9 +474,13 @@ stat_init(void)
>  
>  	statfs_cmd.name = "statfs";
>  	statfs_cmd.cfunc = statfs_f;
> +	statfs_cmd.argmin = 0;
> +	statfs_cmd.argmax = -1;

Eh, I guess you can do "stats -a -a -a -c -c -c -s -a -a -c -c -c -g -g -g ...." and it works fine, so sure, "-1" ;)

> +	statfs_cmd.args = _("[-a] [-c] [-g] [-s]");
>  	statfs_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
>  	statfs_cmd.oneline =
>  		_("statistics on the filesystem of the currently open file");
> +	statfs_cmd.help = statfs_help;
>  
>  	add_command(&stat_cmd);
>  	add_command(&statx_cmd);
> diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
> index 1103dc42..32bdd866 100644
> --- a/man/man8/xfs_io.8
> +++ b/man/man8/xfs_io.8

Probably want to turn this into:

statfs [-a] [-c] [-g] [-s]
	<description, probably updated to add XFS_IOC_FSCOUNTS to the list of $STUFF>

> @@ -1240,6 +1240,23 @@ Selected statistics from
>  .BR statfs (2)
>  and the XFS_IOC_FSGEOMETRY
>  system call on the filesystem where the current file resides.
> +.RS 1.0i
> +.PD 0
> +.TP
> +.BI \-a
> +Display statfs, geometry, and fs summary counter data.

Perhaps note that this is the default if no options are specified?

> +.TP
> +.BI \-c
> +Display fs summary counter data.
> +.TP
> +.BI \-g
> +Display geometry data.
> +.TP
> +.BI \-s
> +Display statfs data.
> +.TP
> +.RE
> +.PD
>  .TP
>  .BI "inode  [ [ -n ] " number " ] [ -v ]"
>  The inode command queries physical information about an inode. With
> 



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux