2 * problem.c --- report filesystem problems to the user
4 * Copyright 1996, 1997 by Theodore Ts'o
7 * This file may be redistributed under the terms of the GNU Public
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
39 #define PROMPT_SUPPRESS 16
40 #define PROMPT_UNLINK 17
41 #define PROMPT_CLEAR_HTREE 18
42 #define PROMPT_NULL 19
45 * These are the prompts which are used to ask the user if they want
48 static const char *prompt[] = {
49 N_("(no prompt)"), /* 0 */
52 N_("Relocate"), /* 3 */
53 N_("Allocate"), /* 4 */
55 N_("Connect to /lost+found"), /* 6 */
57 N_("Salvage"), /* 8 */
58 N_("Truncate"), /* 9 */
59 N_("Clear inode"), /* 10 */
62 N_("Continue"), /* 13 */
63 N_("Clone duplicate/bad blocks"), /* 14 */
64 N_("Delete file"), /* 15 */
65 N_("Suppress messages"),/* 16 */
66 N_("Unlink"), /* 17 */
67 N_("Clear HTree index"),/* 18 */
72 * These messages are printed when we are preen mode and we will be
73 * automatically fixing the problem.
75 static const char *preen_msg[] = {
78 N_("CLEARED"), /* 2 */
79 N_("RELOCATED"), /* 3 */
80 N_("ALLOCATED"), /* 4 */
81 N_("EXPANDED"), /* 5 */
82 N_("RECONNECTED"), /* 6 */
83 N_("CREATED"), /* 7 */
84 N_("SALVAGED"), /* 8 */
85 N_("TRUNCATED"), /* 9 */
86 N_("INODE CLEARED"), /* 10 */
87 N_("ABORTED"), /* 11 */
89 N_("CONTINUING"), /* 13 */
90 N_("DUPLICATE/BAD BLOCKS CLONED"), /* 14 */
91 N_("FILE DELETED"), /* 15 */
92 N_("SUPPRESSED"), /* 16 */
93 N_("UNLINKED"), /* 17 */
94 N_("HTREE INDEX CLEARED"),/* 18 */
98 static const struct e2fsck_problem problem_table[] = {
100 /* Pre-Pass 1 errors */
102 /* Block bitmap not in group */
103 { PR_0_BB_NOT_GROUP, N_("@b @B for @g %g is not in @g. (@b %b)\n"),
104 PROMPT_RELOCATE, PR_LATCH_RELOC },
106 /* Inode bitmap not in group */
107 { PR_0_IB_NOT_GROUP, N_("@i @B for @g %g is not in @g. (@b %b)\n"),
108 PROMPT_RELOCATE, PR_LATCH_RELOC },
110 /* Inode table not in group */
111 { PR_0_ITABLE_NOT_GROUP,
112 N_("@i table for @g %g is not in @g. (@b %b)\n"
113 "WARNING: SEVERE DATA LOSS POSSIBLE.\n"),
114 PROMPT_RELOCATE, PR_LATCH_RELOC },
116 /* Superblock corrupt */
118 N_("\nThe @S could not be read or does not describe a correct ext2\n"
119 "@f. If the @v is valid and it really contains an ext2\n"
120 "@f (and not swap or ufs or something else), then the @S\n"
121 "is corrupt, and you might try running e2fsck with an alternate @S:\n"
122 " e2fsck -b %S <@v>\n\n"),
123 PROMPT_NONE, PR_FATAL },
125 /* Filesystem size is wrong */
126 { PR_0_FS_SIZE_WRONG,
127 N_("The @f size (according to the @S) is %b @bs\n"
128 "The physical size of the @v is %c @bs\n"
129 "Either the @S or the partition table is likely to be corrupt!\n"),
132 /* Fragments not supported */
134 N_("@S @b_size = %b, fragsize = %c.\n"
135 "This version of e2fsck does not support fragment sizes different\n"
136 "from the @b size.\n"),
137 PROMPT_NONE, PR_FATAL },
139 /* Bad blocks_per_group */
140 { PR_0_BLOCKS_PER_GROUP,
141 N_("@S @bs_per_group = %b, should have been %c\n"),
142 PROMPT_NONE, PR_AFTER_CODE, PR_0_SB_CORRUPT },
144 /* Bad first_data_block */
145 { PR_0_FIRST_DATA_BLOCK,
146 N_("@S first_data_@b = %b, should have been %c\n"),
147 PROMPT_NONE, PR_AFTER_CODE, PR_0_SB_CORRUPT },
149 /* Adding UUID to filesystem */
151 N_("@f did not have a UUID; generating one.\n\n"),
155 { PR_0_RELOCATE_HINT,
156 N_("Note: if there is several inode or block bitmap blocks\n"
157 "which require relocation, or one part of the inode table\n"
158 "which must be moved, you may wish to try running e2fsck\n"
159 "with the '-b %S' option first. The problem may lie only\n"
160 "with the primary block group descriptor, and the backup\n"
161 "block group descriptor may be OK.\n\n"),
162 PROMPT_NONE, PR_PREEN_OK | PR_NOCOLLATE },
164 /* Miscellaneous superblock corruption */
165 { PR_0_MISC_CORRUPT_SUPER,
166 N_("Corruption found in @S. (%s = %N).\n"),
167 PROMPT_NONE, PR_AFTER_CODE, PR_0_SB_CORRUPT },
169 /* Error determing physical device size of filesystem */
170 { PR_0_GETSIZE_ERROR,
171 N_("Error determining size of the physical @v: %m\n"),
172 PROMPT_NONE, PR_FATAL },
174 /* Inode count in superblock is incorrect */
175 { PR_0_INODE_COUNT_WRONG,
176 N_("@i count in @S is %i, should be %j.\n"),
179 { PR_0_HURD_CLEAR_FILETYPE,
180 N_("The Hurd does not support the filetype feature.\n"),
183 /* Journal inode is invalid */
184 { PR_0_JOURNAL_BAD_INODE,
185 N_("@S has a bad ext3 @j (@i %i).\n"),
186 PROMPT_CLEAR, PR_PREEN_OK },
188 /* The external journal has (unsupported) multiple filesystems */
189 { PR_0_JOURNAL_UNSUPP_MULTIFS,
190 N_("External @j has multiple @f users (unsupported).\n"),
191 PROMPT_NONE, PR_FATAL },
193 /* Can't find external journal */
194 { PR_0_CANT_FIND_JOURNAL,
195 N_("Can't find external @j\n"),
196 PROMPT_NONE, PR_FATAL },
198 /* External journal has bad superblock */
199 { PR_0_EXT_JOURNAL_BAD_SUPER,
200 N_("External @j has bad @S\n"),
201 PROMPT_NONE, PR_FATAL },
203 /* Superblock has a bad journal UUID */
204 { PR_0_JOURNAL_BAD_UUID,
205 N_("External @j does not support this @f\n"),
206 PROMPT_NONE, PR_FATAL },
208 /* Journal has an unknown superblock type */
209 { PR_0_JOURNAL_UNSUPP_SUPER,
210 N_("Ext3 @j @S is unknown type %N (unsupported).\n"
211 "It is likely that your copy of e2fsck is old and/or doesn't "
212 "support this @j format.\n"
213 "It is also possible the @j @S is corrupt.\n"),
214 PROMPT_ABORT, PR_NO_OK | PR_AFTER_CODE, PR_0_JOURNAL_BAD_SUPER },
216 /* Journal superblock is corrupt */
217 { PR_0_JOURNAL_BAD_SUPER,
218 N_("Ext3 @j @S is corrupt.\n"),
219 PROMPT_FIX, PR_PREEN_OK },
221 /* Superblock flag should be cleared */
222 { PR_0_JOURNAL_HAS_JOURNAL,
223 N_("@S doesn't have has_@j flag, but has ext3 @j %s.\n"),
224 PROMPT_CLEAR, PR_PREEN_OK },
226 /* Superblock flag is incorrect */
227 { PR_0_JOURNAL_RECOVER_SET,
228 N_("@S has ext3 needs_recovery flag set, but no @j.\n"),
229 PROMPT_CLEAR, PR_PREEN_OK },
231 /* Journal has data, but recovery flag is clear */
232 { PR_0_JOURNAL_RECOVERY_CLEAR,
233 N_("ext3 recovery flag clear, but @j has data.\n"),
236 /* Ask if we should clear the journal */
237 { PR_0_JOURNAL_RESET_JOURNAL,
239 PROMPT_NULL, PR_PREEN_NOMSG },
241 /* Ask if we should run the journal anyway */
246 /* Run the journal by default */
247 { PR_0_JOURNAL_RUN_DEFAULT,
248 N_("Recovery flag not set in backup @S, so running @j anyway.\n"),
251 /* Clearing orphan inode */
252 { PR_0_ORPHAN_CLEAR_INODE,
253 N_("%s @o @i %i (uid=%Iu, gid=%Ig, mode=%Im, size=%Is)\n"),
256 /* Illegal block found in orphaned inode */
257 { PR_0_ORPHAN_ILLEGAL_BLOCK_NUM,
258 N_("@I @b #%B (%b) found in @o @i %i.\n"),
261 /* Already cleared block found in orphaned inode */
262 { PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
263 N_("Already cleared @b #%B (%b) found in @o @i %i.\n"),
266 /* Illegal orphan inode in superblock */
267 { PR_0_ORPHAN_ILLEGAL_HEAD_INODE,
268 N_("@I @o @i %i in @S.\n"),
271 /* Illegal inode in orphaned inode list */
272 { PR_0_ORPHAN_ILLEGAL_INODE,
273 N_("@I @i %i in @o @i list.\n"),
276 /* Filesystem revision is 0, but feature flags are set */
278 "@f has feature flag(s) set, but is a revision 0 @f. ",
279 PROMPT_FIX, PR_PREEN_OK | PR_NO_OK },
281 /* Journal superblock has an unknown read-only feature flag set */
282 { PR_0_JOURNAL_UNSUPP_ROCOMPAT,
283 N_("Ext3 @j @S has an unknown read-only feature flag set.\n"),
286 /* Journal superblock has an unknown incompatible feature flag set */
287 { PR_0_JOURNAL_UNSUPP_INCOMPAT,
288 N_("Ext3 @j @S has an unknown incompatible feature flag set.\n"),
291 /* Journal has unsupported version number */
292 { PR_0_JOURNAL_UNSUPP_VERSION,
293 N_("@j version not supported by this e2fsck.\n"),
296 /* Moving journal to hidden file */
298 N_("Moving @j from /%s to hidden inode.\n\n"),
301 /* Error moving journal to hidden file */
302 { PR_0_ERR_MOVE_JOURNAL,
303 N_("Error moving @j: %m\n\n"),
306 /* Clearing V2 journal superblock */
307 { PR_0_CLEAR_V2_JOURNAL,
308 N_("Found invalid V2 @j @S fields (from V1 journal).\n"
309 "Clearing fields beyond the V1 @j @S...\n\n"),
312 /* Backup journal inode blocks */
314 N_("Backing up @j @i @b information.\n\n"),
319 /* Pass 1: Checking inodes, blocks, and sizes */
321 N_("Pass 1: Checking @is, @bs, and sizes\n"),
324 /* Root directory is not an inode */
325 { PR_1_ROOT_NO_DIR, N_("@r is not a @d. "),
328 /* Root directory has dtime set */
330 N_("@r has dtime set (probably due to old mke2fs). "),
331 PROMPT_FIX, PR_PREEN_OK },
333 /* Reserved inode has bad mode */
334 { PR_1_RESERVED_BAD_MODE,
335 N_("Reserved @i %i %Q has bad mode. "),
336 PROMPT_CLEAR, PR_PREEN_OK },
338 /* Deleted inode has zero dtime */
340 N_("@D @i %i has zero dtime. "),
341 PROMPT_FIX, PR_PREEN_OK },
343 /* Inode in use, but dtime set */
345 N_("@i %i is in use, but has dtime set. "),
346 PROMPT_FIX, PR_PREEN_OK },
348 /* Zero-length directory */
349 { PR_1_ZERO_LENGTH_DIR,
350 N_("@i %i is a @z @d. "),
351 PROMPT_CLEAR, PR_PREEN_OK },
353 /* Block bitmap conflicts with some other fs block */
355 N_("@g %g's @b @B at %b @C.\n"),
356 PROMPT_RELOCATE, 0 },
358 /* Inode bitmap conflicts with some other fs block */
360 N_("@g %g's @i @B at %b @C.\n"),
361 PROMPT_RELOCATE, 0 },
363 /* Inode table conflicts with some other fs block */
364 { PR_1_ITABLE_CONFLICT,
365 N_("@g %g's @i table at %b @C.\n"),
366 PROMPT_RELOCATE, 0 },
368 /* Block bitmap is on a bad block */
370 N_("@g %g's @b @B (%b) is bad. "),
371 PROMPT_RELOCATE, 0 },
373 /* Inode bitmap is on a bad block */
375 N_("@g %g's @i @B (%b) is bad. "),
376 PROMPT_RELOCATE, 0 },
378 /* Inode has incorrect i_size */
380 N_("@i %i, i_size is %Is, @s %N. "),
381 PROMPT_FIX, PR_PREEN_OK },
383 /* Inode has incorrect i_blocks */
385 N_("@i %i, i_@bs is %Ib, @s %N. "),
386 PROMPT_FIX, PR_PREEN_OK },
388 /* Illegal blocknumber in inode */
389 { PR_1_ILLEGAL_BLOCK_NUM,
390 N_("@I @b #%B (%b) in @i %i. "),
391 PROMPT_CLEAR, PR_LATCH_BLOCK },
393 /* Block number overlaps fs metadata */
394 { PR_1_BLOCK_OVERLAPS_METADATA,
395 N_("@b #%B (%b) overlaps @f metadata in @i %i. "),
396 PROMPT_CLEAR, PR_LATCH_BLOCK },
398 /* Inode has illegal blocks (latch question) */
399 { PR_1_INODE_BLOCK_LATCH,
400 N_("@i %i has illegal @b(s). "),
403 /* Too many bad blocks in inode */
404 { PR_1_TOO_MANY_BAD_BLOCKS,
405 N_("Too many illegal @bs in @i %i.\n"),
406 PROMPT_CLEAR_INODE, PR_NO_OK },
408 /* Illegal block number in bad block inode */
409 { PR_1_BB_ILLEGAL_BLOCK_NUM,
410 N_("@I @b #%B (%b) in bad @b @i. "),
411 PROMPT_CLEAR, PR_LATCH_BBLOCK },
413 /* Bad block inode has illegal blocks (latch question) */
414 { PR_1_INODE_BBLOCK_LATCH,
415 N_("Bad @b @i has illegal @b(s). "),
418 /* Duplicate or bad blocks in use! */
419 { PR_1_DUP_BLOCKS_PREENSTOP,
420 N_("Duplicate or bad @b in use!\n"),
423 /* Bad block used as bad block indirect block */
424 { PR_1_BBINODE_BAD_METABLOCK,
425 N_("Bad @b %b used as bad @b @i indirect @b. "),
426 PROMPT_CLEAR, PR_LATCH_BBLOCK },
428 /* Inconsistency can't be fixed prompt */
429 { PR_1_BBINODE_BAD_METABLOCK_PROMPT,
430 N_("\nThe bad @b @i has probably been corrupted. You probably\n"
431 "should stop now and run ""e2fsck -c"" to scan for bad blocks\n"
433 PROMPT_CONTINUE, PR_PREEN_NOMSG },
435 /* Bad primary block */
436 { PR_1_BAD_PRIMARY_BLOCK,
437 N_("\nIf the @b is really bad, the @f can not be fixed.\n"),
438 PROMPT_NONE, PR_AFTER_CODE, PR_1_BAD_PRIMARY_BLOCK_PROMPT },
440 /* Bad primary block prompt */
441 { PR_1_BAD_PRIMARY_BLOCK_PROMPT,
442 N_("You can clear the this @b (and hope for the best) from the\n"
443 "bad @b list and hope that @b is really OK, but there are no\n"
445 PROMPT_CLEAR, PR_PREEN_NOMSG },
447 /* Bad primary superblock */
448 { PR_1_BAD_PRIMARY_SUPERBLOCK,
449 N_("The primary @S (%b) is on the bad @b list.\n"),
450 PROMPT_NONE, PR_AFTER_CODE, PR_1_BAD_PRIMARY_BLOCK },
452 /* Bad primary block group descriptors */
453 { PR_1_BAD_PRIMARY_GROUP_DESCRIPTOR,
454 N_("Block %b in the primary @g descriptors "
455 "is on the bad @b list\n"),
456 PROMPT_NONE, PR_AFTER_CODE, PR_1_BAD_PRIMARY_BLOCK },
458 /* Bad superblock in group */
459 { PR_1_BAD_SUPERBLOCK,
460 N_("Warning: Group %g's @S (%b) is bad.\n"),
461 PROMPT_NONE, PR_PREEN_OK | PR_PREEN_NOMSG },
463 /* Bad block group descriptors in group */
464 { PR_1_BAD_GROUP_DESCRIPTORS,
465 N_("Warning: Group %g's copy of the @g descriptors has a bad "
467 PROMPT_NONE, PR_PREEN_OK | PR_PREEN_NOMSG },
469 /* Block claimed for no reason */
470 { PR_1_PROGERR_CLAIMED_BLOCK,
471 N_("Programming error? @b #%b claimed for no reason in "
472 "process_bad_@b.\n"),
473 PROMPT_NONE, PR_PREEN_OK },
475 /* Error allocating blocks for relocating metadata */
476 { PR_1_RELOC_BLOCK_ALLOCATE,
477 N_("@A %N contiguous @b(s) in @b @g %g for %s: %m\n"),
478 PROMPT_NONE, PR_PREEN_OK },
480 /* Error allocating block buffer during relocation process */
481 { PR_1_RELOC_MEMORY_ALLOCATE,
482 N_("@A @b buffer for relocating %s\n"),
483 PROMPT_NONE, PR_PREEN_OK },
485 /* Relocating metadata group information from X to Y */
486 { PR_1_RELOC_FROM_TO,
487 N_("Relocating @g %g's %s from %b to %c...\n"),
488 PROMPT_NONE, PR_PREEN_OK },
490 /* Relocating metatdata group information to X */
492 N_("Relocating @g %g's %s to %c...\n"), /* xgettext:no-c-format */
493 PROMPT_NONE, PR_PREEN_OK },
495 /* Block read error during relocation process */
496 { PR_1_RELOC_READ_ERR,
497 N_("Warning: could not read @b %b of %s: %m\n"),
498 PROMPT_NONE, PR_PREEN_OK },
500 /* Block write error during relocation process */
501 { PR_1_RELOC_WRITE_ERR,
502 N_("Warning: could not write @b %b for %s: %m\n"),
503 PROMPT_NONE, PR_PREEN_OK },
505 /* Error allocating inode bitmap */
506 { PR_1_ALLOCATE_IBITMAP_ERROR,
507 "@A @i @B (%N): %m\n",
508 PROMPT_NONE, PR_FATAL },
510 /* Error allocating block bitmap */
511 { PR_1_ALLOCATE_BBITMAP_ERROR,
512 "@A @b @B (%N): %m\n",
513 PROMPT_NONE, PR_FATAL },
515 /* Error allocating icount structure */
516 { PR_1_ALLOCATE_ICOUNT,
517 N_("@A icount link information: %m\n"),
518 PROMPT_NONE, PR_FATAL },
520 /* Error allocating dbcount */
521 { PR_1_ALLOCATE_DBCOUNT,
522 N_("@A @d @b array: %m\n"),
523 PROMPT_NONE, PR_FATAL },
525 /* Error while scanning inodes */
527 N_("Error while scanning @is (%i): %m\n"),
528 PROMPT_NONE, PR_FATAL },
530 /* Error while iterating over blocks */
531 { PR_1_BLOCK_ITERATE,
532 N_("Error while iterating over @bs in @i %i: %m\n"),
533 PROMPT_NONE, PR_FATAL },
535 /* Error while storing inode count information */
537 N_("Error storing @i count information (@i=%i, count=%N): %m\n"),
538 PROMPT_NONE, PR_FATAL },
540 /* Error while storing directory block information */
542 N_("Error storing @d @b information "
543 "(@i=%i, @b=%b, num=%N): %m\n"),
544 PROMPT_NONE, PR_FATAL },
546 /* Error while reading inode (for clearing) */
548 N_("Error reading @i %i: %m\n"),
549 PROMPT_NONE, PR_FATAL },
551 /* Suppress messages prompt */
552 { PR_1_SUPPRESS_MESSAGES, "", PROMPT_SUPPRESS, PR_NO_OK },
554 /* Imagic flag set on an inode when filesystem doesn't support it */
556 N_("@i %i has imagic flag set. "),
559 /* Immutable flag set on a device or socket inode */
560 { PR_1_SET_IMMUTABLE,
561 N_("Special (@v/socket/fifo/symlink) file (@i %i) has immutable\n"
562 "or append-only flag set. "),
563 PROMPT_CLEAR, PR_PREEN_OK | PR_PREEN_NO | PR_NO_OK },
565 /* Compression flag set on an inode when filesystem doesn't support it */
567 N_("@i %i has @cion flag set on @f without @cion support. "),
570 /* Non-zero size for device, fifo or socket inode */
572 "Special (@v/socket/fifo) @i %i has non-zero size. ",
573 PROMPT_FIX, PR_PREEN_OK },
575 /* Filesystem revision is 0, but feature flags are set */
577 "@f has feature flag(s) set, but is a revision 0 @f. ",
578 PROMPT_FIX, PR_PREEN_OK | PR_NO_OK },
580 /* Journal inode is not in use, but contains data */
581 { PR_1_JOURNAL_INODE_NOT_CLEAR,
582 "@j @i is not in use, but contains data. ",
583 PROMPT_CLEAR, PR_PREEN_OK },
585 /* Journal has bad mode */
586 { PR_1_JOURNAL_BAD_MODE,
587 N_("@j is not regular file. "),
588 PROMPT_FIX, PR_PREEN_OK },
590 /* Deal with inodes that were part of orphan linked list */
592 N_("@i %i was part of the orphaned @i list. "),
593 PROMPT_FIX, PR_LATCH_LOW_DTIME, 0 },
595 /* Deal with inodes that were part of corrupted orphan linked
596 list (latch question) */
597 { PR_1_ORPHAN_LIST_REFUGEES,
598 N_("@is that were part of a corrupted orphan linked list found. "),
601 /* Error allocating refcount structure */
602 { PR_1_ALLOCATE_REFCOUNT,
603 "@A refcount structure (%N): %m\n",
604 PROMPT_NONE, PR_FATAL },
606 /* Error reading extended attribute block */
607 { PR_1_READ_EA_BLOCK,
608 N_("Error reading @a @b %b for @i %i. "),
611 /* Invalid extended attribute block */
613 N_("@i %i has a bad @a @b %b. "),
616 /* Error reading Extended Attribute block while fixing refcount */
617 { PR_1_EXTATTR_READ_ABORT,
618 N_("Error reading @a @b %b (%m). "),
621 /* Extended attribute reference count incorrect */
622 { PR_1_EXTATTR_REFCOUNT,
623 N_("@a @b %b has reference count %B, should be %N. "),
626 /* Error writing Extended Attribute block while fixing refcount */
627 { PR_1_EXTATTR_WRITE,
628 N_("Error writing @a @b %b (%m). "),
631 /* Multiple EA blocks not supported */
632 { PR_1_EA_MULTI_BLOCK,
633 N_("@a @b %b has h_blocks > 1. "),
636 /* Error allocating EA region allocation structure */
637 { PR_1_EA_ALLOC_REGION,
638 N_("Error allocating @a @b %b. "),
641 /* Error EA allocation collision */
642 { PR_1_EA_ALLOC_COLLISION,
643 N_("@a @b %b is corrupt (allocation collision). "),
646 /* Bad extended attribute name */
648 N_("@a @b %b is corrupt (invalid name). "),
651 /* Bad extended attribute value */
653 N_("@a @b %b is corrupt (invalid value). "),
656 /* Inode too big (latch question) */
658 N_("@i %i is too big. "), PROMPT_TRUNCATE, 0 },
660 /* Directory too big */
662 N_("@b #%B (%b) causes @d to be too big. "),
663 PROMPT_CLEAR, PR_LATCH_TOOBIG },
665 /* Regular file too big */
667 N_("@b #%B (%b) causes file to be too big. "),
668 PROMPT_CLEAR, PR_LATCH_TOOBIG },
670 /* Symlink too big */
671 { PR_1_TOOBIG_SYMLINK,
672 N_("@b #%B (%b) causes symlink to be too big. "),
673 PROMPT_CLEAR, PR_LATCH_TOOBIG },
675 /* INDEX_FL flag set on a non-HTREE filesystem */
677 N_("@i %i has INDEX_FL flag set on @f without htree support.\n"),
678 PROMPT_CLEAR_HTREE, PR_PREEN_OK },
680 /* INDEX_FL flag set on a non-directory */
682 N_("@i %i has INDEX_FL flag set but is not a @d.\n"),
683 PROMPT_CLEAR_HTREE, PR_PREEN_OK },
685 /* Invalid root node in HTREE directory */
686 { PR_1_HTREE_BADROOT,
687 N_("@h %i has an invalid root node.\n"),
688 PROMPT_CLEAR_HTREE, PR_PREEN_OK },
690 /* Unsupported hash version in HTREE directory */
692 N_("@h %i has an unsupported hash version (%N)\n"),
693 PROMPT_CLEAR_HTREE, PR_PREEN_OK },
695 /* Incompatible flag in HTREE root node */
696 { PR_1_HTREE_INCOMPAT,
697 N_("@h %i uses an incompatible htree root node flag.\n"),
698 PROMPT_CLEAR_HTREE, PR_PREEN_OK },
702 N_("@h %i has a tree depth (%N) which is too big\n"),
703 PROMPT_CLEAR_HTREE, PR_PREEN_OK },
705 /* Bad block has indirect block that conflicts with filesystem block */
707 N_("Bad @b @i has an indirect @b (%b) that conflicts with\n"
709 PROMPT_CLEAR, PR_LATCH_BBLOCK },
713 /* Pass 1B: Rescan for duplicate/bad blocks */
715 N_("Duplicate @bs found... invoking duplicate @b passes.\n"
716 "Pass 1B: Rescan for duplicate/bad @bs\n"),
719 /* Duplicate/bad block(s) header */
720 { PR_1B_DUP_BLOCK_HEADER,
721 N_("Duplicate/bad @b(s) in @i %i:"),
724 /* Duplicate/bad block(s) in inode */
727 PROMPT_NONE, PR_LATCH_DBLOCK },
729 /* Duplicate/bad block(s) end */
730 { PR_1B_DUP_BLOCK_END,
734 /* Error while scanning inodes */
736 N_("Error while scanning inodes (%i): %m\n"),
737 PROMPT_NONE, PR_FATAL },
739 /* Error allocating inode bitmap */
740 { PR_1B_ALLOCATE_IBITMAP_ERROR,
741 N_("@A @i @B (inode_dup_map): %m\n"),
742 PROMPT_NONE, PR_FATAL },
744 /* Error while iterating over blocks */
745 { PR_1B_BLOCK_ITERATE,
746 N_("Error while iterating over @bs in @i %i (%s): %m\n"),
749 /* Error adjusting EA refcount */
750 { PR_1B_ADJ_EA_REFCOUNT,
751 N_("Error addjusting refcount for @a @b %b (@i %i): %m\n"),
755 /* Pass 1C: Scan directories for inodes with dup blocks. */
757 N_("Pass 1C: Scan directories for @is with dup @bs.\n"),
761 /* Pass 1D: Reconciling duplicate blocks */
763 N_("Pass 1D: Reconciling duplicate @bs\n"),
766 /* File has duplicate blocks */
768 N_("File %Q (@i #%i, mod time %IM) \n"
769 " has %B duplicate @b(s), shared with %N file(s):\n"),
772 /* List of files sharing duplicate blocks */
773 { PR_1D_DUP_FILE_LIST,
774 N_("\t%Q (@i #%i, mod time %IM)\n"),
777 /* File sharing blocks with filesystem metadata */
778 { PR_1D_SHARE_METADATA,
779 N_("\t<@f metadata>\n"),
782 /* Report of how many duplicate/bad inodes */
783 { PR_1D_NUM_DUP_INODES,
784 N_("(There are %N @is containing duplicate/bad @bs.)\n\n"),
787 /* Duplicated blocks already reassigned or cloned. */
788 { PR_1D_DUP_BLOCKS_DEALT,
789 N_("Duplicated @bs already reassigned or cloned.\n\n"),
792 /* Clone duplicate/bad blocks? */
793 { PR_1D_CLONE_QUESTION,
794 "", PROMPT_CLONE, PR_NO_OK },
797 { PR_1D_DELETE_QUESTION,
798 "", PROMPT_DELETE, 0 },
800 /* Couldn't clone file (error) */
802 N_("Couldn't clone file: %m\n"), PROMPT_NONE, 0 },
806 /* Pass 2: Checking directory structure */
808 N_("Pass 2: Checking @d structure\n"),
811 /* Bad inode number for '.' */
812 { PR_2_BAD_INODE_DOT,
813 N_("Bad @i number for '.' in @d @i %i.\n"),
816 /* Directory entry has bad inode number */
818 N_("@E has bad @i #: %Di.\n"),
821 /* Directory entry has deleted or unused inode */
823 N_("@E has @D/unused @i %Di. "),
824 PROMPT_CLEAR, PR_PREEN_OK },
826 /* Directry entry is link to '.' */
831 /* Directory entry points to inode now located in a bad block */
833 N_("@E points to @i (%Di) located in a bad @b.\n"),
836 /* Directory entry contains a link to a directory */
838 N_("@E @L to @d %P (%Di).\n"),
841 /* Directory entry contains a link to the root directry */
843 N_("@E @L to the @r.\n"),
846 /* Directory entry has illegal characters in its name */
848 N_("@E has illegal characters in its name.\n"),
851 /* Missing '.' in directory inode */
853 N_("Missing '.' in @d @i %i.\n"),
856 /* Missing '..' in directory inode */
857 { PR_2_MISSING_DOT_DOT,
858 N_("Missing '..' in @d @i %i.\n"),
861 /* First entry in directory inode doesn't contain '.' */
863 N_("First @e '%Dn' (inode=%Di) in @d @i %i (%p) @s '.'\n"),
866 /* Second entry in directory inode doesn't contain '..' */
867 { PR_2_2ND_NOT_DOT_DOT,
868 N_("Second @e '%Dn' (inode=%Di) in @d @i %i @s '..'\n"),
871 /* i_faddr should be zero */
873 N_("i_faddr @F %IF, @s zero.\n"),
876 /* i_file_acl should be zero */
877 { PR_2_FILE_ACL_ZERO,
878 N_("i_file_acl @F %If, @s zero.\n"),
881 /* i_dir_acl should be zero */
883 N_("i_dir_acl @F %Id, @s zero.\n"),
886 /* i_frag should be zero */
888 N_("i_frag @F %N, @s zero.\n"),
891 /* i_fsize should be zero */
893 N_("i_fsize @F %N, @s zero.\n"),
896 /* inode has bad mode */
898 N_("@i %i (%Q) has a bad mode (%Im).\n"),
901 /* directory corrupted */
902 { PR_2_DIR_CORRUPTED,
903 N_("@d @i %i, @b %B, offset %N: @d corrupted\n"),
906 /* filename too long */
907 { PR_2_FILENAME_LONG,
908 N_("@d @i %i, @b %B, offset %N: filename too long\n"),
909 PROMPT_TRUNCATE, 0 },
911 /* Directory inode has a missing block (hole) */
912 { PR_2_DIRECTORY_HOLE,
913 N_("@d @i %i has an unallocated @b #%B. "),
914 PROMPT_ALLOCATE, 0 },
916 /* '.' is not NULL terminated */
917 { PR_2_DOT_NULL_TERM,
918 N_("'.' @d @e in @d @i %i is not NULL terminated\n"),
921 /* '..' is not NULL terminated */
922 { PR_2_DOT_DOT_NULL_TERM,
923 N_("'..' @d @e in @d @i %i is not NULL terminated\n"),
926 /* Illegal character device inode */
928 N_("@i %i (%Q) is an @I character @v.\n"),
931 /* Illegal block device inode */
932 { PR_2_BAD_BLOCK_DEV,
933 N_("@i %i (%Q) is an @I @b @v.\n"),
936 /* Duplicate '.' entry */
938 N_("@E is duplicate '.' @e.\n"),
941 /* Duplicate '..' entry */
943 N_("@E is duplicate '..' @e.\n"),
946 /* Internal error: couldn't find dir_info */
948 N_("Internal error: couldn't find dir_info for %i.\n"),
949 PROMPT_NONE, PR_FATAL },
951 /* Final rec_len is wrong */
953 N_("@E has rec_len of %Dr, should be %N.\n"),
956 /* Error allocating icount structure */
957 { PR_2_ALLOCATE_ICOUNT,
958 N_("@A icount structure: %m\n"),
959 PROMPT_NONE, PR_FATAL },
961 /* Error iterating over directory blocks */
962 { PR_2_DBLIST_ITERATE,
963 N_("Error iterating over @d @bs: %m\n"),
964 PROMPT_NONE, PR_FATAL },
966 /* Error reading directory block */
967 { PR_2_READ_DIRBLOCK,
968 N_("Error reading @d @b %b (@i %i): %m\n"),
969 PROMPT_CONTINUE, 0 },
971 /* Error writing directory block */
972 { PR_2_WRITE_DIRBLOCK,
973 N_("Error writing @d @b %b (@i %i): %m\n"),
974 PROMPT_CONTINUE, 0 },
976 /* Error allocating new directory block */
977 { PR_2_ALLOC_DIRBOCK,
978 N_("@A new @d @b for @i %i (%s): %m\n"),
981 /* Error deallocating inode */
982 { PR_2_DEALLOC_INODE,
983 N_("Error deallocating @i %i: %m\n"),
984 PROMPT_NONE, PR_FATAL },
986 /* Directory entry for '.' is big. Split? */
988 N_("@d @e for '.' is big. "),
989 PROMPT_SPLIT, PR_NO_OK },
991 /* Illegal FIFO inode */
993 N_("@i %i (%Q) is an @I FIFO.\n"),
996 /* Illegal socket inode */
998 N_("@i %i (%Q) is an @I socket.\n"),
1001 /* Directory filetype not set */
1002 { PR_2_SET_FILETYPE,
1003 N_("Setting filetype for @E to %N.\n"),
1004 PROMPT_NONE, PR_PREEN_OK | PR_NO_OK | PR_NO_NOMSG },
1006 /* Directory filetype incorrect */
1007 { PR_2_BAD_FILETYPE,
1008 N_("@E has an incorrect filetype (was %Dt, should be %N).\n"),
1011 /* Directory filetype set on filesystem */
1012 { PR_2_CLEAR_FILETYPE,
1013 N_("@E has filetype set.\n"),
1014 PROMPT_CLEAR, PR_PREEN_OK },
1016 /* Directory filename is null */
1018 N_("@E has a zero-length name.\n"),
1021 /* Invalid symlink */
1022 { PR_2_INVALID_SYMLINK,
1023 N_("Symlink %Q (@i #%i) is invalid.\n"),
1026 /* i_file_acl (extended attribute block) is bad */
1027 { PR_2_FILE_ACL_BAD,
1028 N_("@a @b @F invalid (%If).\n"),
1031 /* Filesystem contains large files, but has no such flag in sb */
1032 { PR_2_FEATURE_LARGE_FILES,
1033 N_("@f contains large files, but lacks LARGE_FILE flag in @S.\n"),
1036 /* Node in HTREE directory not referenced */
1037 { PR_2_HTREE_NOTREF,
1038 N_("@p @h %d: node (%B) not referenced\n"),
1041 /* Node in HTREE directory referenced twice */
1042 { PR_2_HTREE_DUPREF,
1043 N_("@p @h %d: node (%B) referenced twice\n"),
1046 /* Node in HTREE directory has bad min hash */
1047 { PR_2_HTREE_MIN_HASH,
1048 N_("@p @h %d: node (%B) has bad min hash\n"),
1051 /* Node in HTREE directory has bad max hash */
1052 { PR_2_HTREE_MAX_HASH,
1053 N_("@p @h %d: node (%B) has bad max hash\n"),
1056 /* Clear invalid HTREE directory */
1058 N_("Invalid @h %d (%q). "), PROMPT_CLEAR, 0 },
1060 /* Clear the htree flag forcibly */
1062 N_("Forcibly clearing HTREE flag on @i %d (%q). (Beta test code)\n"),
1065 /* Bad block in htree interior node */
1066 { PR_2_HTREE_BADBLK,
1067 N_("@p @h %d (%q): bad @b number %b.\n"),
1068 PROMPT_CLEAR_HTREE, 0 },
1070 /* Error adjusting EA refcount */
1071 { PR_2_ADJ_EA_REFCOUNT,
1072 N_("Error addjusting refcount for @a @b %b (@i %i): %m\n"),
1073 PROMPT_NONE, PR_FATAL },
1075 /* Invalid HTREE root node */
1076 { PR_2_HTREE_BAD_ROOT,
1077 N_("@p @h %d: root node is invalid\n"),
1078 PROMPT_CLEAR_HTREE, PR_PREEN_OK },
1080 /* Invalid HTREE limit */
1081 { PR_2_HTREE_BAD_LIMIT,
1082 N_("@p @h %d: node (%B) has bad limit (%N)\n"),
1083 PROMPT_CLEAR_HTREE, PR_PREEN_OK },
1085 /* Invalid HTREE count */
1086 { PR_2_HTREE_BAD_COUNT,
1087 N_("@p @h %d: node (%B) has bad count (%N)\n"),
1088 PROMPT_CLEAR_HTREE, PR_PREEN_OK },
1090 /* HTREE interior node has out-of-order hashes in table */
1091 { PR_2_HTREE_HASH_ORDER,
1092 N_("@p @h %d: node (%B) has an unordered hash table\n"),
1093 PROMPT_CLEAR_HTREE, PR_PREEN_OK },
1095 /* Node in HTREE directory has bad depth */
1096 { PR_2_HTREE_BAD_DEPTH,
1097 N_("@p @h %d: node (%B) has bad depth\n"),
1100 /* Duplicate directory entry found */
1101 { PR_2_DUPLICATE_DIRENT,
1102 N_("Duplicate @E found. "),
1105 /* Non-unique filename found */
1106 { PR_2_NON_UNIQUE_FILE, /* xgettext: no-c-format */
1107 N_("@E has a non-unique filename.\nRename to %s"),
1110 /* Duplicate directory entry found */
1111 { PR_2_REPORT_DUP_DIRENT,
1112 N_("Duplicate @e '%Dn' found.\n\tMarking %p (%i) to be rebuilt.\n\n"),
1117 /* Pass 3: Checking directory connectivity */
1119 N_("Pass 3: Checking @d connectivity\n"),
1122 /* Root inode not allocated */
1123 { PR_3_NO_ROOT_INODE,
1124 N_("@r not allocated. "),
1125 PROMPT_ALLOCATE, 0 },
1127 /* No room in lost+found */
1128 { PR_3_EXPAND_LF_DIR,
1129 N_("No room in @l @d. "),
1132 /* Unconnected directory inode */
1133 { PR_3_UNCONNECTED_DIR,
1134 N_("Unconnected @d @i %i (%p)\n"),
1135 PROMPT_CONNECT, 0 },
1137 /* /lost+found not found */
1139 N_("/@l not found. "),
1140 PROMPT_CREATE, PR_PREEN_OK },
1142 /* .. entry is incorrect */
1144 N_("'..' in %Q (%i) is %P (%j), @s %q (%d).\n"),
1147 /* Bad or non-existent /lost+found. Cannot reconnect */
1149 N_("Bad or non-existent /@l. Cannot reconnect.\n"),
1152 /* Could not expand /lost+found */
1153 { PR_3_CANT_EXPAND_LPF,
1154 N_("Could not expand /@l: %m\n"),
1157 /* Could not reconnect inode */
1158 { PR_3_CANT_RECONNECT,
1159 N_("Could not reconnect %i: %m\n"),
1162 /* Error while trying to find /lost+found */
1163 { PR_3_ERR_FIND_LPF,
1164 N_("Error while trying to find /@l: %m\n"),
1167 /* Error in ext2fs_new_block while creating /lost+found */
1168 { PR_3_ERR_LPF_NEW_BLOCK,
1169 N_("ext2fs_new_@b: %m while trying to create /@l @d\n"),
1172 /* Error in ext2fs_new_inode while creating /lost+found */
1173 { PR_3_ERR_LPF_NEW_INODE,
1174 N_("ext2fs_new_@i: %m while trying to create /@l @d\n"),
1177 /* Error in ext2fs_new_dir_block while creating /lost+found */
1178 { PR_3_ERR_LPF_NEW_DIR_BLOCK,
1179 N_("ext2fs_new_dir_@b: %m while creating new @d @b\n"),
1182 /* Error while writing directory block for /lost+found */
1183 { PR_3_ERR_LPF_WRITE_BLOCK,
1184 N_("ext2fs_write_dir_@b: %m while writing the @d @b for /@l\n"),
1187 /* Error while adjusting inode count */
1188 { PR_3_ADJUST_INODE,
1189 N_("Error while adjusting @i count on @i %i\n"),
1192 /* Couldn't fix parent directory -- error */
1193 { PR_3_FIX_PARENT_ERR,
1194 N_("Couldn't fix parent of @i %i: %m\n\n"),
1197 /* Couldn't fix parent directory -- couldn't find it */
1198 { PR_3_FIX_PARENT_NOFIND,
1199 N_("Couldn't fix parent of @i %i: Couldn't find parent @d entry\n\n"),
1202 /* Error allocating inode bitmap */
1203 { PR_3_ALLOCATE_IBITMAP_ERROR,
1204 N_("@A @i @B (%N): %m\n"),
1205 PROMPT_NONE, PR_FATAL },
1207 /* Error creating root directory */
1208 { PR_3_CREATE_ROOT_ERROR,
1209 N_("Error creating root @d (%s): %m\n"),
1210 PROMPT_NONE, PR_FATAL },
1212 /* Error creating lost and found directory */
1213 { PR_3_CREATE_LPF_ERROR,
1214 N_("Error creating /@l @d (%s): %m\n"),
1215 PROMPT_NONE, PR_FATAL },
1217 /* Root inode is not directory; aborting */
1218 { PR_3_ROOT_NOT_DIR_ABORT,
1219 N_("@r is not a @d; aborting.\n"),
1220 PROMPT_NONE, PR_FATAL },
1222 /* Cannot proceed without a root inode. */
1223 { PR_3_NO_ROOT_INODE_ABORT,
1224 N_("Cannot proceed without a @r.\n"),
1225 PROMPT_NONE, PR_FATAL },
1227 /* Internal error: couldn't find dir_info */
1229 N_("Internal error: couldn't find dir_info for %i.\n"),
1230 PROMPT_NONE, PR_FATAL },
1232 /* Lost+found not a directory */
1234 N_("/@l is not a @d (ino=%i)\n"),
1237 /* Pass 3A Directory Optimization */
1239 /* Pass 3A: Optimizing directories */
1240 { PR_3A_PASS_HEADER,
1241 N_("Pass 3A: Optimizing directories\n"),
1242 PROMPT_NONE, PR_PREEN_NOMSG },
1244 /* Error iterating over directories */
1245 { PR_3A_OPTIMIZE_ITER,
1246 N_("Failed to create dirs_to_hash iterator: %m"),
1249 /* Error rehash directory */
1250 { PR_3A_OPTIMIZE_DIR_ERR,
1251 N_("Failed to optimize directory %q (%d): %m"),
1254 /* Rehashing dir header */
1255 { PR_3A_OPTIMIZE_DIR_HEADER,
1256 N_("Optimizing directories: "),
1257 PROMPT_NONE, PR_MSG_ONLY },
1259 /* Rehashing directory %d */
1260 { PR_3A_OPTIMIZE_DIR,
1262 PROMPT_NONE, PR_LATCH_OPTIMIZE_DIR | PR_PREEN_NOHDR},
1264 /* Rehashing dir end */
1265 { PR_3A_OPTIMIZE_DIR_END,
1267 PROMPT_NONE, PR_PREEN_NOHDR },
1271 /* Pass 4: Checking reference counts */
1273 N_("Pass 4: Checking reference counts\n"),
1276 /* Unattached zero-length inode */
1277 { PR_4_ZERO_LEN_INODE,
1279 PROMPT_CLEAR, PR_PREEN_OK|PR_NO_OK },
1281 /* Unattached inode */
1282 { PR_4_UNATTACHED_INODE,
1284 PROMPT_CONNECT, 0 },
1286 /* Inode ref count wrong */
1287 { PR_4_BAD_REF_COUNT,
1288 N_("@i %i ref count is %Il, @s %N. "),
1289 PROMPT_FIX, PR_PREEN_OK },
1291 { PR_4_INCONSISTENT_COUNT,
1292 N_("WARNING: PROGRAMMING BUG IN E2FSCK!\n"
1293 "\tOR SOME BONEHEAD (YOU) IS CHECKING A MOUNTED (LIVE) FILESYSTEM.\n"
1294 "@i_link_info[%i] is %N, @i.i_links_count is %Il. "
1295 "They should be the same!\n"),
1300 /* Pass 5: Checking group summary information */
1302 N_("Pass 5: Checking @g summary information\n"),
1305 /* Padding at end of inode bitmap is not set. */
1306 { PR_5_INODE_BMAP_PADDING,
1307 N_("Padding at end of @i @B is not set. "),
1308 PROMPT_FIX, PR_PREEN_OK },
1310 /* Padding at end of block bitmap is not set. */
1311 { PR_5_BLOCK_BMAP_PADDING,
1312 N_("Padding at end of @b @B is not set. "),
1313 PROMPT_FIX, PR_PREEN_OK },
1315 /* Block bitmap differences header */
1316 { PR_5_BLOCK_BITMAP_HEADER,
1317 N_("@b @B differences: "),
1318 PROMPT_NONE, PR_PREEN_OK | PR_PREEN_NOMSG},
1320 /* Block not used, but marked in bitmap */
1321 { PR_5_BLOCK_UNUSED,
1323 PROMPT_NONE, PR_LATCH_BBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1325 /* Block used, but not marked used in bitmap */
1328 PROMPT_NONE, PR_LATCH_BBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1330 /* Block bitmap differences end */
1331 { PR_5_BLOCK_BITMAP_END,
1333 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1335 /* Inode bitmap differences header */
1336 { PR_5_INODE_BITMAP_HEADER,
1337 N_("@i @B differences: "),
1338 PROMPT_NONE, PR_PREEN_OK | PR_PREEN_NOMSG },
1340 /* Inode not used, but marked in bitmap */
1341 { PR_5_INODE_UNUSED,
1343 PROMPT_NONE, PR_LATCH_IBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1345 /* Inode used, but not marked used in bitmap */
1348 PROMPT_NONE, PR_LATCH_IBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1350 /* Inode bitmap differences end */
1351 { PR_5_INODE_BITMAP_END,
1353 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1355 /* Free inodes count for group wrong */
1356 { PR_5_FREE_INODE_COUNT_GROUP,
1357 N_("Free @is count wrong for @g #%g (%i, counted=%j).\n"),
1358 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1360 /* Directories count for group wrong */
1361 { PR_5_FREE_DIR_COUNT_GROUP,
1362 N_("Directories count wrong for @g #%g (%i, counted=%j).\n"),
1363 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1365 /* Free inodes count wrong */
1366 { PR_5_FREE_INODE_COUNT,
1367 N_("Free @is count wrong (%i, counted=%j).\n"),
1368 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1370 /* Free blocks count for group wrong */
1371 { PR_5_FREE_BLOCK_COUNT_GROUP,
1372 N_("Free @bs count wrong for @g #%g (%b, counted=%c).\n"),
1373 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1375 /* Free blocks count wrong */
1376 { PR_5_FREE_BLOCK_COUNT,
1377 N_("Free @bs count wrong (%b, counted=%c).\n"),
1378 PROMPT_FIX, PR_PREEN_OK | PR_PREEN_NOMSG },
1380 /* Programming error: bitmap endpoints don't match */
1381 { PR_5_BMAP_ENDPOINTS,
1382 N_("PROGRAMMING ERROR: @f (#%N) @B endpoints (%b, %c) don't "
1383 "match calculated @B endpoints (%i, %j)\n"),
1384 PROMPT_NONE, PR_FATAL },
1386 /* Internal error: fudging end of bitmap */
1387 { PR_5_FUDGE_BITMAP_ERROR,
1388 N_("Internal error: fudging end of bitmap (%N)\n"),
1389 PROMPT_NONE, PR_FATAL },
1391 /* Error copying in replacement inode bitmap */
1392 { PR_5_COPY_IBITMAP_ERROR,
1393 "Error copying in replacement @i @B: %m\n",
1394 PROMPT_NONE, PR_FATAL },
1396 /* Error copying in replacement block bitmap */
1397 { PR_5_COPY_BBITMAP_ERROR,
1398 "Error copying in replacement @b @B: %m\n",
1399 PROMPT_NONE, PR_FATAL },
1401 /* Block range not used, but marked in bitmap */
1402 { PR_5_BLOCK_RANGE_UNUSED,
1404 PROMPT_NONE, PR_LATCH_BBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1406 /* Block range used, but not marked used in bitmap */
1407 { PR_5_BLOCK_RANGE_USED,
1409 PROMPT_NONE, PR_LATCH_BBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1411 /* Inode range not used, but marked in bitmap */
1412 { PR_5_INODE_RANGE_UNUSED,
1414 PROMPT_NONE, PR_LATCH_IBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1416 /* Inode range used, but not marked used in bitmap */
1417 { PR_5_INODE_RANGE_USED,
1419 PROMPT_NONE, PR_LATCH_IBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
1425 * This is the latch flags register. It allows several problems to be
1426 * "latched" together. This means that the user has to answer but one
1427 * question for the set of problems, and all of the associated
1428 * problems will be either fixed or not fixed.
1430 static struct latch_descr pr_latch_info[] = {
1431 { PR_LATCH_BLOCK, PR_1_INODE_BLOCK_LATCH, 0 },
1432 { PR_LATCH_BBLOCK, PR_1_INODE_BBLOCK_LATCH, 0 },
1433 { PR_LATCH_IBITMAP, PR_5_INODE_BITMAP_HEADER, PR_5_INODE_BITMAP_END },
1434 { PR_LATCH_BBITMAP, PR_5_BLOCK_BITMAP_HEADER, PR_5_BLOCK_BITMAP_END },
1435 { PR_LATCH_RELOC, PR_0_RELOCATE_HINT, 0 },
1436 { PR_LATCH_DBLOCK, PR_1B_DUP_BLOCK_HEADER, PR_1B_DUP_BLOCK_END },
1437 { PR_LATCH_LOW_DTIME, PR_1_ORPHAN_LIST_REFUGEES, 0 },
1438 { PR_LATCH_TOOBIG, PR_1_INODE_TOOBIG, 0 },
1439 { PR_LATCH_OPTIMIZE_DIR, PR_3A_OPTIMIZE_DIR_HEADER, PR_3A_OPTIMIZE_DIR_END },
1443 static const struct e2fsck_problem *find_problem(problem_t code)
1447 for (i=0; problem_table[i].e2p_code; i++) {
1448 if (problem_table[i].e2p_code == code)
1449 return &problem_table[i];
1454 static struct latch_descr *find_latch(int code)
1458 for (i=0; pr_latch_info[i].latch_code >= 0; i++) {
1459 if (pr_latch_info[i].latch_code == code)
1460 return &pr_latch_info[i];
1465 int end_problem_latch(e2fsck_t ctx, int mask)
1467 struct latch_descr *ldesc;
1468 struct problem_context pctx;
1471 ldesc = find_latch(mask);
1472 if (ldesc->end_message && (ldesc->flags & PRL_LATCHED)) {
1473 clear_problem_context(&pctx);
1474 answer = fix_problem(ctx, ldesc->end_message, &pctx);
1476 ldesc->flags &= ~(PRL_VARIABLE);
1480 int set_latch_flags(int mask, int setflags, int clearflags)
1482 struct latch_descr *ldesc;
1484 ldesc = find_latch(mask);
1487 ldesc->flags |= setflags;
1488 ldesc->flags &= ~clearflags;
1492 int get_latch_flags(int mask, int *value)
1494 struct latch_descr *ldesc;
1496 ldesc = find_latch(mask);
1499 *value = ldesc->flags;
1503 void clear_problem_context(struct problem_context *ctx)
1505 memset(ctx, 0, sizeof(struct problem_context));
1510 int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx)
1512 ext2_filsys fs = ctx->fs;
1513 const struct e2fsck_problem *ptr;
1514 struct latch_descr *ldesc = 0;
1515 const char *message;
1516 int def_yn, answer, ans;
1517 int print_answer = 0;
1520 ptr = find_problem(code);
1522 printf(_("Unhandled error code (0x%x)!\n"), code);
1526 if ((ptr->flags & PR_NO_DEFAULT) ||
1527 ((ptr->flags & PR_PREEN_NO) && (ctx->options & E2F_OPT_PREEN)) ||
1528 (ctx->options & E2F_OPT_NO))
1532 * Do special latch processing. This is where we ask the
1533 * latch question, if it exists
1535 if (ptr->flags & PR_LATCH_MASK) {
1536 ldesc = find_latch(ptr->flags & PR_LATCH_MASK);
1537 if (ldesc->question && !(ldesc->flags & PRL_LATCHED)) {
1538 ans = fix_problem(ctx, ldesc->question, pctx);
1540 ldesc->flags |= PRL_YES;
1542 ldesc->flags |= PRL_NO;
1543 ldesc->flags |= PRL_LATCHED;
1545 if (ldesc->flags & PRL_SUPPRESS)
1548 if ((ptr->flags & PR_PREEN_NOMSG) &&
1549 (ctx->options & E2F_OPT_PREEN))
1551 if ((ptr->flags & PR_NO_NOMSG) &&
1552 (ctx->options & E2F_OPT_NO))
1555 message = ptr->e2p_description;
1556 if ((ctx->options & E2F_OPT_PREEN) &&
1557 !(ptr->flags & PR_PREEN_NOHDR)) {
1558 printf("%s: ", ctx->device_name ?
1559 ctx->device_name : ctx->filesystem_name);
1562 print_e2fsck_message(ctx, _(message), pctx, 1);
1564 if (!(ptr->flags & PR_PREEN_OK) && (ptr->prompt != PROMPT_NONE))
1567 if (ptr->flags & PR_FATAL)
1568 fatal_error(ctx, 0);
1570 if (ptr->prompt == PROMPT_NONE) {
1571 if (ptr->flags & PR_NOCOLLATE)
1576 if (ctx->options & E2F_OPT_PREEN) {
1578 if (!(ptr->flags & PR_PREEN_NOMSG))
1580 } else if ((ptr->flags & PR_LATCH_MASK) &&
1581 (ldesc->flags & (PRL_YES | PRL_NO))) {
1584 if (ldesc->flags & PRL_YES)
1589 answer = ask(ctx, _(prompt[(int) ptr->prompt]), def_yn);
1590 if (!answer && !(ptr->flags & PR_NO_OK))
1591 ext2fs_unmark_valid(fs);
1594 printf("%s.\n", answer ?
1595 _(preen_msg[(int) ptr->prompt]) : _("IGNORED"));
1599 if ((ptr->prompt == PROMPT_ABORT) && answer)
1600 fatal_error(ctx, 0);
1602 if (ptr->flags & PR_AFTER_CODE)
1603 answer = fix_problem(ctx, ptr->second_code, pctx);