@@ -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;
}
@@ -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