]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_spaceman: add a superblock info command
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 23 May 2018 21:30:48 +0000 (16:30 -0500)
committerEric Sandeen <sandeen@redhat.com>
Wed, 23 May 2018 21:30:48 +0000 (16:30 -0500)
Add an 'info' command to pretty-print the superblock geometry.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
man/man8/xfs_spaceman.8
spaceman/Makefile
spaceman/info.c [new file with mode: 0644]
spaceman/init.c
spaceman/space.h

index e4a9137f5bf25e4b7433896ab8cfcb54aabf3511..12dd04e4961965c9328b5cf7bf49d8ebeab1ff0d 100644 (file)
@@ -84,6 +84,13 @@ Display a summary of the free space information found.
 .PD
 .RE
 .TP
+.B info
+Displays selected geometry information about the filesystem.
+The opened file must be a mount point of a XFS filesystem.
+The output will have the same format that
+.BR "xfs_info" "(8)"
+prints when querying a filesystem.
+.TP
 .BR "help [ " command " ]"
 Display a brief description of one or all commands.
 .TP
index 8b3103092116ea6ff4c157927aec32c3c167774a..c1d903ba84d8d51e0ae3a0a6706d92c2411647e7 100644 (file)
@@ -7,7 +7,7 @@ include $(TOPDIR)/include/builddefs
 
 LTCOMMAND = xfs_spaceman
 HFILES = init.h space.h
-CFILES = init.c file.c prealloc.c trim.c
+CFILES = info.c init.c file.c prealloc.c trim.c
 
 LLDLIBS = $(LIBXCMD) $(LIBFROG)
 LTDEPENDENCIES = $(LIBXCMD) $(LIBFROG)
diff --git a/spaceman/info.c b/spaceman/info.c
new file mode 100644 (file)
index 0000000..8889346
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2018 Oracle.  All Rights Reserved.
+ *
+ * Author: Darrick J. Wong <darrick.wong@oracle.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software Foundation,
+ * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+#include "libxfs.h"
+#include "command.h"
+#include "init.h"
+#include "path.h"
+#include "space.h"
+#include "fsgeom.h"
+
+static void
+info_help(void)
+{
+       printf(_(
+"\n"
+" Pretty-prints the filesystem geometry as derived from the superblock.\n"
+" The output has the same format as mkfs.xfs, xfs_info, and other utilities.\n"
+" The opened file must be an XFS mount point.\n"
+"\n"
+));
+
+}
+
+static int
+info_f(
+       int                     argc,
+       char                    **argv)
+{
+       struct xfs_fsop_geom    geo;
+       int                     error;
+
+       if (fs_table_lookup_mount(file->name) == NULL) {
+               fprintf(stderr, _("%s: Not a XFS mount point.\n"), file->name);
+               return 1;
+       }
+
+       /* get the current filesystem size & geometry */
+       error = ioctl(file->fd, XFS_IOC_FSGEOMETRY, &geo);
+       if (error) {
+               /*
+                * OK, new xfsctl barfed - back off and try earlier version
+                * as we're probably running an older kernel version.
+                * Only field added in the v2 geometry xfsctl is "logsunit"
+                * so we'll zero that out for later display (as zero).
+                */
+               geo.logsunit = 0;
+               error = ioctl(file->fd, XFS_IOC_FSGEOMETRY_V1, &geo);
+               if (error) {
+                       fprintf(stderr, _(
+                               "%s: cannot determine geometry of filesystem"
+                               " mounted at %s: %s\n"),
+                               progname, file->name, strerror(errno));
+                       exitcode = 1;
+                       return 0;
+               }
+       }
+
+       xfs_report_geom(&geo, file->fs_path.fs_name, file->fs_path.fs_log,
+                       file->fs_path.fs_rt);
+       return 0;
+}
+
+static const struct cmdinfo info_cmd = {
+       .name =         "info",
+       .altname =      "i",
+       .cfunc =        info_f,
+       .argmin =       0,
+       .argmax =       0,
+       .canpush =      0,
+       .args =         NULL,
+       .flags =        CMD_FLAG_ONESHOT,
+       .oneline =      N_("pretty-print superblock geometry info"),
+       .help =         info_help,
+};
+
+void
+info_init(void)
+{
+       add_command(&info_cmd);
+}
index b3efacefd2f98a765743443b14efd429e4c96248..895504f31dd0175414802c3d9c737ec2ce9dd083 100644 (file)
@@ -40,6 +40,7 @@ init_commands(void)
 {
        print_init();
        help_init();
+       info_init();
        prealloc_init();
        quit_init();
        trim_init();
index 5f4a8a0bfd7d89ebca50f8c6e9006443c57b1a80..d2a25432098a803f5f241b3ba5b33fa59cbc59b1 100644 (file)
@@ -42,5 +42,6 @@ extern void   freesp_init(void);
 #else
 # define freesp_init() do { } while (0)
 #endif
+extern void    info_init(void);
 
 #endif /* XFS_SPACEMAN_SPACE_H_ */