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 | 140 ++++++++++++++++++++++++++++++++++++++--------------- man/man8/xfs_io.8 | 26 ++++++++-- 2 files changed, 123 insertions(+), 43 deletions(-) diff --git a/io/stat.c b/io/stat.c index 49c4c27c..b57f9eef 100644 --- a/io/stat.c +++ b/io/stat.c @@ -171,6 +171,24 @@ stat_f( return 0; } +static void +statfs_help(void) +{ + printf(_( +"\n" +" Display file system status.\n" +"\n" +" Options:\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) + static int statfs_f( int argc, @@ -179,55 +197,95 @@ statfs_f( struct xfs_fsop_counts fscounts; struct xfs_fsop_geom fsgeo; struct statfs st; + unsigned int flags = 0; + int c; int ret; + while ((c = getopt(argc, argv, "cgs")) != EOF) { + switch (c) { + case 'c': + flags |= REPORT_FSCOUNTS; + break; + case 'g': + flags |= REPORT_GEOMETRY; + break; + case 's': + flags |= REPORT_STATFS; + break; + default: + exitcode = 1; + return command_usage(&statfs_cmd); + } + } + + if (!flags) + 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 +465,13 @@ stat_init(void) statfs_cmd.name = "statfs"; statfs_cmd.cfunc = statfs_f; + statfs_cmd.argmin = 0; + statfs_cmd.argmax = -1; + statfs_cmd.args = _("[-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..e3c5d3ea 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -1235,11 +1235,29 @@ down, matching XFS behavior when critical corruption is encountered. .PD .RE .TP -.B statfs -Selected statistics from +.B 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: +.RS 1.0i +.PD 0 +.TP +.BI \-c +Display +.B XFS_IOC_FSCOUNTERS +summary counter data. +.TP +.BI \-g +Display +.B XFS_IOC_FSGEOMETRY +filesystem geometry data. +.TP +.BI \-s +Display .BR statfs (2) -and the XFS_IOC_FSGEOMETRY -system call on the filesystem where the current file resides. +data. +.TP +.RE +.PD .TP .BI "inode [ [ -n ] " number " ] [ -v ]" The inode command queries physical information about an inode. With