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