]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blame - io/inject.c
xfs: Add helper function xfs_init_attr_trans
[thirdparty/xfsprogs-dev.git] / io / inject.c
CommitLineData
959ef981 1// SPDX-License-Identifier: GPL-2.0
48c46ee3 2/*
da23017d
NS
3 * Copyright (c) 2004-2005 Silicon Graphics, Inc.
4 * All Rights Reserved.
48c46ee3
NS
5 */
6
6b803e5a
CH
7#include "command.h"
8#include "input.h"
48c46ee3
NS
9#include "init.h"
10#include "io.h"
904d9719 11#include "xfs_errortag.h"
48c46ee3
NS
12
13static cmdinfo_t inject_cmd;
14
15static int
16error_tag(char *name)
17{
18 static struct {
19 int tag;
20 char *name;
fc60b66d 21 } *e, eflags[] = {
48c46ee3 22 { XFS_ERRTAG_NOERROR, "noerror" },
48c46ee3 23 { XFS_ERRTAG_IFLUSH_1, "iflush1" },
48c46ee3 24 { XFS_ERRTAG_IFLUSH_2, "iflush2" },
48c46ee3 25 { XFS_ERRTAG_IFLUSH_3, "iflush3" },
48c46ee3 26 { XFS_ERRTAG_IFLUSH_4, "iflush4" },
48c46ee3 27 { XFS_ERRTAG_IFLUSH_5, "iflush5" },
48c46ee3 28 { XFS_ERRTAG_IFLUSH_6, "iflush6" },
48c46ee3 29 { XFS_ERRTAG_DA_READ_BUF, "dareadbuf" },
48c46ee3 30 { XFS_ERRTAG_BTREE_CHECK_LBLOCK, "btree_chk_lblk" },
48c46ee3 31 { XFS_ERRTAG_BTREE_CHECK_SBLOCK, "btree_chk_sblk" },
48c46ee3 32 { XFS_ERRTAG_ALLOC_READ_AGF, "readagf" },
48c46ee3 33 { XFS_ERRTAG_IALLOC_READ_AGI, "readagi" },
48c46ee3 34 { XFS_ERRTAG_ITOBP_INOTOBP, "itobp" },
48c46ee3 35 { XFS_ERRTAG_IUNLINK, "iunlink" },
48c46ee3 36 { XFS_ERRTAG_IUNLINK_REMOVE, "iunlinkrm" },
48c46ee3 37 { XFS_ERRTAG_DIR_INO_VALIDATE, "dirinovalid" },
48c46ee3 38 { XFS_ERRTAG_BULKSTAT_READ_CHUNK, "bulkstat" },
48c46ee3 39 { XFS_ERRTAG_IODONE_IOERR, "logiodone" },
48c46ee3 40 { XFS_ERRTAG_STRATREAD_IOERR, "stratread" },
48c46ee3 41 { XFS_ERRTAG_STRATCMPL_IOERR, "stratcmpl" },
48c46ee3 42 { XFS_ERRTAG_DIOWRITE_IOERR, "diowrite" },
48c46ee3 43 { XFS_ERRTAG_BMAPIFORMAT, "bmapifmt" },
80afb9a4 44 { XFS_ERRTAG_FREE_EXTENT, "free_extent" },
dea764e0 45 { XFS_ERRTAG_RMAP_FINISH_ONE, "rmap_finish_one" },
a136ec62 46 { XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE, "refcount_continue_update" },
a136ec62 47 { XFS_ERRTAG_REFCOUNT_FINISH_ONE, "refcount_finish_one" },
a136ec62 48 { XFS_ERRTAG_BMAP_FINISH_ONE, "bmap_finish_one" },
e00481b1 49 { XFS_ERRTAG_AG_RESV_CRITICAL, "ag_resv_critical" },
18146cc2 50 { XFS_ERRTAG_DROP_WRITES, "drop_writes" },
18146cc2 51 { XFS_ERRTAG_LOG_BAD_CRC, "log_bad_crc" },
18146cc2 52 { XFS_ERRTAG_LOG_ITEM_PIN, "log_item_pin" },
fc60b66d 53 { XFS_ERRTAG_BUF_LRU_REF, "buf_lru_ref" },
52818844 54 { XFS_ERRTAG_FORCE_SCRUB_REPAIR, "force_repair" },
b09a5970 55 { XFS_ERRTAG_FORCE_SUMMARY_RECALC, "bad_summary" },
d9fa4408 56 { XFS_ERRTAG_IUNLINK_FALLBACK, "iunlink_fallback" },
3acdd264 57 { XFS_ERRTAG_BUF_IOERROR, "buf_ioerror" },
b88613bd 58 { XFS_ERRTAG_REDUCE_MAX_IEXTENTS, "reduce_max_iextents" },
3006cea4 59 { XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTENT, "bmap_alloc_minlen_extent" },
c4add24c 60 { XFS_ERRTAG_AG_RESV_FAIL, "ag_resv_fail" },
a2832031 61 { XFS_ERRTAG_LARP, "larp" },
48c46ee3
NS
62 { XFS_ERRTAG_MAX, NULL }
63 };
64 int count;
65
b09a5970
DW
66 /*
67 * If this fails make sure every tag is defined in the array above,
68 * see xfs_errortag_attrs in kernelspace.
69 */
fc60b66d
ES
70 BUILD_BUG_ON(sizeof(eflags) != (XFS_ERRTAG_MAX + 1) * sizeof(*e));
71
48c46ee3
NS
72 /* Search for a name */
73 if (name) {
74 for (e = eflags; e->name; e++)
75 if (strcmp(name, e->name) == 0)
76 return e->tag;
77 return -1;
78 }
79
80 /* Dump all the names */
81 fputs("tags: [ ", stdout);
82 for (count = 0, e = eflags; e->name; e++, count++) {
83 if (count) {
84 fputs(", ", stdout);
85 if (!(count % 5))
86 fputs("\n\t", stdout);
87 }
88 fputs(e->name, stdout);
89 }
90 fputs(" ]\n", stdout);
91 return 0;
92}
93
94static void
95inject_help(void)
96{
97 printf(_(
98"\n"
99" inject errors into the filesystem of the currently open file\n"
100"\n"
101" Example:\n"
102" 'inject readagf' - cause errors on allocation group freespace reads\n"
103"\n"
104" Causes the kernel to generate and react to errors within XFS, provided\n"
105" the XFS kernel code has been built with debugging features enabled.\n"
106" With no arguments, displays the list of error injection tags.\n"
107"\n"));
108}
109
110static int
111inject_f(
112 int argc,
113 char **argv)
114{
115 xfs_error_injection_t error;
116 int command = XFS_IOC_ERROR_INJECTION;
117
118 if (argc == 1)
119 return error_tag(NULL);
120
121 while (--argc > 0) {
122 error.fd = file->fd;
123 if ((error.errtag = error_tag(argv[argc])) < 0) {
124 fprintf(stderr, _("no such tag -- %s\n"), argv[1]);
125 continue;
126 }
127 if (error.errtag == XFS_ERRTAG_NOERROR)
128 command = XFS_IOC_ERROR_CLEARALL;
129 if ((xfsctl(file->name, file->fd, command, &error)) < 0) {
130 perror("XFS_IOC_ERROR_INJECTION");
9e1595e6 131 exitcode = 1;
48c46ee3
NS
132 continue;
133 }
134 }
135 return 0;
136}
137
138void
139inject_init(void)
140{
ad765595 141 inject_cmd.name = "inject";
48c46ee3
NS
142 inject_cmd.cfunc = inject_f;
143 inject_cmd.argmin = 0;
144 inject_cmd.argmax = -1;
16bf0464 145 inject_cmd.flags = CMD_NOMAP_OK | CMD_FLAG_ONESHOT;
48c46ee3
NS
146 inject_cmd.args = _("[tag ...]");
147 inject_cmd.oneline = _("inject errors into a filesystem");
148 inject_cmd.help = inject_help;
149
150 if (expert)
151 add_command(&inject_cmd);
152}