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 Thu, Jul 08, 2021 at 03:58:47PM -0500, Eric Sandeen wrote:
> 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;" ?

Changed.

> (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

URkk, wow.  Fixed.

> 
> > +			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?

I'll change it to:

       statfs [ -c ] [ -g ] [ -s ]
              Report selected statistics on the filesystem  where  the
              current file resides.  The default behavior is to enable
              all three reporting options:
                 -c     Display  XFS_IOC_FSCOUNTERS  summary   counter
                        data.
                 -g     Display XFS_IOC_FSGEOMETRY filesystem geometry
                        data.
                 -s     Display statfs(2) data.

If that's ok.  I got rid of -a because it's redundant.

--D

> 
> > +.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