]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blame - io/inject.c
xfs: introduce xfs_ag_shrink_space()
[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" },
48c46ee3
NS
60 { XFS_ERRTAG_MAX, NULL }
61 };
62 int count;
63
b09a5970
DW
64 /*
65 * If this fails make sure every tag is defined in the array above,
66 * see xfs_errortag_attrs in kernelspace.
67 */
fc60b66d
ES
68 BUILD_BUG_ON(sizeof(eflags) != (XFS_ERRTAG_MAX + 1) * sizeof(*e));
69
48c46ee3
NS
70 /* Search for a name */
71 if (name) {
72 for (e = eflags; e->name; e++)
73 if (strcmp(name, e->name) == 0)
74 return e->tag;
75 return -1;
76 }
77
78 /* Dump all the names */
79 fputs("tags: [ ", stdout);
80 for (count = 0, e = eflags; e->name; e++, count++) {
81 if (count) {
82 fputs(", ", stdout);
83 if (!(count % 5))
84 fputs("\n\t", stdout);
85 }
86 fputs(e->name, stdout);
87 }
88 fputs(" ]\n", stdout);
89 return 0;
90}
91
92static void
93inject_help(void)
94{
95 printf(_(
96"\n"
97" inject errors into the filesystem of the currently open file\n"
98"\n"
99" Example:\n"
100" 'inject readagf' - cause errors on allocation group freespace reads\n"
101"\n"
102" Causes the kernel to generate and react to errors within XFS, provided\n"
103" the XFS kernel code has been built with debugging features enabled.\n"
104" With no arguments, displays the list of error injection tags.\n"
105"\n"));
106}
107
108static int
109inject_f(
110 int argc,
111 char **argv)
112{
113 xfs_error_injection_t error;
114 int command = XFS_IOC_ERROR_INJECTION;
115
116 if (argc == 1)
117 return error_tag(NULL);
118
119 while (--argc > 0) {
120 error.fd = file->fd;
121 if ((error.errtag = error_tag(argv[argc])) < 0) {
122 fprintf(stderr, _("no such tag -- %s\n"), argv[1]);
123 continue;
124 }
125 if (error.errtag == XFS_ERRTAG_NOERROR)
126 command = XFS_IOC_ERROR_CLEARALL;
127 if ((xfsctl(file->name, file->fd, command, &error)) < 0) {
128 perror("XFS_IOC_ERROR_INJECTION");
9e1595e6 129 exitcode = 1;
48c46ee3
NS
130 continue;
131 }
132 }
133 return 0;
134}
135
136void
137inject_init(void)
138{
ad765595 139 inject_cmd.name = "inject";
48c46ee3
NS
140 inject_cmd.cfunc = inject_f;
141 inject_cmd.argmin = 0;
142 inject_cmd.argmax = -1;
16bf0464 143 inject_cmd.flags = CMD_NOMAP_OK | CMD_FLAG_ONESHOT;
48c46ee3
NS
144 inject_cmd.args = _("[tag ...]");
145 inject_cmd.oneline = _("inject errors into a filesystem");
146 inject_cmd.help = inject_help;
147
148 if (expert)
149 add_command(&inject_cmd);
150}