]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs_io: add a command to display allocation group information
authorDarrick J. Wong <djwong@kernel.org>
Thu, 1 Sep 2022 21:30:59 +0000 (14:30 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 22 Nov 2023 23:03:35 +0000 (15:03 -0800)
Add a new 'aginfo' command to xfs_io so that we can display allocation
group geometry.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
io/Makefile
io/aginfo.c [new file with mode: 0644]
io/init.c
io/io.h
man/man8/xfs_io.8

index 1be6ab77d873a408e9d35adf88f4f7f932485299..32a40294358166b63dbf17445b3e002fe8d53664 100644 (file)
@@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs
 LTCOMMAND = xfs_io
 LSRCFILES = xfs_bmap.sh xfs_freeze.sh xfs_mkfile.sh
 HFILES = init.h io.h
-CFILES = init.c \
+CFILES = init.c aginfo.c \
        attr.c bmap.c bulkstat.c crc32cselftest.c cowextsize.c encrypt.c \
        file.c freeze.c fsuuid.c fsync.c getrusage.c imap.c inject.c label.c \
        link.c mmap.c open.c parent.c pread.c prealloc.c pwrite.c reflink.c \
diff --git a/io/aginfo.c b/io/aginfo.c
new file mode 100644 (file)
index 0000000..822d18d
--- /dev/null
@@ -0,0 +1,119 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2021-2023 Oracle.
+ * All Rights Reserved.
+ */
+#include "platform_defs.h"
+#include "libxfs.h"
+#include "command.h"
+#include "input.h"
+#include "init.h"
+#include "io.h"
+#include "libfrog/logging.h"
+#include "libfrog/paths.h"
+#include "libfrog/fsgeom.h"
+
+static cmdinfo_t aginfo_cmd;
+
+static int
+report_aginfo(
+       struct xfs_fd           *xfd,
+       xfs_agnumber_t          agno)
+{
+       struct xfs_ag_geometry  ageo = { 0 };
+       int                     ret;
+
+       ret = -xfrog_ag_geometry(xfd->fd, agno, &ageo);
+       if (ret) {
+               xfrog_perror(ret, "aginfo");
+               return 1;
+       }
+
+       printf(_("AG: %u\n"),           ageo.ag_number);
+       printf(_("Blocks: %u\n"),       ageo.ag_length);
+       printf(_("Free Blocks: %u\n"),  ageo.ag_freeblks);
+       printf(_("Inodes: %u\n"),       ageo.ag_icount);
+       printf(_("Free Inodes: %u\n"),  ageo.ag_ifree);
+       printf(_("Sick: 0x%x\n"),       ageo.ag_sick);
+       printf(_("Checked: 0x%x\n"),    ageo.ag_checked);
+       printf(_("Flags: 0x%x\n"),      ageo.ag_flags);
+
+       return 0;
+}
+
+/* Display AG status. */
+static int
+aginfo_f(
+       int                     argc,
+       char                    **argv)
+{
+       struct xfs_fd           xfd = XFS_FD_INIT(file->fd);
+       unsigned long long      x;
+       xfs_agnumber_t          agno = NULLAGNUMBER;
+       int                     c;
+       int                     ret = 0;
+
+       ret = -xfd_prepare_geometry(&xfd);
+       if (ret) {
+               xfrog_perror(ret, "xfd_prepare_geometry");
+               exitcode = 1;
+               return 1;
+       }
+
+       while ((c = getopt(argc, argv, "a:")) != EOF) {
+               switch (c) {
+               case 'a':
+                       errno = 0;
+                       x = strtoll(optarg, NULL, 10);
+                       if (!errno && x >= NULLAGNUMBER)
+                               errno = ERANGE;
+                       if (errno) {
+                               perror("aginfo");
+                               return 1;
+                       }
+                       agno = x;
+                       break;
+               default:
+                       return command_usage(&aginfo_cmd);
+               }
+       }
+
+       if (agno != NULLAGNUMBER) {
+               ret = report_aginfo(&xfd, agno);
+       } else {
+               for (agno = 0; !ret && agno < xfd.fsgeom.agcount; agno++) {
+                       ret = report_aginfo(&xfd, agno);
+               }
+       }
+
+       return ret;
+}
+
+static void
+aginfo_help(void)
+{
+       printf(_(
+"\n"
+"Report allocation group geometry.\n"
+"\n"
+" -a agno  -- Report on the given allocation group.\n"
+"\n"));
+
+}
+
+static cmdinfo_t aginfo_cmd = {
+       .name = "aginfo",
+       .cfunc = aginfo_f,
+       .argmin = 0,
+       .argmax = -1,
+       .args = "[-a agno]",
+       .flags = CMD_NOMAP_OK,
+       .help = aginfo_help,
+};
+
+void
+aginfo_init(void)
+{
+       aginfo_cmd.oneline = _("Get XFS allocation group state.");
+       add_command(&aginfo_cmd);
+}
index a6c3d0cf14747b838fdced29ddc6233580f44679..dee09b563339079b2e2dd2eadb6bd9dd4398ccc9 100644 (file)
--- a/io/init.c
+++ b/io/init.c
@@ -44,6 +44,7 @@ init_cvtnum(
 static void
 init_commands(void)
 {
+       aginfo_init();
        atomicupdate_init();
        attr_init();
        bmap_init();
diff --git a/io/io.h b/io/io.h
index a30b96401a7ba8627d9066c7f1c576aa0b4ab1d6..61920fcee7f9a6bcfbd0a526d43c778c6fad9cce 100644 (file)
--- a/io/io.h
+++ b/io/io.h
@@ -190,3 +190,4 @@ extern void         repair_init(void);
 extern void            crc32cselftest_init(void);
 extern void            bulkstat_init(void);
 extern void            atomicupdate_init(void);
+extern void            aginfo_init(void);
index 05a1cff7f61848118c793d739cb4043940e37059..3ef17ffb5eec5e4e471d1154c8d36f1f8e596603 100644 (file)
@@ -1236,6 +1236,18 @@ Dumps a list of pages or ranges of pages that are currently in core,
 for the current memory mapping.
 
 .SH FILESYSTEM COMMANDS
+.TP
+.BI "aginfo [ \-a " agno " ]"
+Show information about or update the state of allocation groups.
+.RE
+.RS 1.0i
+.PD 0
+.TP
+.BI \-a
+Act only on a specific allocation group.
+.PD
+.RE
+
 .TP
 .BI "bulkstat [ \-a " agno " ] [ \-d ] [ \-e " endino " ] [ \-m ] [ \-n " batchsize " ] [ \-q ] [ \-s " startino " ] [ \-v " version" ]
 Display raw stat information about a bunch of inodes in an XFS filesystem.