]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_scrub: refactor inode prefix rendering code
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 17 Oct 2019 02:35:26 +0000 (22:35 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Thu, 17 Oct 2019 02:35:26 +0000 (22:35 -0400)
Refactor all the places in the code where we try to render an inode
number as a prefix for some sort of status message.  This will help make
message prefixes more consistent, which should help users to locate
broken metadata.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
[sandeen: rename functions, auto-add spaces, edit comments]
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
scrub/common.c
scrub/common.h
scrub/inodes.c
scrub/phase3.c
scrub/phase5.c
scrub/phase6.c
scrub/scrub.c

index 7db47044515b95cf731defcfd2986e529e49c20f..b41f443dddff18900aff4ab3e7efa4dcac258b7d 100644 (file)
@@ -354,3 +354,38 @@ within_range(
 
        return true;
 }
+
+/*
+ * Render an inode number into a buffer in a format suitable for use in
+ * log messages. The buffer will be filled with:
+ *     "inode <inode number> (<ag number>/<ag inode number>)"
+ * If the @format argument is non-NULL, it will be rendered into the buffer
+ * after the inode representation and a single space.
+ */
+int
+scrub_render_ino_descr(
+       const struct scrub_ctx  *ctx,
+       char                    *buf,
+       size_t                  buflen,
+       uint64_t                ino,
+       uint32_t                gen,
+       const char              *format,
+       ...)
+{
+       va_list                 args;
+       uint32_t                agno;
+       uint32_t                agino;
+       int                     ret;
+
+       agno = cvt_ino_to_agno(&ctx->mnt, ino);
+       agino = cvt_ino_to_agino(&ctx->mnt, ino);
+       ret = snprintf(buf, buflen, _("inode %"PRIu64" (%"PRIu32"/%"PRIu32")%s"),
+                       ino, agno, agino, format ? " " : "");
+       if (ret < 0 || ret >= buflen || format == NULL)
+               return ret;
+
+       va_start(args, format);
+       ret += vsnprintf(buf + ret, buflen - ret, format, args);
+       va_end(args);
+       return ret;
+}
index 3355589127dc456407b1b517fac469c992d70932..9a37e9edfee4e034bc574aa02f4f2a4b07f2d63e 100644 (file)
@@ -86,4 +86,8 @@ bool within_range(struct scrub_ctx *ctx, unsigned long long value,
                unsigned long long desired, unsigned long long abs_threshold,
                unsigned int n, unsigned int d, const char *descr);
 
+int scrub_render_ino_descr(const struct scrub_ctx *ctx, char *buf,
+               size_t buflen, uint64_t ino, uint32_t gen,
+               const char *format, ...);
+
 #endif /* XFS_SCRUB_COMMON_H_ */
index 91632b550b48c0f4eedf27aea4bd6530100df15f..7aa61ebec280073a01c8068d2607fa03ca563e9d 100644 (file)
@@ -159,8 +159,8 @@ xfs_iterate_inodes_ag(
                                        ireq->hdr.ino = inumbers->xi_startino;
                                        goto igrp_retry;
                                }
-                               snprintf(idescr, DESCR_BUFSZ, "inode %"PRIu64,
-                                               (uint64_t)bs->bs_ino);
+                               scrub_render_ino_descr(ctx, idescr, DESCR_BUFSZ,
+                                               bs->bs_ino, bs->bs_gen, NULL);
                                str_info(ctx, idescr,
 _("Changed too many times during scan; giving up."));
                                break;
index 1e908c2cf121dfece27cb9cd65b71d19c1e9253b..0d2c9019bdbeec0330a678fe8a041c2b1a75bb8d 100644 (file)
@@ -48,14 +48,10 @@ xfs_scrub_inode_vfs_error(
        struct xfs_bulkstat     *bstat)
 {
        char                    descr[DESCR_BUFSZ];
-       xfs_agnumber_t          agno;
-       xfs_agino_t             agino;
        int                     old_errno = errno;
 
-       agno = cvt_ino_to_agno(&ctx->mnt, bstat->bs_ino);
-       agino = cvt_ino_to_agino(&ctx->mnt, bstat->bs_ino);
-       snprintf(descr, DESCR_BUFSZ, _("inode %"PRIu64" (%u/%u)"),
-                       (uint64_t)bstat->bs_ino, agno, agino);
+       scrub_render_ino_descr(ctx, descr, DESCR_BUFSZ, bstat->bs_ino,
+                       bstat->bs_gen, NULL);
        errno = old_errno;
        str_errno(ctx, descr);
 }
index 99cd51b287b66125eb672fbd4d66b6a99068a237..279419071b6e19e1c36a141551685cf28d311ec9 100644 (file)
@@ -234,15 +234,11 @@ xfs_scrub_connections(
        bool                    *pmoveon = arg;
        char                    descr[DESCR_BUFSZ];
        bool                    moveon = true;
-       xfs_agnumber_t          agno;
-       xfs_agino_t             agino;
        int                     fd = -1;
        int                     error;
 
-       agno = cvt_ino_to_agno(&ctx->mnt, bstat->bs_ino);
-       agino = cvt_ino_to_agino(&ctx->mnt, bstat->bs_ino);
-       snprintf(descr, DESCR_BUFSZ, _("inode %"PRIu64" (%u/%u)"),
-                       (uint64_t)bstat->bs_ino, agno, agino);
+       scrub_render_ino_descr(ctx, descr, DESCR_BUFSZ, bstat->bs_ino,
+                       bstat->bs_gen, NULL);
        background_sleep();
 
        /* Warn about naming problems in xattrs. */
index 8063d6ce14ad7a9d3b8701dce769835833d9e2a8..2ce2a19ee4dfe0e97a771e48af15f704fc4778d6 100644 (file)
@@ -180,15 +180,15 @@ xfs_report_verify_inode(
        int                             fd;
        int                             error;
 
-       snprintf(descr, DESCR_BUFSZ, _("inode %"PRIu64" (unlinked)"),
-                       (uint64_t)bstat->bs_ino);
-
        /* Ignore linked files and things we can't open. */
        if (bstat->bs_nlink != 0)
                return 0;
        if (!S_ISREG(bstat->bs_mode) && !S_ISDIR(bstat->bs_mode))
                return 0;
 
+       scrub_render_ino_descr(ctx, descr, DESCR_BUFSZ,
+                       bstat->bs_ino, bstat->bs_gen, _("(unlinked)"));
+
        /* Try to open the inode. */
        fd = xfs_open_handle(handle);
        if (fd < 0) {
index d7a6b49b9b6ae551ca835a938bbe91e5fc6d045e..0293ce30602753cb9c25d827b9cb558e817a9e35 100644 (file)
 /* Format a scrub description. */
 static void
 format_scrub_descr(
+       struct scrub_ctx                *ctx,
        char                            *buf,
        size_t                          buflen,
-       struct xfs_scrub_metadata       *meta,
-       const struct xfrog_scrub_descr  *sc)
+       struct xfs_scrub_metadata       *meta)
 {
+       const struct xfrog_scrub_descr  *sc = &xfrog_scrubbers[meta->sm_type];
+
        switch (sc->type) {
        case XFROG_SCRUB_TYPE_AGHEADER:
        case XFROG_SCRUB_TYPE_PERAG:
@@ -38,8 +40,9 @@ format_scrub_descr(
                                _(sc->descr));
                break;
        case XFROG_SCRUB_TYPE_INODE:
-               snprintf(buf, buflen, _("Inode %"PRIu64" %s"),
-                               (uint64_t)meta->sm_ino, _(sc->descr));
+               scrub_render_ino_descr(ctx, buf, buflen,
+                               meta->sm_ino, meta->sm_gen, "%s",
+                               _(sc->descr));
                break;
        case XFROG_SCRUB_TYPE_FS:
                snprintf(buf, buflen, _("%s"), _(sc->descr));
@@ -123,8 +126,7 @@ xfs_check_metadata(
 
        assert(!debug_tweak_on("XFS_SCRUB_NO_KERNEL"));
        assert(meta->sm_type < XFS_SCRUB_TYPE_NR);
-       format_scrub_descr(buf, DESCR_BUFSZ, meta,
-                       &xfrog_scrubbers[meta->sm_type]);
+       format_scrub_descr(ctx, buf, DESCR_BUFSZ, meta);
 
        dbg_printf("check %s flags %xh\n", buf, meta->sm_flags);
 retry:
@@ -681,8 +683,7 @@ xfs_repair_metadata(
                return CHECK_RETRY;
 
        memcpy(&oldm, &meta, sizeof(oldm));
-       format_scrub_descr(buf, DESCR_BUFSZ, &meta,
-                       &xfrog_scrubbers[meta.sm_type]);
+       format_scrub_descr(ctx, buf, DESCR_BUFSZ, &meta);
 
        if (needs_repair(&meta))
                str_info(ctx, buf, _("Attempting repair."));