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