problem.h revision 8394902e04e64ed10ca81e869892c00143ee4931
1/* 2 * problem.h --- e2fsck problem error codes 3 * 4 * Copyright 1996 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 12typedef __u32 problem_t; 13 14struct problem_context { 15 errcode_t errcode; 16 ino_t ino, ino2, dir; 17 struct ext2_inode *inode; 18 struct ext2_dir_entry *dirent; 19 blk_t blk, blk2; 20 e2_blkcnt_t blkcount; 21 int group; 22 __u64 num; 23 const char *str; 24}; 25 26/* 27 * We define a set of "latch groups"; these are problems which are 28 * handled as a set. The user answers once for a particular latch 29 * group. 30 */ 31#define PR_LATCH_MASK 0x0070 /* Latch mask */ 32#define PR_LATCH_BLOCK 0x0010 /* Latch for illegal blocks (pass 1) */ 33#define PR_LATCH_BBLOCK 0x0020 /* Latch for bad block inode blocks (pass 1) */ 34#define PR_LATCH_IBITMAP 0x0030 /* Latch for pass 5 inode bitmap proc. */ 35#define PR_LATCH_BBITMAP 0x0040 /* Latch for pass 5 inode bitmap proc. */ 36#define PR_LATCH_RELOC 0x0050 /* Latch for superblock relocate hint */ 37#define PR_LATCH_DBLOCK 0x0060 /* Latch for pass 1b dup block headers */ 38 39#define PR_LATCH(x) ((((x) & PR_LATCH_MASK) >> 4) - 1) 40 41/* 42 * Latch group descriptor flags 43 */ 44#define PRL_YES 0x0001 /* Answer yes */ 45#define PRL_NO 0x0002 /* Answer no */ 46#define PRL_LATCHED 0x0004 /* The latch group is latched */ 47#define PRL_SUPPRESS 0x0008 /* Suppress all latch group questions */ 48 49#define PRL_VARIABLE 0x000f /* All the flags that need to be reset */ 50 51/* 52 * Pre-Pass 1 errors 53 */ 54 55/* Block bitmap not in group */ 56#define PR_0_BB_NOT_GROUP 0x000001 57 58/* Inode bitmap not in group */ 59#define PR_0_IB_NOT_GROUP 0x000002 60 61/* Inode table not in group */ 62#define PR_0_ITABLE_NOT_GROUP 0x000003 63 64/* Superblock corrupt */ 65#define PR_0_SB_CORRUPT 0x000004 66 67/* Filesystem size is wrong */ 68#define PR_0_FS_SIZE_WRONG 0x000005 69 70/* Fragments not supported */ 71#define PR_0_NO_FRAGMENTS 0x000006 72 73/* Bad blocks_per_group */ 74#define PR_0_BLOCKS_PER_GROUP 0x000007 75 76/* Bad first_data_block */ 77#define PR_0_FIRST_DATA_BLOCK 0x000008 78 79/* Adding UUID to filesystem */ 80#define PR_0_ADD_UUID 0x000009 81 82/* Relocate hint */ 83#define PR_0_RELOCATE_HINT 0x00000A 84 85/* Miscellaneous superblock corruption */ 86#define PR_0_MISC_CORRUPT_SUPER 0x00000B 87 88/* Error determing physical device size of filesystem */ 89#define PR_0_GETSIZE_ERROR 0x00000C 90 91/* Inode count in the superblock incorrect */ 92#define PR_0_INODE_COUNT_WRONG 0x00000D 93 94/* The Hurd does not support the filetype feature */ 95#define PR_0_HURD_CLEAR_FILETYPE 0x00000E 96 97/* Journal inode is invalid */ 98#define PR_0_JOURNAL_BAD_INODE 0x00000F 99 100/* Superblock has a journal device (which we can't handle yet) */ 101#define PR_0_JOURNAL_UNSUPP_DEV 0x000010 102 103/* Superblock has a bad journal device */ 104#define PR_0_JOURNAL_BAD_DEV 0x000011 105 106/* Superblock has a journal UUID (which we can't handle yet) */ 107#define PR_0_JOURNAL_UNSUPP_UUID 0x000012 108 109/* Superblock has a bad journal UUID */ 110#define PR_0_JOURNAL_BAD_UUID 0x000013 111 112/* Journal has an unknown superblock type */ 113#define PR_0_JOURNAL_UNSUPP_SUPER 0x000014 114 115/* Journal superblock is corrupt */ 116#define PR_0_JOURNAL_BAD_SUPER 0x000015 117 118/* Journal superblock is corrupt */ 119#define PR_0_JOURNAL_HAS_JOURNAL 0x000016 120 121/* Superblock has recovery flag set but no journal */ 122#define PR_0_JOURNAL_RECOVER_SET 0x000017 123 124/* Warning message about leaving data in the journal */ 125#define PR_0_JOURNAL_RESET_JOURNAL 0x000018 126 127/* Superblock recovery flag clear - journal needs to be reset */ 128#define PR_0_JOURNAL_RESET_PROMPT 0x000019 129 130/* Clearing orphan inode */ 131#define PR_0_ORPHAN_CLEAR_INODE 0x000020 132 133/* Illegal block found in orphaned inode */ 134#define PR_0_ORPHAN_ILLEGAL_BLOCK_NUM 0x000021 135 136/* Already cleared block found in orphaned inode */ 137#define PR_0_ORPHAN_ALREADY_CLEARED_BLOCK 0x000022 138 139/* Illegal orphan inode in superblock */ 140#define PR_0_ORPHAN_ILLEGAL_HEAD_INODE 0x000023 141 142/* Illegal inode in orphaned inode list */ 143#define PR_0_ORPHAN_ILLEGAL_INODE 0x000024 144 145/* 146 * Pass 1 errors 147 */ 148 149/* Pass 1: Checking inodes, blocks, and sizes */ 150#define PR_1_PASS_HEADER 0x010000 151 152/* Root directory is not an inode */ 153#define PR_1_ROOT_NO_DIR 0x010001 154 155/* Root directory has dtime set */ 156#define PR_1_ROOT_DTIME 0x010002 157 158/* Reserved inode has bad mode */ 159#define PR_1_RESERVED_BAD_MODE 0x010003 160 161/* Deleted inode has zero dtime */ 162#define PR_1_ZERO_DTIME 0x010004 163 164/* Inode in use, but dtime set */ 165#define PR_1_SET_DTIME 0x010005 166 167/* Zero-length directory */ 168#define PR_1_ZERO_LENGTH_DIR 0x010006 169 170/* Block bitmap conflicts with some other fs block */ 171#define PR_1_BB_CONFLICT 0x010007 172 173/* Inode bitmap conflicts with some other fs block */ 174#define PR_1_IB_CONFLICT 0x010008 175 176/* Inode table conflicts with some other fs block */ 177#define PR_1_ITABLE_CONFLICT 0x010009 178 179/* Block bitmap is on a bad block */ 180#define PR_1_BB_BAD_BLOCK 0x01000A 181 182/* Inode bitmap is on a bad block */ 183#define PR_1_IB_BAD_BLOCK 0x01000B 184 185/* Inode has incorrect i_size */ 186#define PR_1_BAD_I_SIZE 0x01000C 187 188/* Inode has incorrect i_blocks */ 189#define PR_1_BAD_I_BLOCKS 0x01000D 190 191/* Illegal block number in inode */ 192#define PR_1_ILLEGAL_BLOCK_NUM 0x01000E 193 194/* Block number overlaps fs metadata */ 195#define PR_1_BLOCK_OVERLAPS_METADATA 0x01000F 196 197/* Inode has illegal blocks (latch question) */ 198#define PR_1_INODE_BLOCK_LATCH 0x010010 199 200/* Too many bad blocks in inode */ 201#define PR_1_TOO_MANY_BAD_BLOCKS 0x010011 202 203/* Illegal block number in bad block inode */ 204#define PR_1_BB_ILLEGAL_BLOCK_NUM 0x010012 205 206/* Bad block inode has illegal blocks (latch question) */ 207#define PR_1_INODE_BBLOCK_LATCH 0x010013 208 209/* Duplicate or bad blocks in use! */ 210#define PR_1_DUP_BLOCKS_PREENSTOP 0x010014 211 212/* Bad block used as bad block indirect block */ 213#define PR_1_BBINODE_BAD_METABLOCK 0x010015 214 215/* Inconsistency can't be fixed prompt */ 216#define PR_1_BBINODE_BAD_METABLOCK_PROMPT 0x010016 217 218/* Bad primary block */ 219#define PR_1_BAD_PRIMARY_BLOCK 0x0100017 220 221/* Bad primary block prompt */ 222#define PR_1_BAD_PRIMARY_BLOCK_PROMPT 0x0100018 223 224/* Bad primary superblock */ 225#define PR_1_BAD_PRIMARY_SUPERBLOCK 0x0100019 226 227/* Bad primary block group descriptors */ 228#define PR_1_BAD_PRIMARY_GROUP_DESCRIPTOR 0x010001A 229 230/* Bad superblock in group */ 231#define PR_1_BAD_SUPERBLOCK 0x010001B 232 233/* Bad block group descriptors in group */ 234#define PR_1_BAD_GROUP_DESCRIPTORS 0x010001C 235 236/* Block claimed for no reason */ 237#define PR_1_PROGERR_CLAIMED_BLOCK 0x010001D 238 239/* Error allocating blocks for relocating metadata */ 240#define PR_1_RELOC_BLOCK_ALLOCATE 0x010001E 241 242/* Error allocating block buffer during relocation process */ 243#define PR_1_RELOC_MEMORY_ALLOCATE 0x010001F 244 245/* Relocating metadata group information from X to Y */ 246#define PR_1_RELOC_FROM_TO 0x0100020 247 248/* Relocating metatdata group information to X */ 249#define PR_1_RELOC_TO 0x0100021 250 251/* Block read error during relocation process */ 252#define PR_1_RELOC_READ_ERR 0x0100022 253 254/* Block write error during relocation process */ 255#define PR_1_RELOC_WRITE_ERR 0x0100023 256 257/* Error allocating inode bitmap */ 258#define PR_1_ALLOCATE_IBITMAP_ERROR 0x0100024 259 260/* Error allocating block bitmap */ 261#define PR_1_ALLOCATE_BBITMAP_ERROR 0x0100025 262 263/* Error allocating icount structure */ 264#define PR_1_ALLOCATE_ICOUNT 0x0100026 265 266/* Error allocating dbcount */ 267#define PR_1_ALLOCATE_DBCOUNT 0x0100027 268 269/* Error while scanning inodes */ 270#define PR_1_ISCAN_ERROR 0x0100028 271 272/* Error while iterating over blocks */ 273#define PR_1_BLOCK_ITERATE 0x0100029 274 275/* Error while storing inode count information */ 276#define PR_1_ICOUNT_STORE 0x010002A 277 278/* Error while storing directory block information */ 279#define PR_1_ADD_DBLOCK 0x010002B 280 281/* Error while reading inode (for clearing) */ 282#define PR_1_READ_INODE 0x010002C 283 284/* Suppress messages prompt */ 285#define PR_1_SUPPRESS_MESSAGES 0x010002D 286 287/* Filesystem contains large files, but has no such flag in sb */ 288#define PR_1_FEATURE_LARGE_FILES 0x01002E 289 290/* Imagic flag set on an inode when filesystem doesn't support it */ 291#define PR_1_SET_IMAGIC 0x01002F 292 293/* Immutable flag set on a device or socket inode */ 294#define PR_1_SET_IMMUTABLE 0x010030 295 296/* Compression flag set on a non-compressed filesystem */ 297#define PR_1_COMPR_SET 0x010031 298 299/* Non-zero size on on device, fifo or socket inode */ 300#define PR_1_SET_NONZSIZE 0x010032 301 302/* 303 * Pass 1b errors 304 */ 305 306/* Pass 1B: Rescan for duplicate/bad blocks */ 307#define PR_1B_PASS_HEADER 0x011000 308 309/* Duplicate/bad block(s) header */ 310#define PR_1B_DUP_BLOCK_HEADER 0x011001 311 312/* Duplicate/bad block(s) in inode */ 313#define PR_1B_DUP_BLOCK 0x011002 314 315/* Duplicate/bad block(s) end */ 316#define PR_1B_DUP_BLOCK_END 0x011003 317 318/* Error while scanning inodes */ 319#define PR_1B_ISCAN_ERROR 0x011004 320 321/* Error allocating inode bitmap */ 322#define PR_1B_ALLOCATE_IBITMAP_ERROR 0x011005 323 324 325/* Pass 1C: Scan directories for inodes with dup blocks. */ 326#define PR_1C_PASS_HEADER 0x012000 327 328 329/* Pass 1D: Reconciling duplicate blocks */ 330#define PR_1D_PASS_HEADER 0x013000 331 332/* File has duplicate blocks */ 333#define PR_1D_DUP_FILE 0x013001 334 335/* List of files sharing duplicate blocks */ 336#define PR_1D_DUP_FILE_LIST 0x013002 337 338/* File sharing blocks with filesystem metadata */ 339#define PR_1D_SHARE_METADATA 0x013003 340 341/* Report of how many duplicate/bad inodes */ 342#define PR_1D_NUM_DUP_INODES 0x013004 343 344/* Duplicated blocks already reassigned or cloned. */ 345#define PR_1D_DUP_BLOCKS_DEALT 0x013005 346 347/* Clone duplicate/bad blocks? */ 348#define PR_1D_CLONE_QUESTION 0x013006 349 350/* Delete file? */ 351#define PR_1D_DELETE_QUESTION 0x013007 352 353/* Couldn't clone file (error) */ 354#define PR_1D_CLONE_ERROR 0x013008 355 356/* 357 * Pass 2 errors 358 */ 359 360/* Pass 2: Checking directory structure */ 361#define PR_2_PASS_HEADER 0x020000 362 363/* Bad inode number for '.' */ 364#define PR_2_BAD_INODE_DOT 0x020001 365 366/* Directory entry has bad inode number */ 367#define PR_2_BAD_INO 0x020002 368 369/* Directory entry has deleted or unused inode */ 370#define PR_2_UNUSED_INODE 0x020003 371 372/* Directry entry is link to '.' */ 373#define PR_2_LINK_DOT 0x020004 374 375/* Directory entry points to inode now located in a bad block */ 376#define PR_2_BB_INODE 0x020005 377 378/* Directory entry contains a link to a directory */ 379#define PR_2_LINK_DIR 0x020006 380 381/* Directory entry contains a link to the root directry */ 382#define PR_2_LINK_ROOT 0x020007 383 384/* Directory entry has illegal characters in its name */ 385#define PR_2_BAD_NAME 0x020008 386 387/* Missing '.' in directory inode */ 388#define PR_2_MISSING_DOT 0x020009 389 390/* Missing '..' in directory inode */ 391#define PR_2_MISSING_DOT_DOT 0x02000A 392 393/* First entry in directory inode doesn't contain '.' */ 394#define PR_2_1ST_NOT_DOT 0x02000B 395 396/* Second entry in directory inode doesn't contain '..' */ 397#define PR_2_2ND_NOT_DOT_DOT 0x02000C 398 399/* i_faddr should be zero */ 400#define PR_2_FADDR_ZERO 0x02000D 401 402/* i_file_acl should be zero */ 403#define PR_2_FILE_ACL_ZERO 0x02000E 404 405/* i_dir_acl should be zero */ 406#define PR_2_DIR_ACL_ZERO 0x02000F 407 408/* i_frag should be zero */ 409#define PR_2_FRAG_ZERO 0x020010 410 411/* i_fsize should be zero */ 412#define PR_2_FSIZE_ZERO 0x020011 413 414/* inode has bad mode */ 415#define PR_2_BAD_MODE 0x020012 416 417/* directory corrupted */ 418#define PR_2_DIR_CORRUPTED 0x020013 419 420/* filename too long */ 421#define PR_2_FILENAME_LONG 0x020014 422 423/* Directory inode has a missing block (hole) */ 424#define PR_2_DIRECTORY_HOLE 0x020015 425 426/* '.' is not NULL terminated */ 427#define PR_2_DOT_NULL_TERM 0x020016 428 429/* '..' is not NULL terminated */ 430#define PR_2_DOT_DOT_NULL_TERM 0x020017 431 432/* Illegal character device in inode */ 433#define PR_2_BAD_CHAR_DEV 0x020018 434 435/* Illegal block device in inode */ 436#define PR_2_BAD_BLOCK_DEV 0x020019 437 438/* Duplicate '.' entry */ 439#define PR_2_DUP_DOT 0x02001A 440 441/* Duplicate '..' entry */ 442#define PR_2_DUP_DOT_DOT 0x02001B 443 444/* Internal error: couldn't find dir_info */ 445#define PR_2_NO_DIRINFO 0x02001C 446 447/* Final rec_len is wrong */ 448#define PR_2_FINAL_RECLEN 0x02001D 449 450/* Error allocating icount structure */ 451#define PR_2_ALLOCATE_ICOUNT 0x02001E 452 453/* Error iterating over directory blocks */ 454#define PR_2_DBLIST_ITERATE 0x02001F 455 456/* Error reading directory block */ 457#define PR_2_READ_DIRBLOCK 0x020020 458 459/* Error writing directory block */ 460#define PR_2_WRITE_DIRBLOCK 0x020021 461 462/* Error allocating new directory block */ 463#define PR_2_ALLOC_DIRBOCK 0x020022 464 465/* Error deallocating inode */ 466#define PR_2_DEALLOC_INODE 0x020023 467 468/* Directory entry for '.' is big. Split? */ 469#define PR_2_SPLIT_DOT 0x020024 470 471/* Illegal FIFO */ 472#define PR_2_BAD_FIFO 0x020025 473 474/* Illegal socket */ 475#define PR_2_BAD_SOCKET 0x020026 476 477/* Directory filetype not set */ 478#define PR_2_SET_FILETYPE 0x020027 479 480/* Directory filetype incorrect */ 481#define PR_2_BAD_FILETYPE 0x020028 482 483/* Directory filetype set when it shouldn't be */ 484#define PR_2_CLEAR_FILETYPE 0x020029 485 486/* Directory filename can't be zero-length */ 487#define PR_2_NULL_NAME 0x020030 488 489/* 490 * Pass 3 errors 491 */ 492 493/* Pass 3: Checking directory connectivity */ 494#define PR_3_PASS_HEADER 0x030000 495 496/* Root inode not allocated */ 497#define PR_3_NO_ROOT_INODE 0x030001 498 499/* No room in lost+found */ 500#define PR_3_EXPAND_LF_DIR 0x030002 501 502/* Unconnected directory inode */ 503#define PR_3_UNCONNECTED_DIR 0x030003 504 505/* /lost+found not found */ 506#define PR_3_NO_LF_DIR 0x030004 507 508/* .. entry is incorrect */ 509#define PR_3_BAD_DOT_DOT 0x030005 510 511/* Bad or non-existent /lost+found. Cannot reconnect */ 512#define PR_3_NO_LPF 0x030006 513 514/* Could not expand /lost+found */ 515#define PR_3_CANT_EXPAND_LPF 0x030007 516 517/* Could not reconnect inode */ 518#define PR_3_CANT_RECONNECT 0x030008 519 520/* Error while trying to find /lost+found */ 521#define PR_3_ERR_FIND_LPF 0x030009 522 523/* Error in ext2fs_new_block while creating /lost+found */ 524#define PR_3_ERR_LPF_NEW_BLOCK 0x03000A 525 526/* Error in ext2fs_new_inode while creating /lost+found */ 527#define PR_3_ERR_LPF_NEW_INODE 0x03000B 528 529/* Error in ext2fs_new_dir_block while creating /lost+found */ 530#define PR_3_ERR_LPF_NEW_DIR_BLOCK 0x03000C 531 532/* Error while writing directory block for /lost+found */ 533#define PR_3_ERR_LPF_WRITE_BLOCK 0x03000D 534 535/* Error while adjusting inode count */ 536#define PR_3_ADJUST_INODE 0x03000E 537 538/* Couldn't fix parent directory -- error */ 539#define PR_3_FIX_PARENT_ERR 0x03000F 540 541/* Couldn't fix parent directory -- couldn't find it */ 542#define PR_3_FIX_PARENT_NOFIND 0x030010 543 544/* Error allocating inode bitmap */ 545#define PR_3_ALLOCATE_IBITMAP_ERROR 0x030011 546 547/* Error creating root directory */ 548#define PR_3_CREATE_ROOT_ERROR 0x030012 549 550/* Error creating lost and found directory */ 551#define PR_3_CREATE_LPF_ERROR 0x030013 552 553/* Root inode is not directory; aborting */ 554#define PR_3_ROOT_NOT_DIR_ABORT 0x030014 555 556/* Cannot proceed without a root inode. */ 557#define PR_3_NO_ROOT_INODE_ABORT 0x030015 558 559/* Internal error: couldn't find dir_info */ 560#define PR_3_NO_DIRINFO 0x030016 561 562/* Lost+found is not a directory */ 563#define PR_3_LPF_NOTDIR 0x030017 564 565/* 566 * Pass 4 errors 567 */ 568 569/* Pass 4: Checking reference counts */ 570#define PR_4_PASS_HEADER 0x040000 571 572/* Unattached zero-length inode */ 573#define PR_4_ZERO_LEN_INODE 0x040001 574 575/* Unattached inode */ 576#define PR_4_UNATTACHED_INODE 0x040002 577 578/* Inode ref count wrong */ 579#define PR_4_BAD_REF_COUNT 0x040003 580 581/* Inconsistent inode count information cached */ 582#define PR_4_INCONSISTENT_COUNT 0x040004 583 584/* 585 * Pass 5 errors 586 */ 587 588/* Pass 5: Checking group summary information */ 589#define PR_5_PASS_HEADER 0x050000 590 591/* Padding at end of inode bitmap is not set. */ 592#define PR_5_INODE_BMAP_PADDING 0x050001 593 594/* Padding at end of block bitmap is not set. */ 595#define PR_5_BLOCK_BMAP_PADDING 0x050002 596 597/* Block bitmap differences header */ 598#define PR_5_BLOCK_BITMAP_HEADER 0x050003 599 600/* Block not used, but marked in bitmap */ 601#define PR_5_UNUSED_BLOCK 0x050004 602 603/* Block used, but not marked used in bitmap */ 604#define PR_5_BLOCK_USED 0x050005 605 606/* Block bitmap differences end */ 607#define PR_5_BLOCK_BITMAP_END 0x050006 608 609/* Inode bitmap differences header */ 610#define PR_5_INODE_BITMAP_HEADER 0x050007 611 612/* Inode not used, but marked in bitmap */ 613#define PR_5_UNUSED_INODE 0x050008 614 615/* Inode used, but not marked used in bitmap */ 616#define PR_5_INODE_USED 0x050009 617 618/* Inode bitmap differences end */ 619#define PR_5_INODE_BITMAP_END 0x05000A 620 621/* Free inodes count for group wrong */ 622#define PR_5_FREE_INODE_COUNT_GROUP 0x05000B 623 624/* Directories count for group wrong */ 625#define PR_5_FREE_DIR_COUNT_GROUP 0x05000C 626 627/* Free inodes count wrong */ 628#define PR_5_FREE_INODE_COUNT 0x05000D 629 630/* Free blocks count for group wrong */ 631#define PR_5_FREE_BLOCK_COUNT_GROUP 0x05000E 632 633/* Free blocks count wrong */ 634#define PR_5_FREE_BLOCK_COUNT 0x05000F 635 636/* Programming error: bitmap endpoints don't match */ 637#define PR_5_BMAP_ENDPOINTS 0x050010 638 639/* Internal error: fudging end of bitmap */ 640#define PR_5_FUDGE_BITMAP_ERROR 0x050011 641 642/* Error copying in replacement inode bitmap */ 643#define PR_5_COPY_IBITMAP_ERROR 0x050012 644 645/* Error copying in replacement block bitmap */ 646#define PR_5_COPY_BBITMAP_ERROR 0x050013 647 648/* 649 * Function declarations 650 */ 651int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx); 652int end_problem_latch(e2fsck_t ctx, int mask); 653int set_latch_flags(int mask, int setflags, int clearflags); 654int get_latch_flags(int mask, int *value); 655void clear_problem_context(struct problem_context *ctx); 656 657/* message.c */ 658void print_e2fsck_message(e2fsck_t ctx, const char *msg, 659 struct problem_context *pctx, int first); 660 661