* xfsprogs: cleanup error injection @ 2025-09-15 13:33 Christoph Hellwig 2025-09-15 13:33 ` [PATCH 1/2] xfs: centralize error tag definitions Christoph Hellwig 2025-09-15 13:33 ` [PATCH 2/2] xfs_io: use the XFS_ERRTAG macro to generate injection targets Christoph Hellwig 0 siblings, 2 replies; 5+ messages in thread From: Christoph Hellwig @ 2025-09-15 13:33 UTC (permalink / raw) To: Andrey Albershteyn; +Cc: linux-xfs Hi all, this is the xfsprogs side of the error injection cleanup. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] xfs: centralize error tag definitions 2025-09-15 13:33 xfsprogs: cleanup error injection Christoph Hellwig @ 2025-09-15 13:33 ` Christoph Hellwig 2025-09-15 13:33 ` [PATCH 2/2] xfs_io: use the XFS_ERRTAG macro to generate injection targets Christoph Hellwig 1 sibling, 0 replies; 5+ messages in thread From: Christoph Hellwig @ 2025-09-15 13:33 UTC (permalink / raw) To: Andrey Albershteyn; +Cc: linux-xfs Source kernel commit: 52aeb4e21ee033a95798217e4cea3ac98cc442d7 Right now 5 places in the kernel and one in xfsprogs need to be updated for each new error tag. Add a bit of macro magic so that only the error tag definition and a single table, which reside next to each other, need to be updated. Signed-off-by: Christoph Hellwig <hch@lst.de> --- libxfs/xfs_errortag.h | 94 ++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 45 deletions(-) diff --git a/libxfs/xfs_errortag.h b/libxfs/xfs_errortag.h index a53c5d40e084..115b556f2238 100644 --- a/libxfs/xfs_errortag.h +++ b/libxfs/xfs_errortag.h @@ -4,7 +4,7 @@ * Copyright (C) 2017 Oracle. * All Rights Reserved. */ -#ifndef __XFS_ERRORTAG_H_ +#if !defined(__XFS_ERRORTAG_H_) || defined(XFS_ERRTAG) #define __XFS_ERRORTAG_H_ /* @@ -71,49 +71,53 @@ * Random factors for above tags, 1 means always, 2 means 1/2 time, etc. */ #define XFS_RANDOM_DEFAULT 100 -#define XFS_RANDOM_IFLUSH_1 XFS_RANDOM_DEFAULT -#define XFS_RANDOM_IFLUSH_2 XFS_RANDOM_DEFAULT -#define XFS_RANDOM_IFLUSH_3 XFS_RANDOM_DEFAULT -#define XFS_RANDOM_IFLUSH_4 XFS_RANDOM_DEFAULT -#define XFS_RANDOM_IFLUSH_5 XFS_RANDOM_DEFAULT -#define XFS_RANDOM_IFLUSH_6 XFS_RANDOM_DEFAULT -#define XFS_RANDOM_DA_READ_BUF XFS_RANDOM_DEFAULT -#define XFS_RANDOM_BTREE_CHECK_LBLOCK (XFS_RANDOM_DEFAULT/4) -#define XFS_RANDOM_BTREE_CHECK_SBLOCK XFS_RANDOM_DEFAULT -#define XFS_RANDOM_ALLOC_READ_AGF XFS_RANDOM_DEFAULT -#define XFS_RANDOM_IALLOC_READ_AGI XFS_RANDOM_DEFAULT -#define XFS_RANDOM_ITOBP_INOTOBP XFS_RANDOM_DEFAULT -#define XFS_RANDOM_IUNLINK XFS_RANDOM_DEFAULT -#define XFS_RANDOM_IUNLINK_REMOVE XFS_RANDOM_DEFAULT -#define XFS_RANDOM_DIR_INO_VALIDATE XFS_RANDOM_DEFAULT -#define XFS_RANDOM_BULKSTAT_READ_CHUNK XFS_RANDOM_DEFAULT -#define XFS_RANDOM_IODONE_IOERR (XFS_RANDOM_DEFAULT/10) -#define XFS_RANDOM_STRATREAD_IOERR (XFS_RANDOM_DEFAULT/10) -#define XFS_RANDOM_STRATCMPL_IOERR (XFS_RANDOM_DEFAULT/10) -#define XFS_RANDOM_DIOWRITE_IOERR (XFS_RANDOM_DEFAULT/10) -#define XFS_RANDOM_BMAPIFORMAT XFS_RANDOM_DEFAULT -#define XFS_RANDOM_FREE_EXTENT 1 -#define XFS_RANDOM_RMAP_FINISH_ONE 1 -#define XFS_RANDOM_REFCOUNT_CONTINUE_UPDATE 1 -#define XFS_RANDOM_REFCOUNT_FINISH_ONE 1 -#define XFS_RANDOM_BMAP_FINISH_ONE 1 -#define XFS_RANDOM_AG_RESV_CRITICAL 4 -#define XFS_RANDOM_LOG_BAD_CRC 1 -#define XFS_RANDOM_LOG_ITEM_PIN 1 -#define XFS_RANDOM_BUF_LRU_REF 2 -#define XFS_RANDOM_FORCE_SCRUB_REPAIR 1 -#define XFS_RANDOM_FORCE_SUMMARY_RECALC 1 -#define XFS_RANDOM_IUNLINK_FALLBACK (XFS_RANDOM_DEFAULT/10) -#define XFS_RANDOM_BUF_IOERROR XFS_RANDOM_DEFAULT -#define XFS_RANDOM_REDUCE_MAX_IEXTENTS 1 -#define XFS_RANDOM_BMAP_ALLOC_MINLEN_EXTENT 1 -#define XFS_RANDOM_AG_RESV_FAIL 1 -#define XFS_RANDOM_LARP 1 -#define XFS_RANDOM_DA_LEAF_SPLIT 1 -#define XFS_RANDOM_ATTR_LEAF_TO_NODE 1 -#define XFS_RANDOM_WB_DELAY_MS 3000 -#define XFS_RANDOM_WRITE_DELAY_MS 3000 -#define XFS_RANDOM_EXCHMAPS_FINISH_ONE 1 -#define XFS_RANDOM_METAFILE_RESV_CRITICAL 4 + +#define XFS_ERRTAGS \ +XFS_ERRTAG(NOERROR, noerror, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(IFLUSH_1, iflush1, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(IFLUSH_2, iflush2, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(IFLUSH_3, iflush3, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(IFLUSH_4, iflush4, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(IFLUSH_5, iflush5, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(IFLUSH_6, iflush6, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(DA_READ_BUF, dareadbuf, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(BTREE_CHECK_LBLOCK, btree_chk_lblk, XFS_RANDOM_DEFAULT/4) \ +XFS_ERRTAG(BTREE_CHECK_SBLOCK, btree_chk_sblk, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(ALLOC_READ_AGF, readagf, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(IALLOC_READ_AGI, readagi, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(ITOBP_INOTOBP, itobp, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(IUNLINK, iunlink, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(IUNLINK_REMOVE, iunlinkrm, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(DIR_INO_VALIDATE, dirinovalid, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(BULKSTAT_READ_CHUNK, bulkstat, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(IODONE_IOERR, logiodone, XFS_RANDOM_DEFAULT/10) \ +XFS_ERRTAG(STRATREAD_IOERR, stratread, XFS_RANDOM_DEFAULT/10) \ +XFS_ERRTAG(STRATCMPL_IOERR, stratcmpl, XFS_RANDOM_DEFAULT/10) \ +XFS_ERRTAG(DIOWRITE_IOERR, diowrite, XFS_RANDOM_DEFAULT/10) \ +XFS_ERRTAG(BMAPIFORMAT, bmapifmt, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(FREE_EXTENT, free_extent, 1) \ +XFS_ERRTAG(RMAP_FINISH_ONE, rmap_finish_one, 1) \ +XFS_ERRTAG(REFCOUNT_CONTINUE_UPDATE, \ + refcount_continue_update, 1) \ +XFS_ERRTAG(REFCOUNT_FINISH_ONE, refcount_finish_one, 1) \ +XFS_ERRTAG(BMAP_FINISH_ONE, bmap_finish_one, 1) \ +XFS_ERRTAG(AG_RESV_CRITICAL, ag_resv_critical, 4) \ +XFS_ERRTAG(LOG_BAD_CRC, log_bad_crc, 1) \ +XFS_ERRTAG(LOG_ITEM_PIN, log_item_pin, 1) \ +XFS_ERRTAG(BUF_LRU_REF, buf_lru_ref, 2) \ +XFS_ERRTAG(FORCE_SCRUB_REPAIR, force_repair, 1) \ +XFS_ERRTAG(FORCE_SUMMARY_RECALC, bad_summary, 1) \ +XFS_ERRTAG(IUNLINK_FALLBACK, iunlink_fallback, XFS_RANDOM_DEFAULT/10) \ +XFS_ERRTAG(BUF_IOERROR, buf_ioerror, XFS_RANDOM_DEFAULT) \ +XFS_ERRTAG(REDUCE_MAX_IEXTENTS, reduce_max_iextents, 1) \ +XFS_ERRTAG(BMAP_ALLOC_MINLEN_EXTENT, bmap_alloc_minlen_extent, 1) \ +XFS_ERRTAG(AG_RESV_FAIL, ag_resv_fail, 1) \ +XFS_ERRTAG(LARP, larp, 1) \ +XFS_ERRTAG(DA_LEAF_SPLIT, da_leaf_split, 1) \ +XFS_ERRTAG(ATTR_LEAF_TO_NODE, attr_leaf_to_node, 1) \ +XFS_ERRTAG(WB_DELAY_MS, wb_delay_ms, 3000) \ +XFS_ERRTAG(WRITE_DELAY_MS, write_delay_ms, 3000) \ +XFS_ERRTAG(EXCHMAPS_FINISH_ONE, exchmaps_finish_one, 1) \ +XFS_ERRTAG(METAFILE_RESV_CRITICAL, metafile_resv_crit, 4) \ #endif /* __XFS_ERRORTAG_H_ */ -- 2.47.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] xfs_io: use the XFS_ERRTAG macro to generate injection targets 2025-09-15 13:33 xfsprogs: cleanup error injection Christoph Hellwig 2025-09-15 13:33 ` [PATCH 1/2] xfs: centralize error tag definitions Christoph Hellwig @ 2025-09-15 13:33 ` Christoph Hellwig 2025-09-15 19:11 ` Darrick J. Wong 1 sibling, 1 reply; 5+ messages in thread From: Christoph Hellwig @ 2025-09-15 13:33 UTC (permalink / raw) To: Andrey Albershteyn; +Cc: linux-xfs Use the new magic macro table provided by libxfs to autogenerate the list of valid error injection targets. Signed-off-by: Christoph Hellwig <hch@lst.de> --- io/inject.c | 108 +++++++++++++++++----------------------------------- 1 file changed, 35 insertions(+), 73 deletions(-) diff --git a/io/inject.c b/io/inject.c index 7b9a76406cc5..99186c081230 100644 --- a/io/inject.c +++ b/io/inject.c @@ -12,89 +12,49 @@ static cmdinfo_t inject_cmd; +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#define __stringify_1(x...) #x +#define __stringify(x...) __stringify_1(x) + +#define XFS_ERRTAG(_tag, _name, _default) \ + [XFS_ERRTAG_##_tag] = __stringify(_name), +#include "xfs_errortag.h" +static const char *tag_names[] = { XFS_ERRTAGS }; +#undef XFS_ERRTAG + +/* Search for a name */ static int -error_tag(char *name) +error_tag( + char *name) { - static struct { - int tag; - char *name; - } *e, eflags[] = { - { XFS_ERRTAG_NOERROR, "noerror" }, - { XFS_ERRTAG_IFLUSH_1, "iflush1" }, - { XFS_ERRTAG_IFLUSH_2, "iflush2" }, - { XFS_ERRTAG_IFLUSH_3, "iflush3" }, - { XFS_ERRTAG_IFLUSH_4, "iflush4" }, - { XFS_ERRTAG_IFLUSH_5, "iflush5" }, - { XFS_ERRTAG_IFLUSH_6, "iflush6" }, - { XFS_ERRTAG_DA_READ_BUF, "dareadbuf" }, - { XFS_ERRTAG_BTREE_CHECK_LBLOCK, "btree_chk_lblk" }, - { XFS_ERRTAG_BTREE_CHECK_SBLOCK, "btree_chk_sblk" }, - { XFS_ERRTAG_ALLOC_READ_AGF, "readagf" }, - { XFS_ERRTAG_IALLOC_READ_AGI, "readagi" }, - { XFS_ERRTAG_ITOBP_INOTOBP, "itobp" }, - { XFS_ERRTAG_IUNLINK, "iunlink" }, - { XFS_ERRTAG_IUNLINK_REMOVE, "iunlinkrm" }, - { XFS_ERRTAG_DIR_INO_VALIDATE, "dirinovalid" }, - { XFS_ERRTAG_BULKSTAT_READ_CHUNK, "bulkstat" }, - { XFS_ERRTAG_IODONE_IOERR, "logiodone" }, - { XFS_ERRTAG_STRATREAD_IOERR, "stratread" }, - { XFS_ERRTAG_STRATCMPL_IOERR, "stratcmpl" }, - { XFS_ERRTAG_DIOWRITE_IOERR, "diowrite" }, - { XFS_ERRTAG_BMAPIFORMAT, "bmapifmt" }, - { XFS_ERRTAG_FREE_EXTENT, "free_extent" }, - { XFS_ERRTAG_RMAP_FINISH_ONE, "rmap_finish_one" }, - { XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE, "refcount_continue_update" }, - { XFS_ERRTAG_REFCOUNT_FINISH_ONE, "refcount_finish_one" }, - { XFS_ERRTAG_BMAP_FINISH_ONE, "bmap_finish_one" }, - { XFS_ERRTAG_AG_RESV_CRITICAL, "ag_resv_critical" }, - { XFS_ERRTAG_DROP_WRITES, "drop_writes" }, - { XFS_ERRTAG_LOG_BAD_CRC, "log_bad_crc" }, - { XFS_ERRTAG_LOG_ITEM_PIN, "log_item_pin" }, - { XFS_ERRTAG_BUF_LRU_REF, "buf_lru_ref" }, - { XFS_ERRTAG_FORCE_SCRUB_REPAIR, "force_repair" }, - { XFS_ERRTAG_FORCE_SUMMARY_RECALC, "bad_summary" }, - { XFS_ERRTAG_IUNLINK_FALLBACK, "iunlink_fallback" }, - { XFS_ERRTAG_BUF_IOERROR, "buf_ioerror" }, - { XFS_ERRTAG_REDUCE_MAX_IEXTENTS, "reduce_max_iextents" }, - { XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTENT, "bmap_alloc_minlen_extent" }, - { XFS_ERRTAG_AG_RESV_FAIL, "ag_resv_fail" }, - { XFS_ERRTAG_LARP, "larp" }, - { XFS_ERRTAG_DA_LEAF_SPLIT, "da_leaf_split" }, - { XFS_ERRTAG_ATTR_LEAF_TO_NODE, "attr_leaf_to_node" }, - { XFS_ERRTAG_WB_DELAY_MS, "wb_delay_ms" }, - { XFS_ERRTAG_WRITE_DELAY_MS, "write_delay_ms" }, - { XFS_ERRTAG_EXCHMAPS_FINISH_ONE, "exchmaps_finish_one" }, - { XFS_ERRTAG_METAFILE_RESV_CRITICAL, "metafile_resv_crit" }, - { XFS_ERRTAG_MAX, NULL } - }; - int count; + unsigned int i; - /* - * If this fails make sure every tag is defined in the array above, - * see xfs_errortag_attrs in kernelspace. - */ - BUILD_BUG_ON(sizeof(eflags) != (XFS_ERRTAG_MAX + 1) * sizeof(*e)); + for (i = 0; i < ARRAY_SIZE(tag_names); i++) + if (tag_names[i] && strcmp(name, tag_names[i]) == 0) + return i; + return -1; +} - /* Search for a name */ - if (name) { - for (e = eflags; e->name; e++) - if (strcmp(name, e->name) == 0) - return e->tag; - return -1; - } +/* Dump all the names */ +static void +list_tags(void) +{ + unsigned int count = 0, i; - /* Dump all the names */ fputs("tags: [ ", stdout); - for (count = 0, e = eflags; e->name; e++, count++) { - if (count) { + for (i = 0; i < ARRAY_SIZE(tag_names); i++) { + if (count > 0) { fputs(", ", stdout); if (!(count % 5)) fputs("\n\t", stdout); } - fputs(e->name, stdout); + if (tag_names[i]) { + fputs(tag_names[i], stdout); + count++; + } + } fputs(" ]\n", stdout); - return 0; } static void @@ -121,8 +81,10 @@ inject_f( xfs_error_injection_t error; int command = XFS_IOC_ERROR_INJECTION; - if (argc == 1) - return error_tag(NULL); + if (argc == 1) { + list_tags(); + return 0; + } while (--argc > 0) { error.fd = file->fd; -- 2.47.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] xfs_io: use the XFS_ERRTAG macro to generate injection targets 2025-09-15 13:33 ` [PATCH 2/2] xfs_io: use the XFS_ERRTAG macro to generate injection targets Christoph Hellwig @ 2025-09-15 19:11 ` Darrick J. Wong 2025-09-15 20:51 ` Christoph Hellwig 0 siblings, 1 reply; 5+ messages in thread From: Darrick J. Wong @ 2025-09-15 19:11 UTC (permalink / raw) To: Christoph Hellwig; +Cc: Andrey Albershteyn, linux-xfs On Mon, Sep 15, 2025 at 06:33:17AM -0700, Christoph Hellwig wrote: > Use the new magic macro table provided by libxfs to autogenerate > the list of valid error injection targets. > > Signed-off-by: Christoph Hellwig <hch@lst.de> With this applied we no longer have to manually update inject.c every time we do a libxfs port too, right? If yes, then Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> --D > --- > io/inject.c | 108 +++++++++++++++++----------------------------------- > 1 file changed, 35 insertions(+), 73 deletions(-) > > diff --git a/io/inject.c b/io/inject.c > index 7b9a76406cc5..99186c081230 100644 > --- a/io/inject.c > +++ b/io/inject.c > @@ -12,89 +12,49 @@ > > static cmdinfo_t inject_cmd; > > +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) > +#define __stringify_1(x...) #x > +#define __stringify(x...) __stringify_1(x) > + > +#define XFS_ERRTAG(_tag, _name, _default) \ > + [XFS_ERRTAG_##_tag] = __stringify(_name), > +#include "xfs_errortag.h" > +static const char *tag_names[] = { XFS_ERRTAGS }; > +#undef XFS_ERRTAG > + > +/* Search for a name */ > static int > -error_tag(char *name) > +error_tag( > + char *name) > { > - static struct { > - int tag; > - char *name; > - } *e, eflags[] = { > - { XFS_ERRTAG_NOERROR, "noerror" }, > - { XFS_ERRTAG_IFLUSH_1, "iflush1" }, > - { XFS_ERRTAG_IFLUSH_2, "iflush2" }, > - { XFS_ERRTAG_IFLUSH_3, "iflush3" }, > - { XFS_ERRTAG_IFLUSH_4, "iflush4" }, > - { XFS_ERRTAG_IFLUSH_5, "iflush5" }, > - { XFS_ERRTAG_IFLUSH_6, "iflush6" }, > - { XFS_ERRTAG_DA_READ_BUF, "dareadbuf" }, > - { XFS_ERRTAG_BTREE_CHECK_LBLOCK, "btree_chk_lblk" }, > - { XFS_ERRTAG_BTREE_CHECK_SBLOCK, "btree_chk_sblk" }, > - { XFS_ERRTAG_ALLOC_READ_AGF, "readagf" }, > - { XFS_ERRTAG_IALLOC_READ_AGI, "readagi" }, > - { XFS_ERRTAG_ITOBP_INOTOBP, "itobp" }, > - { XFS_ERRTAG_IUNLINK, "iunlink" }, > - { XFS_ERRTAG_IUNLINK_REMOVE, "iunlinkrm" }, > - { XFS_ERRTAG_DIR_INO_VALIDATE, "dirinovalid" }, > - { XFS_ERRTAG_BULKSTAT_READ_CHUNK, "bulkstat" }, > - { XFS_ERRTAG_IODONE_IOERR, "logiodone" }, > - { XFS_ERRTAG_STRATREAD_IOERR, "stratread" }, > - { XFS_ERRTAG_STRATCMPL_IOERR, "stratcmpl" }, > - { XFS_ERRTAG_DIOWRITE_IOERR, "diowrite" }, > - { XFS_ERRTAG_BMAPIFORMAT, "bmapifmt" }, > - { XFS_ERRTAG_FREE_EXTENT, "free_extent" }, > - { XFS_ERRTAG_RMAP_FINISH_ONE, "rmap_finish_one" }, > - { XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE, "refcount_continue_update" }, > - { XFS_ERRTAG_REFCOUNT_FINISH_ONE, "refcount_finish_one" }, > - { XFS_ERRTAG_BMAP_FINISH_ONE, "bmap_finish_one" }, > - { XFS_ERRTAG_AG_RESV_CRITICAL, "ag_resv_critical" }, > - { XFS_ERRTAG_DROP_WRITES, "drop_writes" }, > - { XFS_ERRTAG_LOG_BAD_CRC, "log_bad_crc" }, > - { XFS_ERRTAG_LOG_ITEM_PIN, "log_item_pin" }, > - { XFS_ERRTAG_BUF_LRU_REF, "buf_lru_ref" }, > - { XFS_ERRTAG_FORCE_SCRUB_REPAIR, "force_repair" }, > - { XFS_ERRTAG_FORCE_SUMMARY_RECALC, "bad_summary" }, > - { XFS_ERRTAG_IUNLINK_FALLBACK, "iunlink_fallback" }, > - { XFS_ERRTAG_BUF_IOERROR, "buf_ioerror" }, > - { XFS_ERRTAG_REDUCE_MAX_IEXTENTS, "reduce_max_iextents" }, > - { XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTENT, "bmap_alloc_minlen_extent" }, > - { XFS_ERRTAG_AG_RESV_FAIL, "ag_resv_fail" }, > - { XFS_ERRTAG_LARP, "larp" }, > - { XFS_ERRTAG_DA_LEAF_SPLIT, "da_leaf_split" }, > - { XFS_ERRTAG_ATTR_LEAF_TO_NODE, "attr_leaf_to_node" }, > - { XFS_ERRTAG_WB_DELAY_MS, "wb_delay_ms" }, > - { XFS_ERRTAG_WRITE_DELAY_MS, "write_delay_ms" }, > - { XFS_ERRTAG_EXCHMAPS_FINISH_ONE, "exchmaps_finish_one" }, > - { XFS_ERRTAG_METAFILE_RESV_CRITICAL, "metafile_resv_crit" }, > - { XFS_ERRTAG_MAX, NULL } > - }; > - int count; > + unsigned int i; > > - /* > - * If this fails make sure every tag is defined in the array above, > - * see xfs_errortag_attrs in kernelspace. > - */ > - BUILD_BUG_ON(sizeof(eflags) != (XFS_ERRTAG_MAX + 1) * sizeof(*e)); > + for (i = 0; i < ARRAY_SIZE(tag_names); i++) > + if (tag_names[i] && strcmp(name, tag_names[i]) == 0) > + return i; > + return -1; > +} > > - /* Search for a name */ > - if (name) { > - for (e = eflags; e->name; e++) > - if (strcmp(name, e->name) == 0) > - return e->tag; > - return -1; > - } > +/* Dump all the names */ > +static void > +list_tags(void) > +{ > + unsigned int count = 0, i; > > - /* Dump all the names */ > fputs("tags: [ ", stdout); > - for (count = 0, e = eflags; e->name; e++, count++) { > - if (count) { > + for (i = 0; i < ARRAY_SIZE(tag_names); i++) { > + if (count > 0) { > fputs(", ", stdout); > if (!(count % 5)) > fputs("\n\t", stdout); > } > - fputs(e->name, stdout); > + if (tag_names[i]) { > + fputs(tag_names[i], stdout); > + count++; > + } > + > } > fputs(" ]\n", stdout); > - return 0; > } > > static void > @@ -121,8 +81,10 @@ inject_f( > xfs_error_injection_t error; > int command = XFS_IOC_ERROR_INJECTION; > > - if (argc == 1) > - return error_tag(NULL); > + if (argc == 1) { > + list_tags(); > + return 0; > + } > > while (--argc > 0) { > error.fd = file->fd; > -- > 2.47.2 > > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] xfs_io: use the XFS_ERRTAG macro to generate injection targets 2025-09-15 19:11 ` Darrick J. Wong @ 2025-09-15 20:51 ` Christoph Hellwig 0 siblings, 0 replies; 5+ messages in thread From: Christoph Hellwig @ 2025-09-15 20:51 UTC (permalink / raw) To: Darrick J. Wong; +Cc: Christoph Hellwig, Andrey Albershteyn, linux-xfs On Mon, Sep 15, 2025 at 12:11:15PM -0700, Darrick J. Wong wrote: > On Mon, Sep 15, 2025 at 06:33:17AM -0700, Christoph Hellwig wrote: > > Use the new magic macro table provided by libxfs to autogenerate > > the list of valid error injection targets. > > > > Signed-off-by: Christoph Hellwig <hch@lst.de> > > With this applied we no longer have to manually update inject.c every > time we do a libxfs port too, right? Exactly. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-09-15 20:51 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-09-15 13:33 xfsprogs: cleanup error injection Christoph Hellwig 2025-09-15 13:33 ` [PATCH 1/2] xfs: centralize error tag definitions Christoph Hellwig 2025-09-15 13:33 ` [PATCH 2/2] xfs_io: use the XFS_ERRTAG macro to generate injection targets Christoph Hellwig 2025-09-15 19:11 ` Darrick J. Wong 2025-09-15 20:51 ` Christoph Hellwig
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox