]> git.ipfire.org Git - thirdparty/e2fsprogs.git/blame - e2fsck/problem.c
ADD TAG: E2FSPROGS-1_23-WIP-0722
[thirdparty/e2fsprogs.git] / e2fsck / problem.c
CommitLineData
21c84b71
TT
1/*
2 * problem.c --- report filesystem problems to the user
3 *
4 * Copyright 1996, 1997 by Theodore Ts'o
5 *
6 * %Begin-Header%
7 * This file may be redistributed under the terms of the GNU Public
8 * License.
9 * %End-Header%
10 */
11
12#include <stdlib.h>
13#include <unistd.h>
14#include <string.h>
15#include <ctype.h>
16#include <termios.h>
17
18#include "e2fsck.h"
19
20#include "problem.h"
f8188fff 21#include "problemP.h"
21c84b71 22
1b6bf175
TT
23#define PROMPT_NONE 0
24#define PROMPT_FIX 1
25#define PROMPT_CLEAR 2
26#define PROMPT_RELOCATE 3
27#define PROMPT_ALLOCATE 4
28#define PROMPT_EXPAND 5
29#define PROMPT_CONNECT 6
30#define PROMPT_CREATE 7
31#define PROMPT_SALVAGE 8
32#define PROMPT_TRUNCATE 9
33#define PROMPT_CLEAR_INODE 10
34#define PROMPT_ABORT 11
35#define PROMPT_SPLIT 12
36#define PROMPT_CONTINUE 13
37#define PROMPT_CLONE 14
38#define PROMPT_DELETE 15
f8188fff 39#define PROMPT_SUPPRESS 16
4a9f5936 40#define PROMPT_UNLINK 17
21c84b71
TT
41
42/*
43 * These are the prompts which are used to ask the user if they want
44 * to fix a problem.
45 */
46static const char *prompt[] = {
0c4a0726
TT
47 N_("(no prompt)"), /* 0 */
48 N_("Fix"), /* 1 */
49 N_("Clear"), /* 2 */
50 N_("Relocate"), /* 3 */
51 N_("Allocate"), /* 4 */
52 N_("Expand"), /* 5 */
53 N_("Connect to /lost+found"), /* 6 */
54 N_("Create"), /* 7 */
55 N_("Salvage"), /* 8 */
56 N_("Truncate"), /* 9 */
57 N_("Clear inode"), /* 10 */
58 N_("Abort"), /* 11 */
59 N_("Split"), /* 12 */
60 N_("Continue"), /* 13 */
61 N_("Clone duplicate/bad blocks"), /* 14 */
62 N_("Delete file"), /* 15 */
63 N_("Suppress messages"),/* 16 */
64 N_("Unlink"), /* 17 */
1b6bf175 65};
21c84b71
TT
66
67/*
68 * These messages are printed when we are preen mode and we will be
69 * automatically fixing the problem.
70 */
71static const char *preen_msg[] = {
0c4a0726
TT
72 N_("(NONE)"), /* 0 */
73 N_("FIXED"), /* 1 */
74 N_("CLEARED"), /* 2 */
75 N_("RELOCATED"), /* 3 */
76 N_("ALLOCATED"), /* 4 */
77 N_("EXPANDED"), /* 5 */
78 N_("RECONNECTED"), /* 6 */
79 N_("CREATED"), /* 7 */
80 N_("SALVAGED"), /* 8 */
81 N_("TRUNCATED"), /* 9 */
82 N_("INODE CLEARED"), /* 10 */
83 N_("ABORTED"), /* 11 */
84 N_("SPLIT"), /* 12 */
85 N_("CONTINUING"), /* 13 */
86 N_("DUPLICATE/BAD BLOCKS CLONED"), /* 14 */
87 N_("FILE DELETED"), /* 15 */
88 N_("SUPPRESSED"), /* 16 */
89 N_("UNLINKED"), /* 17 */
21c84b71
TT
90};
91
1b6bf175 92static const struct e2fsck_problem problem_table[] = {
21c84b71
TT
93
94 /* Pre-Pass 1 errors */
95
96 /* Block bitmap not in group */
0c4a0726 97 { PR_0_BB_NOT_GROUP, N_("@b @B for @g %g is not in @g. (@b %b)\n"),
1b6bf175 98 PROMPT_RELOCATE, PR_LATCH_RELOC },
21c84b71
TT
99
100 /* Inode bitmap not in group */
0c4a0726 101 { PR_0_IB_NOT_GROUP, N_("@i @B for @g %g is not in @g. (@b %b)\n"),
1b6bf175 102 PROMPT_RELOCATE, PR_LATCH_RELOC },
21c84b71
TT
103
104 /* Inode table not in group */
105 { PR_0_ITABLE_NOT_GROUP,
0c4a0726
TT
106 N_("@i table for @g %g is not in @g. (@b %b)\n"
107 "WARNING: SEVERE DATA LOSS POSSIBLE.\n"),
1b6bf175
TT
108 PROMPT_RELOCATE, PR_LATCH_RELOC },
109
110 /* Superblock corrupt */
111 { PR_0_SB_CORRUPT,
0c4a0726 112 N_("\nThe @S could not be read or does not describe a correct ext2\n"
d74edf4e 113 "@f. If the @v is valid and it really contains an ext2\n"
1b6bf175 114 "@f (and not swap or ufs or something else), then the @S\n"
424cd2be 115 "is corrupt, and you might try running e2fsck with an alternate @S:\n"
d74edf4e 116 " e2fsck -b %S <@v>\n\n"),
1b6bf175
TT
117 PROMPT_NONE, PR_FATAL },
118
119 /* Filesystem size is wrong */
120 { PR_0_FS_SIZE_WRONG,
0c4a0726 121 N_("The @f size (according to the @S) is %b @bs\n"
d74edf4e 122 "The physical size of the @v is %c @bs\n"
0c4a0726 123 "Either the @S or the partition table is likely to be corrupt!\n"),
1b6bf175
TT
124 PROMPT_ABORT, 0 },
125
126 /* Fragments not supported */
127 { PR_0_NO_FRAGMENTS,
0c4a0726 128 N_("@S @b_size = %b, fragsize = %c.\n"
1b6bf175 129 "This version of e2fsck does not support fragment sizes different\n"
0c4a0726 130 "from the @b size.\n"),
1b6bf175
TT
131 PROMPT_NONE, PR_FATAL },
132
133 /* Bad blocks_per_group */
134 { PR_0_BLOCKS_PER_GROUP,
0c4a0726 135 N_("@S @bs_per_group = %b, should have been %c\n"),
1b6bf175
TT
136 PROMPT_NONE, PR_AFTER_CODE, PR_0_SB_CORRUPT },
137
138 /* Bad first_data_block */
139 { PR_0_FIRST_DATA_BLOCK,
0c4a0726 140 N_("@S first_data_@b = %b, should have been %c\n"),
1b6bf175 141 PROMPT_NONE, PR_AFTER_CODE, PR_0_SB_CORRUPT },
21c84b71 142
1b6bf175
TT
143 /* Adding UUID to filesystem */
144 { PR_0_ADD_UUID,
0c4a0726 145 N_("@f did not have a UUID; generating one.\n\n"),
1b6bf175
TT
146 PROMPT_NONE, 0 },
147
148 /* Relocate hint */
149 { PR_0_RELOCATE_HINT,
0c4a0726 150 N_("Note: if there is several inode or block bitmap blocks\n"
1b6bf175
TT
151 "which require relocation, or one part of the inode table\n"
152 "which must be moved, you may wish to try running e2fsck\n"
153 "with the '-b %S' option first. The problem may lie only\n"
154 "with the primary block group descriptor, and the backup\n"
0c4a0726 155 "block group descriptor may be OK.\n\n"),
1b6bf175
TT
156 PROMPT_NONE, PR_PREEN_OK | PR_NOCOLLATE },
157
158 /* Miscellaneous superblock corruption */
159 { PR_0_MISC_CORRUPT_SUPER,
0c4a0726 160 N_("Corruption found in @S. (%s = %N).\n"),
1b6bf175
TT
161 PROMPT_NONE, PR_AFTER_CODE, PR_0_SB_CORRUPT },
162
163 /* Error determing physical device size of filesystem */
164 { PR_0_GETSIZE_ERROR,
d74edf4e 165 N_("Error determining size of the physical @v: %m\n"),
1b6bf175 166 PROMPT_NONE, PR_FATAL },
d4b0ce03
TT
167
168 /* Inode count in superblock is incorrect */
169 { PR_0_INODE_COUNT_WRONG,
4ea0a110 170 N_("@i count in @S is %i, should be %j.\n"),
d4b0ce03 171 PROMPT_FIX, 0 },
4ea0a110
TT
172
173 { PR_0_HURD_CLEAR_FILETYPE,
174 N_("The Hurd does not support the filetype feature.\n"),
3b5386dc
TT
175 PROMPT_CLEAR, 0 },
176
177 /* Journal inode is invalid */
178 { PR_0_JOURNAL_BAD_INODE,
7e92dfae 179 N_("@S has a bad ext3 @j (@i %i).\n"),
3b5386dc
TT
180 PROMPT_CLEAR, PR_PREEN_OK },
181
adee8d75
TT
182 /* The external journal has (unsupported) multiple filesystems */
183 { PR_0_JOURNAL_UNSUPP_MULTIFS,
184 N_("External @j has multiple @f users (unsupported).\n"),
185 PROMPT_NONE, PR_FATAL },
3b5386dc 186
adee8d75
TT
187 /* Can't find external journal */
188 { PR_0_CANT_FIND_JOURNAL,
189 N_("Can't find external @j\n"),
190 PROMPT_NONE, PR_FATAL },
191
192 /* External journal has bad superblock */
193 { PR_0_EXT_JOURNAL_BAD_SUPER,
194 N_("External @j has bad @S\n"),
195 PROMPT_NONE, PR_FATAL },
3b5386dc
TT
196
197 /* Superblock has a bad journal UUID */
198 { PR_0_JOURNAL_BAD_UUID,
adee8d75
TT
199 N_("External @j does not support this @f\n"),
200 PROMPT_NONE, PR_FATAL },
3b5386dc
TT
201
202 /* Journal has an unknown superblock type */
f76ad462
TT
203 { PR_0_JOURNAL_UNSUPP_SUPER,
204 N_("Ext3 @j @S is unknown type %N (unsupported).\n"
205 "It is likely that your copy of e2fsck is old and/or doesn't "
206 "support this @j format.\n"
207 "It is also possible the @j @S is corrupt.\n"),
208 PROMPT_ABORT, PR_NO_OK | PR_AFTER_CODE, PR_0_JOURNAL_BAD_SUPER },
3b5386dc
TT
209
210 /* Journal superblock is corrupt */
211 { PR_0_JOURNAL_BAD_SUPER,
f18996c8 212 N_("Ext3 @j @S is corrupt.\n"),
3b5386dc
TT
213 PROMPT_FIX, PR_PREEN_OK },
214
215 /* Superblock flag should be cleared */
216 { PR_0_JOURNAL_HAS_JOURNAL,
f18996c8 217 N_("@S doesn't have has_journal flag, but has ext3 @j %s.\n"),
37b6b297 218 PROMPT_CLEAR, PR_PREEN_OK },
3b5386dc
TT
219
220 /* Superblock flag is incorrect */
221 { PR_0_JOURNAL_RECOVER_SET,
f18996c8 222 N_("@S has ext3 needs_recovery flag set, but no @j.\n"),
3b5386dc
TT
223 PROMPT_CLEAR, PR_PREEN_OK },
224
225 /* Journal should be reset */
226 { PR_0_JOURNAL_RESET_JOURNAL,
f18996c8 227 N_("*** WARNING *** leaving data in the @j may be DANGEROUS.\n"),
3b5386dc
TT
228 PROMPT_NONE, PR_PREEN_NOMSG|PR_AFTER_CODE, PR_0_JOURNAL_RESET_PROMPT},
229
230 /* Journal should be reset */
231 { PR_0_JOURNAL_RESET_PROMPT,
232 N_("ext3 recovery flag clear, but journal has data.\n"),
233 PROMPT_CLEAR, PR_PREEN_OK|PR_PREEN_NOMSG },
4ea0a110 234
ecf1b776 235 /* Clearing orphan inode */
8394902e
TT
236 { PR_0_ORPHAN_CLEAR_INODE,
237 N_("%s @o @i %i (uid=%Iu, gid=%Ig, mode=%Im, size=%Is)\n"),
ecf1b776
TT
238 PROMPT_NONE, 0 },
239
80bfaa3e
TT
240 /* Illegal block found in orphaned inode */
241 { PR_0_ORPHAN_ILLEGAL_BLOCK_NUM,
242 N_("@I @b #%B (%b) found in @o @i %i.\n"),
243 PROMPT_NONE, 0 },
244
245 /* Already cleared block found in orphaned inode */
246 { PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
247 N_("Already cleared @b #%B (%b) found in @o @i %i.\n"),
248 PROMPT_NONE, 0 },
249
250 /* Illegal orphan inode in superblock */
251 { PR_0_ORPHAN_ILLEGAL_HEAD_INODE,
252 N_("@I @o @i %i in @S.\n"),
253 PROMPT_NONE, 0 },
254
255 /* Illegal inode in orphaned inode list */
256 { PR_0_ORPHAN_ILLEGAL_INODE,
257 N_("@I @i %i in @o @i list.\n"),
258 PROMPT_NONE, 0 },
80bfaa3e 259
060b5fbf
TT
260 /* Filesystem revision is 0, but feature flags are set */
261 { PR_0_FS_REV_LEVEL,
95a5bc91 262 "@f has feature flag(s) set, but is a revision 0 @f. ",
060b5fbf
TT
263 PROMPT_FIX, PR_PREEN_OK | PR_NO_OK },
264
424cd2be
TT
265 /* Journal superblock has an unknown read-only feature flag set */
266 { PR_0_JOURNAL_UNSUPP_ROCOMPAT,
267 N_("Ext3 @j @S has an unknown read-only feature flag set.\n"),
2f686ace 268 PROMPT_ABORT, 0 },
424cd2be
TT
269
270 /* Journal superblock has an unknown incompatible feature flag set */
271 { PR_0_JOURNAL_UNSUPP_INCOMPAT,
272 N_("Ext3 @j @S has an unknown incompatible feature flag set.\n"),
2f686ace 273 PROMPT_ABORT, 0 },
c7f23364
TT
274
275 /* Journal has unsupported version number */
276 { PR_0_JOURNAL_UNSUPP_VERSION,
277 N_("@j version not supported by this e2fsck.\n"),
278 PROMPT_ABORT, 0 },
424cd2be 279
21c84b71
TT
280 /* Pass 1 errors */
281
1b6bf175
TT
282 /* Pass 1: Checking inodes, blocks, and sizes */
283 { PR_1_PASS_HEADER,
0c4a0726 284 N_("Pass 1: Checking @is, @bs, and sizes\n"),
1b6bf175
TT
285 PROMPT_NONE, 0 },
286
21c84b71 287 /* Root directory is not an inode */
0c4a0726 288 { PR_1_ROOT_NO_DIR, N_("@r is not a @d. "),
21c84b71
TT
289 PROMPT_CLEAR, 0 },
290
291 /* Root directory has dtime set */
292 { PR_1_ROOT_DTIME,
0c4a0726 293 N_("@r has dtime set (probably due to old mke2fs). "),
21c84b71
TT
294 PROMPT_FIX, PR_PREEN_OK },
295
296 /* Reserved inode has bad mode */
297 { PR_1_RESERVED_BAD_MODE,
37b6b297 298 N_("Reserved @i %i %Q has bad mode. "),
21c84b71
TT
299 PROMPT_CLEAR, PR_PREEN_OK },
300
301 /* Deleted inode has zero dtime */
302 { PR_1_ZERO_DTIME,
0c4a0726 303 N_("@D @i %i has zero dtime. "),
21c84b71
TT
304 PROMPT_FIX, PR_PREEN_OK },
305
306 /* Inode in use, but dtime set */
307 { PR_1_SET_DTIME,
0c4a0726 308 N_("@i %i is in use, but has dtime set. "),
21c84b71
TT
309 PROMPT_FIX, PR_PREEN_OK },
310
311 /* Zero-length directory */
312 { PR_1_ZERO_LENGTH_DIR,
0c4a0726 313 N_("@i %i is a @z @d. "),
21c84b71
TT
314 PROMPT_CLEAR, PR_PREEN_OK },
315
316 /* Block bitmap conflicts with some other fs block */
317 { PR_1_BB_CONFLICT,
0c4a0726 318 N_("@g %g's @b @B at %b @C.\n"),
21c84b71
TT
319 PROMPT_RELOCATE, 0 },
320
321 /* Inode bitmap conflicts with some other fs block */
322 { PR_1_IB_CONFLICT,
0c4a0726 323 N_("@g %g's @i @B at %b @C.\n"),
21c84b71
TT
324 PROMPT_RELOCATE, 0 },
325
326 /* Inode table conflicts with some other fs block */
327 { PR_1_ITABLE_CONFLICT,
0c4a0726 328 N_("@g %g's @i table at %b @C.\n"),
21c84b71
TT
329 PROMPT_RELOCATE, 0 },
330
331 /* Block bitmap is on a bad block */
332 { PR_1_BB_BAD_BLOCK,
0c4a0726 333 N_("@g %g's @b @B (%b) is bad. "),
21c84b71
TT
334 PROMPT_RELOCATE, 0 },
335
336 /* Inode bitmap is on a bad block */
337 { PR_1_IB_BAD_BLOCK,
0c4a0726 338 N_("@g %g's @i @B (%b) is bad. "),
21c84b71
TT
339 PROMPT_RELOCATE, 0 },
340
341 /* Inode has incorrect i_size */
342 { PR_1_BAD_I_SIZE,
0c4a0726 343 N_("@i %i, i_size is %Is, @s %N. "),
1b6bf175 344 PROMPT_FIX, PR_PREEN_OK },
21c84b71
TT
345
346 /* Inode has incorrect i_blocks */
347 { PR_1_BAD_I_BLOCKS,
0c4a0726 348 N_("@i %i, i_@bs is %Ib, @s %N. "),
1b6bf175 349 PROMPT_FIX, PR_PREEN_OK },
21c84b71 350
80bfaa3e 351 /* Illegal blocknumber in inode */
21c84b71 352 { PR_1_ILLEGAL_BLOCK_NUM,
0c4a0726 353 N_("@I @b #%B (%b) in @i %i. "),
21c84b71
TT
354 PROMPT_CLEAR, PR_LATCH_BLOCK },
355
356 /* Block number overlaps fs metadata */
357 { PR_1_BLOCK_OVERLAPS_METADATA,
0c4a0726 358 N_("@b #%B (%b) overlaps @f metadata in @i %i. "),
21c84b71
TT
359 PROMPT_CLEAR, PR_LATCH_BLOCK },
360
361 /* Inode has illegal blocks (latch question) */
362 { PR_1_INODE_BLOCK_LATCH,
0c4a0726 363 N_("@i %i has illegal @b(s). "),
21c84b71
TT
364 PROMPT_CLEAR, 0 },
365
366 /* Too many bad blocks in inode */
367 { PR_1_TOO_MANY_BAD_BLOCKS,
0c4a0726 368 N_("Too many illegal @bs in @i %i.\n"),
21c84b71
TT
369 PROMPT_CLEAR_INODE, PR_NO_OK },
370
371 /* Illegal block number in bad block inode */
372 { PR_1_BB_ILLEGAL_BLOCK_NUM,
0c4a0726 373 N_("@I @b #%B (%b) in bad @b @i. "),
21c84b71
TT
374 PROMPT_CLEAR, PR_LATCH_BBLOCK },
375
376 /* Bad block inode has illegal blocks (latch question) */
377 { PR_1_INODE_BBLOCK_LATCH,
0c4a0726 378 N_("Bad @b @i has illegal @b(s). "),
21c84b71
TT
379 PROMPT_CLEAR, 0 },
380
1b6bf175
TT
381 /* Duplicate or bad blocks in use! */
382 { PR_1_DUP_BLOCKS_PREENSTOP,
0c4a0726 383 N_("Duplicate or bad @b in use!\n"),
1b6bf175
TT
384 PROMPT_NONE, 0 },
385
386 /* Bad block used as bad block indirect block */
387 { PR_1_BBINODE_BAD_METABLOCK,
0c4a0726 388 N_("Bad @b %b used as bad @b indirect @b?!?\n"),
1b6bf175
TT
389 PROMPT_NONE, PR_AFTER_CODE, PR_1_BBINODE_BAD_METABLOCK_PROMPT },
390
391 /* Inconsistency can't be fixed prompt */
392 { PR_1_BBINODE_BAD_METABLOCK_PROMPT,
0c4a0726 393 N_("\nThis inconsistency can not be fixed with e2fsck; to fix it, use\n"
1b6bf175
TT
394 """dumpe2fs -b"" to dump out the bad @b "
395 "list and ""e2fsck -L filename""\n"
0c4a0726 396 "to read it back in again.\n"),
1b6bf175
TT
397 PROMPT_CONTINUE, PR_PREEN_NOMSG },
398
399 /* Bad primary block */
400 { PR_1_BAD_PRIMARY_BLOCK,
0c4a0726 401 N_("\nIf the @b is really bad, the @f can not be fixed.\n"),
1b6bf175
TT
402 PROMPT_NONE, PR_AFTER_CODE, PR_1_BAD_PRIMARY_BLOCK_PROMPT },
403
404 /* Bad primary block prompt */
405 { PR_1_BAD_PRIMARY_BLOCK_PROMPT,
0c4a0726 406 N_("You can clear the this @b (and hope for the best) from the\n"
1b6bf175 407 "bad @b list and hope that @b is really OK, but there are no\n"
0c4a0726 408 "guarantees.\n\n"),
1b6bf175
TT
409 PROMPT_CLEAR, PR_PREEN_NOMSG },
410
411 /* Bad primary superblock */
412 { PR_1_BAD_PRIMARY_SUPERBLOCK,
0c4a0726 413 N_("The primary @S (%b) is on the bad @b list.\n"),
1b6bf175
TT
414 PROMPT_NONE, PR_AFTER_CODE, PR_1_BAD_PRIMARY_BLOCK },
415
416 /* Bad primary block group descriptors */
417 { PR_1_BAD_PRIMARY_GROUP_DESCRIPTOR,
0c4a0726
TT
418 N_("Block %b in the primary @g descriptors "
419 "is on the bad @b list\n"),
1b6bf175
TT
420 PROMPT_NONE, PR_AFTER_CODE, PR_1_BAD_PRIMARY_BLOCK },
421
422 /* Bad superblock in group */
423 { PR_1_BAD_SUPERBLOCK,
0c4a0726 424 N_("Warning: Group %g's @S (%b) is bad.\n"),
1b6bf175
TT
425 PROMPT_NONE, PR_PREEN_OK | PR_PREEN_NOMSG },
426
427 /* Bad block group descriptors in group */
428 { PR_1_BAD_GROUP_DESCRIPTORS,
0c4a0726
TT
429 N_("Warning: Group %g's copy of the @g descriptors has a bad "
430 "@b (%b).\n"),
1b6bf175
TT
431 PROMPT_NONE, PR_PREEN_OK | PR_PREEN_NOMSG },
432
433 /* Block claimed for no reason */
434 { PR_1_PROGERR_CLAIMED_BLOCK,
0c4a0726
TT
435 N_("Programming error? @b #%b claimed for no reason in "
436 "process_bad_@b.\n"),
1b6bf175
TT
437 PROMPT_NONE, PR_PREEN_OK },
438
f8188fff 439 /* Error allocating blocks for relocating metadata */
1b6bf175 440 { PR_1_RELOC_BLOCK_ALLOCATE,
0c4a0726 441 N_("@A %N @b(s) for %s: %m\n"),
1b6bf175
TT
442 PROMPT_NONE, PR_PREEN_OK },
443
f8188fff 444 /* Error allocating block buffer during relocation process */
1b6bf175 445 { PR_1_RELOC_MEMORY_ALLOCATE,
0c4a0726 446 N_("@A @b buffer for relocating %s\n"),
1b6bf175
TT
447 PROMPT_NONE, PR_PREEN_OK },
448
449 /* Relocating metadata group information from X to Y */
450 { PR_1_RELOC_FROM_TO,
0c4a0726 451 N_("Relocating @g %g's %s from %b to %c...\n"),
1b6bf175
TT
452 PROMPT_NONE, PR_PREEN_OK },
453
454 /* Relocating metatdata group information to X */
455 { PR_1_RELOC_TO,
0c4a0726 456 N_("Relocating @g %g's %s to %c...\n"),
1b6bf175
TT
457 PROMPT_NONE, PR_PREEN_OK },
458
459 /* Block read error during relocation process */
460 { PR_1_RELOC_READ_ERR,
0c4a0726 461 N_("Warning: could not read @b %b of %s: %m\n"),
1b6bf175
TT
462 PROMPT_NONE, PR_PREEN_OK },
463
464 /* Block write error during relocation process */
465 { PR_1_RELOC_WRITE_ERR,
0c4a0726 466 N_("Warning: could not write @b %b for %s: %m\n"),
1b6bf175
TT
467 PROMPT_NONE, PR_PREEN_OK },
468
469 /* Error allocating inode bitmap */
470 { PR_1_ALLOCATE_IBITMAP_ERROR,
f8188fff 471 "@A @i @B (%N): %m\n",
1b6bf175
TT
472 PROMPT_NONE, PR_FATAL },
473
474 /* Error allocating block bitmap */
475 { PR_1_ALLOCATE_BBITMAP_ERROR,
f8188fff 476 "@A @b @B (%N): %m\n",
1b6bf175
TT
477 PROMPT_NONE, PR_FATAL },
478
479 /* Error allocating icount structure */
480 { PR_1_ALLOCATE_ICOUNT,
0c4a0726 481 N_("@A icount link information: %m\n"),
1b6bf175
TT
482 PROMPT_NONE, PR_FATAL },
483
484 /* Error allocating dbcount */
485 { PR_1_ALLOCATE_DBCOUNT,
0c4a0726 486 N_("@A @d @b array: %m\n"),
1b6bf175
TT
487 PROMPT_NONE, PR_FATAL },
488
489 /* Error while scanning inodes */
490 { PR_1_ISCAN_ERROR,
0c4a0726 491 N_("Error while scanning @is (%i): %m\n"),
1b6bf175
TT
492 PROMPT_NONE, PR_FATAL },
493
494 /* Error while iterating over blocks */
495 { PR_1_BLOCK_ITERATE,
133a56dc 496 N_("Error while iterating over @bs in @i %i: %m\n"),
1b6bf175
TT
497 PROMPT_NONE, PR_FATAL },
498
499 /* Error while storing inode count information */
500 { PR_1_ICOUNT_STORE,
f18996c8 501 N_("Error storing @i count information (@i=%i, count=%N): %m\n"),
1b6bf175
TT
502 PROMPT_NONE, PR_FATAL },
503
504 /* Error while storing directory block information */
505 { PR_1_ADD_DBLOCK,
0c4a0726 506 N_("Error storing @d @b information "
f18996c8 507 "(@i=%i, @b=%b, num=%N): %m\n"),
1b6bf175
TT
508 PROMPT_NONE, PR_FATAL },
509
510 /* Error while reading inode (for clearing) */
511 { PR_1_READ_INODE,
0c4a0726 512 N_("Error reading @i %i: %m\n"),
1b6bf175 513 PROMPT_NONE, PR_FATAL },
f8188fff
TT
514
515 /* Suppress messages prompt */
516 { PR_1_SUPPRESS_MESSAGES, "", PROMPT_SUPPRESS, PR_NO_OK },
1b6bf175 517
246501c6
TT
518 /* Filesystem contains large files, but has no such flag in sb */
519 { PR_1_FEATURE_LARGE_FILES,
0c4a0726 520 N_("@f contains large files, but lacks LARGE_FILE flag in @S.\n"),
246501c6
TT
521 PROMPT_FIX, 0 },
522
6fdc7a32
TT
523 /* Imagic flag set on an inode when filesystem doesn't support it */
524 { PR_1_SET_IMAGIC,
0c4a0726 525 N_("@i %i has imagic flag set. "),
6fdc7a32
TT
526 PROMPT_CLEAR, 0 },
527
528 /* Immutable flag set on a device or socket inode */
529 { PR_1_SET_IMMUTABLE,
d74edf4e 530 N_("Special (@v/socket/fifo) @i %i has immutable or "
01fbc701 531 "append-only flag set.\n"),
a846d2f4 532 PROMPT_CLEAR, PR_PREEN_OK | PR_PREEN_NO | PR_NO_OK },
6fdc7a32 533
01fbc701 534 /* Compression flag set on an inode when filesystem doesn't support it */
1917875f
TT
535 { PR_1_COMPR_SET,
536 N_("@i %i has @cion flag set on @f without @cion support. "),
537 PROMPT_CLEAR, 0 },
538
d647a1ea
TT
539 /* Non-zero size for device, fifo or socket inode */
540 { PR_1_SET_NONZSIZE,
d74edf4e 541 "Special (@v/socket/fifo) @i %i has non-zero size. ",
d647a1ea 542 PROMPT_FIX, PR_PREEN_OK },
060b5fbf
TT
543
544 /* Filesystem revision is 0, but feature flags are set */
545 { PR_1_FS_REV_LEVEL,
f18996c8 546 "@f has feature flag(s) set, but is a revision 0 @f. ",
060b5fbf
TT
547 PROMPT_FIX, PR_PREEN_OK | PR_NO_OK },
548
f18996c8 549 /* Journal inode is not in use, but contains data */
a9ca2016 550 { PR_1_JOURNAL_INODE_NOT_CLEAR,
f18996c8
TT
551 "@j @i is not in use, but contains data. ",
552 PROMPT_CLEAR, PR_PREEN_OK },
553
a9ca2016
TT
554 /* Journal has bad mode */
555 { PR_1_JOURNAL_BAD_MODE,
67a473ec 556 N_("@j is not regular file. "),
a9ca2016
TT
557 PROMPT_FIX, PR_PREEN_OK },
558
21afac09
TT
559 /* Deal with inodes that were part of orphan linked list */
560 { PR_1_LOW_DTIME,
561 N_("@i %i was part of the orphaned @i list. "),
562 PROMPT_FIX, PR_LATCH_LOW_DTIME, 0 },
563
564 /* Deal with inodes that were part of corrupted orphan linked
565 list (latch question) */
566 { PR_1_ORPHAN_LIST_REFUGEES,
567 N_("@is that were part of a corrupted orphan linked list found. "),
568 PROMPT_FIX, 0 },
569
342d847d
TT
570 /* Error allocating refcount structure */
571 { PR_1_ALLOCATE_REFCOUNT,
572 "@A refcount structure (%N): %m\n",
573 PROMPT_NONE, PR_FATAL },
574
575 /* Error reading extended attribute block */
576 { PR_1_READ_EA_BLOCK,
577 N_("Error reading @a @b %b for @i %i. "),
578 PROMPT_CLEAR, 0 },
579
e8a3ee62 580 /* Invalid extended attribute block */
342d847d
TT
581 { PR_1_BAD_EA_BLOCK,
582 N_("@i %i has a bad @a @b %b. "),
583 PROMPT_CLEAR, 0 },
584
e8a3ee62
TT
585 /* Error reading Extended Attribute block while fixing refcount */
586 { PR_1_EXTATTR_READ_ABORT,
587 N_("Error reading @a @b %b (%m). "),
588 PROMPT_ABORT, 0 },
589
590 /* Extended attribute reference count incorrect */
591 { PR_1_EXTATTR_REFCOUNT,
592 N_("@a @b %b has reference count %B, should be %N. "),
593 PROMPT_FIX, 0 },
594
595 /* Error writing Extended Attribute block while fixing refcount */
596 { PR_1_EXTATTR_WRITE,
597 N_("Error writing @a @b %b (%m). "),
598 PROMPT_ABORT, 0 },
55fd07ed
TT
599
600 /* Multiple EA blocks not supported */
601 { PR_1_EA_MULTI_BLOCK,
602 N_("@a @b %b has h_blocks > 1. "),
603 PROMPT_CLEAR, 0},
604
605 /* Error allocating EA region allocation structure */
606 { PR_1_EA_ALLOC_REGION,
607 N_("Error allocating @a @b %b. "),
608 PROMPT_ABORT, 0},
609
610 /* Error EA allocation collision */
611 { PR_1_EA_ALLOC_COLLISION,
612 N_("@a @b %b is corrupt (allocation collision). "),
613 PROMPT_ABORT, 0},
614
615 /* Bad extended attribute name */
616 { PR_1_EA_BAD_NAME,
617 N_("@a @b %b is corrupt (invalid name). "),
618 PROMPT_CLEAR, 0},
619
620 /* Bad extended attribute value */
621 { PR_1_EA_BAD_VALUE,
622 N_("@a @b %b is corrupt (invalid value). "),
623 PROMPT_CLEAR, 0},
e8a3ee62 624
21c84b71
TT
625 /* Pass 1b errors */
626
1b6bf175
TT
627 /* Pass 1B: Rescan for duplicate/bad blocks */
628 { PR_1B_PASS_HEADER,
0c4a0726
TT
629 N_("Duplicate @bs found... invoking duplicate @b passes.\n"
630 "Pass 1B: Rescan for duplicate/bad @bs\n"),
1b6bf175
TT
631 PROMPT_NONE, 0 },
632
633 /* Duplicate/bad block(s) header */
634 { PR_1B_DUP_BLOCK_HEADER,
0c4a0726 635 N_("Duplicate/bad @b(s) in @i %i:"),
1b6bf175
TT
636 PROMPT_NONE, 0 },
637
638 /* Duplicate/bad block(s) in inode */
639 { PR_1B_DUP_BLOCK,
640 " %b",
641 PROMPT_NONE, PR_LATCH_DBLOCK },
642
643 /* Duplicate/bad block(s) end */
644 { PR_1B_DUP_BLOCK_END,
645 "\n",
646 PROMPT_NONE, 0 },
647
648 /* Error while scanning inodes */
649 { PR_1B_ISCAN_ERROR,
0c4a0726 650 N_("Error while scanning inodes (%i): %m\n"),
1b6bf175
TT
651 PROMPT_NONE, PR_FATAL },
652
653 /* Error allocating inode bitmap */
654 { PR_1B_ALLOCATE_IBITMAP_ERROR,
0c4a0726 655 N_("@A @i @B (inode_dup_map): %m\n"),
1b6bf175
TT
656 PROMPT_NONE, PR_FATAL },
657
133a56dc
TT
658 /* Error while iterating over blocks */
659 { PR_1B_BLOCK_ITERATE,
660 N_("Error while iterating over @bs in @i %i (%s): %m\n"),
661 PROMPT_NONE, 0 },
662
1b6bf175
TT
663 /* Pass 1C: Scan directories for inodes with dup blocks. */
664 { PR_1C_PASS_HEADER,
0c4a0726 665 N_("Pass 1C: Scan directories for @is with dup @bs.\n"),
1b6bf175
TT
666 PROMPT_NONE, 0 },
667
668
669 /* Pass 1D: Reconciling duplicate blocks */
670 { PR_1D_PASS_HEADER,
0c4a0726 671 N_("Pass 1D: Reconciling duplicate @bs\n"),
1b6bf175
TT
672 PROMPT_NONE, 0 },
673
21c84b71 674 /* File has duplicate blocks */
1b6bf175 675 { PR_1D_DUP_FILE,
0c4a0726
TT
676 N_("File %Q (@i #%i, mod time %IM) \n"
677 " has %B duplicate @b(s), shared with %N file(s):\n"),
1b6bf175 678 PROMPT_NONE, 0 },
21c84b71
TT
679
680 /* List of files sharing duplicate blocks */
1b6bf175 681 { PR_1D_DUP_FILE_LIST,
0c4a0726 682 N_("\t%Q (@i #%i, mod time %IM)\n"),
1b6bf175 683 PROMPT_NONE, 0 },
21c84b71 684
521e3685 685 /* File sharing blocks with filesystem metadata */
1b6bf175 686 { PR_1D_SHARE_METADATA,
0c4a0726 687 N_("\t<@f metadata>\n"),
1b6bf175
TT
688 PROMPT_NONE, 0 },
689
690 /* Report of how many duplicate/bad inodes */
691 { PR_1D_NUM_DUP_INODES,
0c4a0726 692 N_("(There are %N @is containing duplicate/bad @bs.)\n\n"),
1b6bf175
TT
693 PROMPT_NONE, 0 },
694
695 /* Duplicated blocks already reassigned or cloned. */
696 { PR_1D_DUP_BLOCKS_DEALT,
0c4a0726 697 N_("Duplicated @bs already reassigned or cloned.\n\n"),
1b6bf175
TT
698 PROMPT_NONE, 0 },
699
700 /* Clone duplicate/bad blocks? */
701 { PR_1D_CLONE_QUESTION,
702 "", PROMPT_CLONE, PR_NO_OK },
703
704 /* Delete file? */
705 { PR_1D_DELETE_QUESTION,
706 "", PROMPT_DELETE, 0 },
707
708 /* Couldn't clone file (error) */
709 { PR_1D_CLONE_ERROR,
0c4a0726 710 N_("Couldn't clone file: %m\n"), PROMPT_NONE, 0 },
21c84b71
TT
711
712 /* Pass 2 errors */
713
1b6bf175
TT
714 /* Pass 2: Checking directory structure */
715 { PR_2_PASS_HEADER,
0c4a0726 716 N_("Pass 2: Checking @d structure\n"),
1b6bf175
TT
717 PROMPT_NONE, 0 },
718
21c84b71
TT
719 /* Bad inode number for '.' */
720 { PR_2_BAD_INODE_DOT,
0c4a0726 721 N_("Bad @i number for '.' in @d @i %i.\n"),
21c84b71
TT
722 PROMPT_FIX, 0 },
723
724 /* Directory entry has bad inode number */
725 { PR_2_BAD_INO,
0c4a0726 726 N_("@E has bad @i #: %Di.\n"),
21c84b71
TT
727 PROMPT_CLEAR, 0 },
728
729 /* Directory entry has deleted or unused inode */
730 { PR_2_UNUSED_INODE,
0c4a0726 731 N_("@E has @D/unused @i %Di. "),
21c84b71
TT
732 PROMPT_CLEAR, PR_PREEN_OK },
733
734 /* Directry entry is link to '.' */
735 { PR_2_LINK_DOT,
0c4a0726 736 N_("@E @L to '.' "),
21c84b71
TT
737 PROMPT_CLEAR, 0 },
738
739 /* Directory entry points to inode now located in a bad block */
740 { PR_2_BB_INODE,
0c4a0726 741 N_("@E points to @i (%Di) located in a bad @b.\n"),
21c84b71
TT
742 PROMPT_CLEAR, 0 },
743
744 /* Directory entry contains a link to a directory */
745 { PR_2_LINK_DIR,
0c4a0726 746 N_("@E @L to @d %P (%Di).\n"),
21c84b71
TT
747 PROMPT_CLEAR, 0 },
748
749 /* Directory entry contains a link to the root directry */
750 { PR_2_LINK_ROOT,
0c4a0726 751 N_("@E @L to the @r.\n"),
21c84b71
TT
752 PROMPT_CLEAR, 0 },
753
754 /* Directory entry has illegal characters in its name */
755 { PR_2_BAD_NAME,
0c4a0726 756 N_("@E has illegal characters in its name.\n"),
21c84b71
TT
757 PROMPT_FIX, 0 },
758
759 /* Missing '.' in directory inode */
760 { PR_2_MISSING_DOT,
0c4a0726 761 N_("Missing '.' in @d @i %i.\n"),
21c84b71
TT
762 PROMPT_FIX, 0 },
763
764 /* Missing '..' in directory inode */
765 { PR_2_MISSING_DOT_DOT,
0c4a0726 766 N_("Missing '..' in @d @i %i.\n"),
21c84b71
TT
767 PROMPT_FIX, 0 },
768
769 /* First entry in directory inode doesn't contain '.' */
770 { PR_2_1ST_NOT_DOT,
0c4a0726 771 N_("First @e '%Dn' (inode=%Di) in @d @i %i (%p) @s '.'\n"),
21c84b71
TT
772 PROMPT_FIX, 0 },
773
774 /* Second entry in directory inode doesn't contain '..' */
775 { PR_2_2ND_NOT_DOT_DOT,
0c4a0726 776 N_("Second @e '%Dn' (inode=%Di) in @d @i %i @s '..'\n"),
21c84b71
TT
777 PROMPT_FIX, 0 },
778
779 /* i_faddr should be zero */
780 { PR_2_FADDR_ZERO,
0c4a0726 781 N_("i_faddr @F %IF, @s zero.\n"),
21c84b71
TT
782 PROMPT_CLEAR, 0 },
783
784 /* i_file_acl should be zero */
785 { PR_2_FILE_ACL_ZERO,
0c4a0726 786 N_("i_file_acl @F %If, @s zero.\n"),
21c84b71
TT
787 PROMPT_CLEAR, 0 },
788
789 /* i_dir_acl should be zero */
790 { PR_2_DIR_ACL_ZERO,
0c4a0726 791 N_("i_dir_acl @F %Id, @s zero.\n"),
21c84b71
TT
792 PROMPT_CLEAR, 0 },
793
794 /* i_frag should be zero */
795 { PR_2_FRAG_ZERO,
0c4a0726 796 N_("i_frag @F %N, @s zero.\n"),
21c84b71
TT
797 PROMPT_CLEAR, 0 },
798
799 /* i_fsize should be zero */
800 { PR_2_FSIZE_ZERO,
0c4a0726 801 N_("i_fsize @F %N, @s zero.\n"),
21c84b71
TT
802 PROMPT_CLEAR, 0 },
803
804 /* inode has bad mode */
805 { PR_2_BAD_MODE,
0c4a0726 806 N_("@i %i (%Q) has a bad mode (%Im).\n"),
21c84b71
TT
807 PROMPT_CLEAR, 0 },
808
809 /* directory corrupted */
810 { PR_2_DIR_CORRUPTED,
0c4a0726 811 N_("@d @i %i, @b %B, offset %N: @d corrupted\n"),
21c84b71
TT
812 PROMPT_SALVAGE, 0 },
813
814 /* filename too long */
815 { PR_2_FILENAME_LONG,
0c4a0726 816 N_("@d @i %i, @b %B, offset %N: filename too long\n"),
21c84b71
TT
817 PROMPT_TRUNCATE, 0 },
818
819 /* Directory inode has a missing block (hole) */
820 { PR_2_DIRECTORY_HOLE,
0c4a0726 821 N_("@d @i %i has an unallocated @b #%B. "),
21c84b71
TT
822 PROMPT_ALLOCATE, 0 },
823
824 /* '.' is not NULL terminated */
825 { PR_2_DOT_NULL_TERM,
0c4a0726 826 N_("'.' @d @e in @d @i %i is not NULL terminated\n"),
21c84b71
TT
827 PROMPT_FIX, 0 },
828
829 /* '..' is not NULL terminated */
830 { PR_2_DOT_DOT_NULL_TERM,
0c4a0726 831 N_("'..' @d @e in @d @i %i is not NULL terminated\n"),
21c84b71
TT
832 PROMPT_FIX, 0 },
833
7cf73dcd
TT
834 /* Illegal character device inode */
835 { PR_2_BAD_CHAR_DEV,
d74edf4e 836 N_("@i %i (%Q) is an @I character @v.\n"),
7cf73dcd
TT
837 PROMPT_CLEAR, 0 },
838
839 /* Illegal block device inode */
840 { PR_2_BAD_BLOCK_DEV,
d74edf4e 841 N_("@i %i (%Q) is an @I @b @v.\n"),
7cf73dcd
TT
842 PROMPT_CLEAR, 0 },
843
1b6bf175
TT
844 /* Duplicate '.' entry */
845 { PR_2_DUP_DOT,
0c4a0726 846 N_("@E is duplicate '.' @e.\n"),
1b6bf175 847 PROMPT_FIX, 0 },
21c84b71 848
1b6bf175
TT
849 /* Duplicate '..' entry */
850 { PR_2_DUP_DOT_DOT,
0c4a0726 851 N_("@E is duplicate '..' @e.\n"),
1b6bf175
TT
852 PROMPT_FIX, 0 },
853
854 /* Internal error: couldn't find dir_info */
855 { PR_2_NO_DIRINFO,
0c4a0726 856 N_("Internal error: couldn't find dir_info for %i.\n"),
1b6bf175
TT
857 PROMPT_NONE, PR_FATAL },
858
859 /* Final rec_len is wrong */
860 { PR_2_FINAL_RECLEN,
0c4a0726 861 N_("@E has rec_len of %dr, should be %N.\n"),
1b6bf175
TT
862 PROMPT_FIX, 0 },
863
864 /* Error allocating icount structure */
865 { PR_2_ALLOCATE_ICOUNT,
0c4a0726 866 N_("@A icount structure: %m\n"),
1b6bf175
TT
867 PROMPT_NONE, PR_FATAL },
868
869 /* Error iterating over directory blocks */
870 { PR_2_DBLIST_ITERATE,
0c4a0726 871 N_("Error interating over @d @bs: %m\n"),
1b6bf175
TT
872 PROMPT_NONE, PR_FATAL },
873
874 /* Error reading directory block */
875 { PR_2_READ_DIRBLOCK,
0c4a0726 876 N_("Error reading @d @b %b (@i %i): %m\n"),
1b6bf175
TT
877 PROMPT_CONTINUE, 0 },
878
879 /* Error writing directory block */
880 { PR_2_WRITE_DIRBLOCK,
0c4a0726 881 N_("Error writing @d @b %b (@i %i): %m\n"),
1b6bf175
TT
882 PROMPT_CONTINUE, 0 },
883
884 /* Error allocating new directory block */
885 { PR_2_ALLOC_DIRBOCK,
0c4a0726 886 N_("@A new @d @b for @i %i (%s): %m\n"),
1b6bf175
TT
887 PROMPT_NONE, 0 },
888
889 /* Error deallocating inode */
890 { PR_2_DEALLOC_INODE,
0c4a0726 891 N_("Error deallocating @i %i: %m\n"),
1b6bf175
TT
892 PROMPT_NONE, PR_FATAL },
893
f8188fff
TT
894 /* Directory entry for '.' is big. Split? */
895 { PR_2_SPLIT_DOT,
0c4a0726 896 N_("@d @e for '.' is big. "),
f8188fff 897 PROMPT_SPLIT, PR_NO_OK },
1b6bf175 898
1dde43f0
TT
899 /* Illegal FIFO inode */
900 { PR_2_BAD_FIFO,
0c4a0726 901 N_("@i %i (%Q) is an @I FIFO.\n"),
1dde43f0
TT
902 PROMPT_CLEAR, 0 },
903
904 /* Illegal socket inode */
905 { PR_2_BAD_SOCKET,
0c4a0726 906 N_("@i %i (%Q) is an @I socket.\n"),
1dde43f0
TT
907 PROMPT_CLEAR, 0 },
908
aa4115a4
TT
909 /* Directory filetype not set */
910 { PR_2_SET_FILETYPE,
0c4a0726 911 N_("Setting filetype for @E to %N.\n"),
aa4115a4
TT
912 PROMPT_NONE, PR_PREEN_OK | PR_NO_OK | PR_NO_NOMSG },
913
914 /* Directory filetype incorrect */
915 { PR_2_BAD_FILETYPE,
0c4a0726 916 N_("@E has an incorrect filetype (was %dt, should be %N)\n"),
aa4115a4
TT
917 PROMPT_FIX, 0 },
918
7847c1d4
TT
919 /* Directory filetype set on filesystem */
920 { PR_2_CLEAR_FILETYPE,
0c4a0726 921 N_("@E has filetype set\n"),
7847c1d4
TT
922 PROMPT_CLEAR, PR_PREEN_OK },
923
c40db6d5
TT
924 /* Directory filename is null */
925 { PR_2_NULL_NAME,
0c4a0726 926 N_("@E has a zero-length name\n"),
c40db6d5
TT
927 PROMPT_CLEAR, 0 },
928
fdbdea09
TT
929 /* Invalid fast symlink size */
930 { PR_2_SYMLINK_SIZE,
342d847d
TT
931 N_("@i %i (%Q) is a fast symlink with a bad size (%Is)\n"),
932 PROMPT_CLEAR, 0 },
933
934 /* i_file_acl (extended attribute block) is bad */
935 { PR_2_FILE_ACL_BAD,
936 N_("@a @b @F is invalid (%If).\n"),
fdbdea09
TT
937 PROMPT_CLEAR, 0 },
938
1b6bf175
TT
939 /* Pass 3 errors */
940
941 /* Pass 3: Checking directory connectivity */
942 { PR_3_PASS_HEADER,
0c4a0726 943 N_("Pass 3: Checking @d connectivity\n"),
1b6bf175
TT
944 PROMPT_NONE, 0 },
945
21c84b71
TT
946 /* Root inode not allocated */
947 { PR_3_NO_ROOT_INODE,
0c4a0726 948 N_("@r not allocated. "),
21c84b71
TT
949 PROMPT_ALLOCATE, 0 },
950
951 /* No room in lost+found */
952 { PR_3_EXPAND_LF_DIR,
0c4a0726 953 N_("No room in @l @d. "),
21c84b71
TT
954 PROMPT_EXPAND, 0 },
955
956 /* Unconnected directory inode */
957 { PR_3_UNCONNECTED_DIR,
0c4a0726 958 N_("Unconnected @d @i %i (%p)\n"),
21c84b71
TT
959 PROMPT_CONNECT, 0 },
960
961 /* /lost+found not found */
962 { PR_3_NO_LF_DIR,
0c4a0726 963 N_("/@l not found. "),
5a679c8f 964 PROMPT_CREATE, PR_PREEN_OK },
21c84b71
TT
965
966 /* .. entry is incorrect */
967 { PR_3_BAD_DOT_DOT,
0c4a0726 968 N_("'..' in %Q (%i) is %P (%j), @s %q (%d).\n"),
21c84b71
TT
969 PROMPT_FIX, 0 },
970
1b6bf175
TT
971 /* Bad or non-existent /lost+found. Cannot reconnect */
972 { PR_3_NO_LPF,
0c4a0726 973 N_("Bad or non-existent /@l. Cannot reconnect\n"),
1b6bf175
TT
974 PROMPT_NONE, 0 },
975
976 /* Could not expand /lost+found */
977 { PR_3_CANT_EXPAND_LPF,
0c4a0726 978 N_("Could not expand /@l: %m\n"),
1b6bf175
TT
979 PROMPT_NONE, 0 },
980
981 /* Could not reconnect inode */
982 { PR_3_CANT_RECONNECT,
0c4a0726 983 N_("Could not reconnect %i: %m\n"),
1b6bf175
TT
984 PROMPT_NONE, 0 },
985
986 /* Error while trying to find /lost+found */
987 { PR_3_ERR_FIND_LPF,
0c4a0726 988 N_("Error while trying to find /@l: %m\n"),
1b6bf175
TT
989 PROMPT_NONE, 0 },
990
991 /* Error in ext2fs_new_block while creating /lost+found */
992 { PR_3_ERR_LPF_NEW_BLOCK,
0c4a0726 993 N_("ext2fs_new_@b: %m while trying to create /@l @d\n"),
1b6bf175
TT
994 PROMPT_NONE, 0 },
995
996 /* Error in ext2fs_new_inode while creating /lost+found */
997 { PR_3_ERR_LPF_NEW_INODE,
0c4a0726 998 N_("ext2fs_new_@i: %m while trying to create /@l @d\n"),
1b6bf175
TT
999 PROMPT_NONE, 0 },
1000
1001 /* Error in ext2fs_new_dir_block while creating /lost+found */
1002 { PR_3_ERR_LPF_NEW_DIR_BLOCK,
0c4a0726 1003 N_("ext2fs_new_dir_@b: %m while creating new @d @b\n"),
1b6bf175
TT
1004 PROMPT_NONE, 0 },
1005
1006 /* Error while writing directory block for /lost+found */
1007 { PR_3_ERR_LPF_WRITE_BLOCK,
0c4a0726 1008 N_("ext2fs_write_dir_@b: %m while writing the @d @b for /@l\n"),
1b6bf175
TT
1009 PROMPT_NONE, 0 },
1010
1011 /* Error while adjusting inode count */
1012 { PR_3_ADJUST_INODE,
0c4a0726 1013 N_("Error while adjusting @i count on @i %i\n"),
1b6bf175
TT
1014 PROMPT_NONE, 0 },
1015
1016 /* Couldn't fix parent directory -- error */
1017 { PR_3_FIX_PARENT_ERR,
0c4a0726 1018 N_("Couldn't fix parent of @i %i: %m\n\n"),
1b6bf175
TT
1019 PROMPT_NONE, 0 },
1020
1021 /* Couldn't fix parent directory -- couldn't find it */
1022 { PR_3_FIX_PARENT_NOFIND,
0c4a0726 1023 N_("Couldn't fix parent of @i %i: Couldn't find parent @d entry\n\n"),
1b6bf175
TT
1024 PROMPT_NONE, 0 },
1025
1026 /* Error allocating inode bitmap */
1027 { PR_3_ALLOCATE_IBITMAP_ERROR,
0c4a0726 1028 N_("@A @i @B (%N): %m\n"),
1b6bf175
TT
1029 PROMPT_NONE, PR_FATAL },
1030
1031 /* Error creating root directory */
1032 { PR_3_CREATE_ROOT_ERROR,
0c4a0726 1033 N_("Error creating root @d (%s): %m\n"),
1b6bf175
TT
1034 PROMPT_NONE, PR_FATAL },
1035
1036 /* Error creating lost and found directory */
1037 { PR_3_CREATE_LPF_ERROR,
0c4a0726 1038 N_("Error creating /@l @d (%s): %m\n"),
1b6bf175
TT
1039 PROMPT_NONE, PR_FATAL },
1040
f8188fff
TT
1041 /* Root inode is not directory; aborting */
1042 { PR_3_ROOT_NOT_DIR_ABORT,
0c4a0726 1043 N_("@r is not a @d; aborting.\n"),
f8188fff
TT
1044 PROMPT_NONE, PR_FATAL },
1045
1046 /* Cannot proceed without a root inode. */
1047 { PR_3_NO_ROOT_INODE_ABORT,
0c4a0726 1048 N_("Cannot proceed without a @r.\n"),
f8188fff
TT
1049 PROMPT_NONE, PR_FATAL },
1050
7f813ba3
TT
1051 /* Internal error: couldn't find dir_info */
1052 { PR_3_NO_DIRINFO,
0c4a0726 1053 N_("Internal error: couldn't find dir_info for %i.\n"),
7f813ba3
TT
1054 PROMPT_NONE, PR_FATAL },
1055
4a9f5936
TT
1056 /* Lost+found not a directory */
1057 { PR_3_LPF_NOTDIR,
0c4a0726 1058 N_("/@l is not a @d (ino=%i)\n"),
4a9f5936
TT
1059 PROMPT_UNLINK, 0 },
1060
21c84b71
TT
1061 /* Pass 4 errors */
1062
1b6bf175
TT
1063 /* Pass 4: Checking reference counts */
1064 { PR_4_PASS_HEADER,
0c4a0726 1065 N_("Pass 4: Checking reference counts\n"),
1b6bf175
TT
1066 PROMPT_NONE, 0 },
1067
21c84b71
TT
1068 /* Unattached zero-length inode */
1069 { PR_4_ZERO_LEN_INODE,
1070 "@u @z @i %i. ",
1071 PROMPT_CLEAR, PR_PREEN_OK|PR_NO_OK },
1072
1073 /* Unattached inode */
1074 { PR_4_UNATTACHED_INODE,
1075 "@u @i %i\n",
1076 PROMPT_CONNECT, 0 },
1077
1078 /* Inode ref count wrong */
1079 { PR_4_BAD_REF_COUNT,
0c4a0726 1080 N_("@i %i ref count is %Il, @s %N. "),
21c84b71 1081 PROMPT_FIX, PR_PREEN_OK },
1b6bf175
TT
1082
1083 { PR_4_INCONSISTENT_COUNT,
0c4a0726 1084 N_("WARNING: PROGRAMMING BUG IN E2FSCK!\n"
1b6bf175
TT
1085 "\tOR SOME BONEHEAD (YOU) IS CHECKING A MOUNTED (LIVE) FILESYSTEM.\n"
1086 "@i_link_info[%i] is %N, @i.i_links_count is %Il. "
0c4a0726 1087 "They should be the same!\n"),
1b6bf175
TT
1088 PROMPT_NONE, 0 },
1089
1090 /* Pass 5 errors */
1091
1092 /* Pass 5: Checking group summary information */
1093 { PR_5_PASS_HEADER,
0c4a0726 1094 N_("Pass 5: Checking @g summary information\n"),
1b6bf175
TT
1095 PROMPT_NONE, 0 },
1096
1097 /* Padding at end of inode bitmap is not set. */
1098 { PR_5_INODE_BMAP_PADDING,
0c4a0726 1099 N_("Padding at end of @i @B is not set. "),
1b6bf175
TT
1100 PROMPT_FIX, PR_PREEN_OK },
1101
1102 /* Padding at end of block bitmap is not set. */
1103 { PR_5_BLOCK_BMAP_PADDING,
0c4a0726 1104 N_("Padding at end of @b @B is not set. "),
1b6bf175
TT
1105 PROMPT_FIX, PR_PREEN_OK },
1106
1107 /* Block bitmap differences header */
1108 { PR_5_BLOCK_BITMAP_HEADER,
0c4a0726 1109 N_("@b @B differences: "),
1b6bf175
TT
1110 PROMPT_NONE, PR_PREEN_OK | PR_PREEN_NOMSG},
1111
1112 /* Block not used, but marked in bitmap */
1113 { PR_5_UNUSED_BLOCK,
1114 " -%b",
1115 PROMPT_NONE, PR_LATCH_BBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1116
1117 /* Block used, but not marked used in bitmap */
1118 { PR_5_BLOCK_USED,
1119 " +%b",
1120 PROMPT_NONE, PR_LATCH_BBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1121
1122 /* Block bitmap differences end */
1123 { PR_5_BLOCK_BITMAP_END,
1124 "\n",
1125 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1126
1127 /* Inode bitmap differences header */
1128 { PR_5_INODE_BITMAP_HEADER,
0c4a0726 1129 N_("@i @B differences: "),
1b6bf175
TT
1130 PROMPT_NONE, PR_PREEN_OK | PR_PREEN_NOMSG },
1131
1132 /* Inode not used, but marked in bitmap */
1133 { PR_5_UNUSED_INODE,
1134 " -%i",
1135 PROMPT_NONE, PR_LATCH_IBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1136
1137 /* Inode used, but not marked used in bitmap */
1138 { PR_5_INODE_USED,
1139 " +%i",
1140 PROMPT_NONE, PR_LATCH_IBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1141
1142 /* Inode bitmap differences end */
1143 { PR_5_INODE_BITMAP_END,
1144 "\n",
1145 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1146
1147 /* Free inodes count for group wrong */
1148 { PR_5_FREE_INODE_COUNT_GROUP,
0c4a0726 1149 N_("Free @is count wrong for @g #%g (%i, counted=%j).\n"),
1b6bf175
TT
1150 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1151
1152 /* Directories count for group wrong */
1153 { PR_5_FREE_DIR_COUNT_GROUP,
0c4a0726 1154 N_("Directories count wrong for @g #%g (%i, counted=%j).\n"),
1b6bf175
TT
1155 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1156
1157 /* Free inodes count wrong */
1158 { PR_5_FREE_INODE_COUNT,
0c4a0726 1159 N_("Free @is count wrong (%i, counted=%j).\n"),
1b6bf175
TT
1160 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1161
1162 /* Free blocks count for group wrong */
1163 { PR_5_FREE_BLOCK_COUNT_GROUP,
0c4a0726 1164 N_("Free @bs count wrong for @g #%g (%b, counted=%c).\n"),
1b6bf175
TT
1165 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1166
1167 /* Free blocks count wrong */
1168 { PR_5_FREE_BLOCK_COUNT,
0c4a0726 1169 N_("Free @bs count wrong (%b, counted=%c).\n"),
1b6bf175
TT
1170 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1171
1172 /* Programming error: bitmap endpoints don't match */
1173 { PR_5_BMAP_ENDPOINTS,
0c4a0726
TT
1174 N_("PROGRAMMING ERROR: @f (#%N) @B endpoints (%b, %c) don't "
1175 "match calculated @B endpoints (%i, %j)\n"),
1b6bf175
TT
1176 PROMPT_NONE, PR_FATAL },
1177
1178 /* Internal error: fudging end of bitmap */
1179 { PR_5_FUDGE_BITMAP_ERROR,
0c4a0726 1180 N_("Internal error: fudging end of bitmap (%N)\n"),
1b6bf175 1181 PROMPT_NONE, PR_FATAL },
bbd47d76
TT
1182
1183 /* Error copying in replacement inode bitmap */
1184 { PR_5_COPY_IBITMAP_ERROR,
1185 "Error copying in replacement @i @B: %m\n",
1186 PROMPT_NONE, PR_FATAL },
1187
1188 /* Error copying in replacement block bitmap */
1189 { PR_5_COPY_BBITMAP_ERROR,
1190 "Error copying in replacement @b @B: %m\n",
1191 PROMPT_NONE, PR_FATAL },
1192
21c84b71
TT
1193 { 0 }
1194};
1195
1196/*
1197 * This is the latch flags register. It allows several problems to be
1198 * "latched" together. This means that the user has to answer but one
1199 * question for the set of problems, and all of the associated
1200 * problems will be either fixed or not fixed.
1201 */
1b6bf175
TT
1202static struct latch_descr pr_latch_info[] = {
1203 { PR_LATCH_BLOCK, PR_1_INODE_BLOCK_LATCH, 0 },
1204 { PR_LATCH_BBLOCK, PR_1_INODE_BBLOCK_LATCH, 0 },
1205 { PR_LATCH_IBITMAP, PR_5_INODE_BITMAP_HEADER, PR_5_INODE_BITMAP_END },
1206 { PR_LATCH_BBITMAP, PR_5_BLOCK_BITMAP_HEADER, PR_5_BLOCK_BITMAP_END },
1207 { PR_LATCH_RELOC, PR_0_RELOCATE_HINT, 0 },
1208 { PR_LATCH_DBLOCK, PR_1B_DUP_BLOCK_HEADER, PR_1B_DUP_BLOCK_END },
21afac09 1209 { PR_LATCH_LOW_DTIME, PR_1_ORPHAN_LIST_REFUGEES, 0 },
1b6bf175 1210 { -1, 0, 0 },
21c84b71
TT
1211};
1212
1b6bf175 1213static const struct e2fsck_problem *find_problem(int code)
21c84b71
TT
1214{
1215 int i;
1216
1217 for (i=0; problem_table[i].e2p_code; i++) {
1218 if (problem_table[i].e2p_code == code)
1219 return &problem_table[i];
1220 }
1221 return 0;
1222}
1223
1b6bf175
TT
1224static struct latch_descr *find_latch(int code)
1225{
1226 int i;
1227
1228 for (i=0; pr_latch_info[i].latch_code >= 0; i++) {
1229 if (pr_latch_info[i].latch_code == code)
1230 return &pr_latch_info[i];
1231 }
1232 return 0;
1233}
1234
1235int end_problem_latch(e2fsck_t ctx, int mask)
1236{
1237 struct latch_descr *ldesc;
1238 struct problem_context pctx;
1239 int answer = -1;
1240
1241 ldesc = find_latch(mask);
1242 if (ldesc->end_message && (ldesc->flags & PRL_LATCHED)) {
1243 clear_problem_context(&pctx);
1244 answer = fix_problem(ctx, ldesc->end_message, &pctx);
1245 }
1246 ldesc->flags &= ~(PRL_VARIABLE);
1247 return answer;
1248}
1249
1250int set_latch_flags(int mask, int setflags, int clearflags)
21c84b71 1251{
1b6bf175
TT
1252 struct latch_descr *ldesc;
1253
1254 ldesc = find_latch(mask);
1255 if (!ldesc)
1256 return -1;
1257 ldesc->flags |= setflags;
1258 ldesc->flags &= ~clearflags;
1259 return 0;
21c84b71
TT
1260}
1261
1b6bf175 1262int get_latch_flags(int mask, int *value)
21c84b71 1263{
1b6bf175
TT
1264 struct latch_descr *ldesc;
1265
1266 ldesc = find_latch(mask);
1267 if (!ldesc)
1268 return -1;
1269 *value = ldesc->flags;
1270 return 0;
21c84b71
TT
1271}
1272
1273void clear_problem_context(struct problem_context *ctx)
1274{
1275 memset(ctx, 0, sizeof(struct problem_context));
1276 ctx->blkcount = -1;
1277 ctx->group = -1;
1278}
1279
1b6bf175 1280int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx)
21c84b71 1281{
1b6bf175
TT
1282 ext2_filsys fs = ctx->fs;
1283 const struct e2fsck_problem *ptr;
1284 struct latch_descr *ldesc = 0;
1285 const char *message;
1286 int def_yn, answer, ans;
21c84b71
TT
1287 int print_answer = 0;
1288 int suppress = 0;
1289
1290 ptr = find_problem(code);
1291 if (!ptr) {
0c4a0726 1292 printf(_("Unhandled error code (%d)!\n"), code);
21c84b71
TT
1293 return 0;
1294 }
aa4115a4 1295 def_yn = 1;
a846d2f4
TT
1296 if ((ptr->flags & PR_NO_DEFAULT) ||
1297 ((ptr->flags & PR_PREEN_NO) && (ctx->options & E2F_OPT_PREEN)) ||
1298 (ctx->options & E2F_OPT_NO))
aa4115a4 1299 def_yn= 0;
21c84b71
TT
1300
1301 /*
1302 * Do special latch processing. This is where we ask the
1303 * latch question, if it exists
1304 */
1305 if (ptr->flags & PR_LATCH_MASK) {
1b6bf175
TT
1306 ldesc = find_latch(ptr->flags & PR_LATCH_MASK);
1307 if (ldesc->question && !(ldesc->flags & PRL_LATCHED)) {
1308 ans = fix_problem(ctx, ldesc->question, pctx);
1309 if (ans == 1)
1310 ldesc->flags |= PRL_YES;
1311 if (ans == 0)
1312 ldesc->flags |= PRL_NO;
1313 ldesc->flags |= PRL_LATCHED;
1314 }
1315 if (ldesc->flags & PRL_SUPPRESS)
21c84b71
TT
1316 suppress++;
1317 }
1b6bf175
TT
1318 if ((ptr->flags & PR_PREEN_NOMSG) &&
1319 (ctx->options & E2F_OPT_PREEN))
1320 suppress++;
aa4115a4
TT
1321 if ((ptr->flags & PR_NO_NOMSG) &&
1322 (ctx->options & E2F_OPT_NO))
1323 suppress++;
21c84b71 1324 if (!suppress) {
1b6bf175
TT
1325 message = ptr->e2p_description;
1326 if (ctx->options & E2F_OPT_PREEN) {
1327 printf("%s: ", ctx->device_name);
1328#if 0
1329 if (ptr->e2p_preen_msg)
1330 message = ptr->e2p_preen_msg;
1331#endif
1332 }
0c4a0726 1333 print_e2fsck_message(ctx, _(message), pctx, 1);
21c84b71 1334 }
1b6bf175
TT
1335 if (!(ptr->flags & PR_PREEN_OK) && (ptr->prompt != PROMPT_NONE))
1336 preenhalt(ctx);
21c84b71 1337
1b6bf175 1338 if (ptr->flags & PR_FATAL)
f8188fff 1339 fatal_error(ctx, 0);
1b6bf175
TT
1340
1341 if (ptr->prompt == PROMPT_NONE) {
1342 if (ptr->flags & PR_NOCOLLATE)
1343 answer = -1;
21c84b71 1344 else
1b6bf175
TT
1345 answer = def_yn;
1346 } else {
1347 if (ctx->options & E2F_OPT_PREEN) {
1348 answer = def_yn;
1349 if (!(ptr->flags & PR_PREEN_NOMSG))
1350 print_answer = 1;
1351 } else if ((ptr->flags & PR_LATCH_MASK) &&
1352 (ldesc->flags & (PRL_YES | PRL_NO))) {
1353 if (!suppress)
1354 print_answer = 1;
1355 if (ldesc->flags & PRL_YES)
1356 answer = 1;
1357 else
1358 answer = 0;
1359 } else
0c4a0726 1360 answer = ask(ctx, _(prompt[(int) ptr->prompt]), def_yn);
1b6bf175
TT
1361 if (!answer && !(ptr->flags & PR_NO_OK))
1362 ext2fs_unmark_valid(fs);
21c84b71 1363
1b6bf175
TT
1364 if (print_answer)
1365 printf("%s.\n", answer ?
0c4a0726 1366 _(preen_msg[(int) ptr->prompt]) : _("IGNORED"));
21c84b71 1367
1b6bf175
TT
1368 }
1369
f8188fff
TT
1370 if ((ptr->prompt == PROMPT_ABORT) && answer)
1371 fatal_error(ctx, 0);
1b6bf175 1372
3b5386dc
TT
1373 if (ptr->flags & PR_AFTER_CODE)
1374 answer = fix_problem(ctx, ptr->second_code, pctx);
1375
21c84b71
TT
1376 return answer;
1377}