Whamcloud - gitweb
Add support for the half-MD4 HTREE hash.
[tools/e2fsprogs.git] / e2fsck / problem.c
index 5a05387..7f019a7 100644 (file)
@@ -38,6 +38,8 @@
 #define PROMPT_DELETE  15
 #define PROMPT_SUPPRESS 16
 #define PROMPT_UNLINK  17
+#define PROMPT_CLEAR_HTREE 18
+#define PROMPT_NULL    19
 
 /*
  * These are the prompts which are used to ask the user if they want
@@ -62,6 +64,8 @@ static const char *prompt[] = {
        N_("Delete file"),      /* 15 */
        N_("Suppress messages"),/* 16 */
        N_("Unlink"),           /* 17 */
+       N_("Clear HTree index"),/* 18 */
+       "",                     /* 19 */
 };
 
 /*
@@ -87,6 +91,8 @@ static const char *preen_msg[] = {
        N_("FILE DELETED"),     /* 15 */
        N_("SUPPRESSED"),       /* 16 */
        N_("UNLINKED"),         /* 17 */
+       N_("HTREE INDEX CLEARED"),/* 18 */
+       "",                     /* 19 */
 };
 
 static const struct e2fsck_problem problem_table[] = {
@@ -110,16 +116,16 @@ static const struct e2fsck_problem problem_table[] = {
        /* Superblock corrupt */
        { PR_0_SB_CORRUPT,
          N_("\nThe @S could not be read or does not describe a correct ext2\n"
-         "@f.  If the device is valid and it really contains an ext2\n"
+         "@f.  If the @v is valid and it really contains an ext2\n"
          "@f (and not swap or ufs or something else), then the @S\n"
-  "is corrupt, and you might try running e2fsck with an alternate @S:\n"
-         "    e2fsck -b %S <device>\n\n"),
+         "is corrupt, and you might try running e2fsck with an alternate @S:\n"
+         "    e2fsck -b %S <@v>\n\n"),
          PROMPT_NONE, PR_FATAL },
 
        /* Filesystem size is wrong */
        { PR_0_FS_SIZE_WRONG,
          N_("The @f size (according to the @S) is %b @bs\n"
-         "The physical size of the device is %c @bs\n"
+         "The physical size of the @v is %c @bs\n"
          "Either the @S or the partition table is likely to be corrupt!\n"),
          PROMPT_ABORT, 0 },
 
@@ -162,7 +168,7 @@ static const struct e2fsck_problem problem_table[] = {
 
        /* Error determing physical device size of filesystem */
        { PR_0_GETSIZE_ERROR,     
-         N_("Error determining size of the physical device: %m\n"),
+         N_("Error determining size of the physical @v: %m\n"),
          PROMPT_NONE, PR_FATAL },
 
        /* Inode count in superblock is incorrect */
@@ -176,58 +182,132 @@ static const struct e2fsck_problem problem_table[] = {
 
        /* Journal inode is invalid */
        { PR_0_JOURNAL_BAD_INODE,
-         N_("@S has a bad ext3 journal (@i %N).\n"),
+         N_("@S has a bad ext3 @j (@i %i).\n"),
          PROMPT_CLEAR, PR_PREEN_OK },
 
-       /* Superblock has a journal device (which we can't handle yet) */
-       { PR_0_JOURNAL_UNSUPP_DEV,
-         N_("@S has external ext3 journal device (unsupported).\n"),
-         PROMPT_ABORT, PR_NO_OK | PR_AFTER_CODE, PR_0_JOURNAL_BAD_DEV },
+       /* The external journal has (unsupported) multiple filesystems */
+       { PR_0_JOURNAL_UNSUPP_MULTIFS,
+         N_("External @j has multiple @f users (unsupported).\n"),
+         PROMPT_NONE, PR_FATAL },
 
-       /* Superblock has a bad journal device */
-       { PR_0_JOURNAL_BAD_DEV,
-         N_("@S has a bad ext3 journal (device %X).\n"),
-         PROMPT_CLEAR, PR_PREEN_OK },
+       /* Can't find external journal */
+       { PR_0_CANT_FIND_JOURNAL,
+         N_("Can't find external @j\n"),
+         PROMPT_NONE, PR_FATAL },
 
-       /* Superblock has a journal UUID (which we can't handle yet) */
-       { PR_0_JOURNAL_UNSUPP_UUID,
-         N_("@S has an ext3 journal UUID (unsupported).\n"),
-         PROMPT_ABORT, PR_NO_OK | PR_AFTER_CODE, PR_0_JOURNAL_BAD_UUID },
+       /* External journal has bad superblock */
+       { PR_0_EXT_JOURNAL_BAD_SUPER,
+         N_("External @j has bad @S\n"),
+         PROMPT_NONE, PR_FATAL },
 
        /* Superblock has a bad journal UUID */
        { PR_0_JOURNAL_BAD_UUID,
-         N_("@S has a bad ext3 journal (UUID %s).\n"),
-         PROMPT_CLEAR, PR_PREEN_OK },
+         N_("External @j does not support this @f\n"),
+         PROMPT_NONE, PR_FATAL },
 
        /* Journal has an unknown superblock type */
        { PR_0_JOURNAL_UNSUPP_SUPER,
-         N_("Ext3 journal @S is unknown type %N (unsupported).\n"),
+         N_("Ext3 @j @S is unknown type %N (unsupported).\n"
+            "It is likely that your copy of e2fsck is old and/or doesn't "
+            "support this @j format.\n"
+            "It is also possible the @j @S is corrupt.\n"),
          PROMPT_ABORT, PR_NO_OK | PR_AFTER_CODE, PR_0_JOURNAL_BAD_SUPER },
 
        /* Journal superblock is corrupt */
        { PR_0_JOURNAL_BAD_SUPER,
-         N_("Ext3 journal @S is corrupt.\n"),
+         N_("Ext3 @j @S is corrupt.\n"),
          PROMPT_FIX, PR_PREEN_OK },
 
        /* Superblock flag should be cleared */
        { PR_0_JOURNAL_HAS_JOURNAL,
-         N_("@S doesn't have has_journal flag, but has ext3 journal %s.\n"),
-         PROMPT_DELETE, PR_PREEN_OK },
+         N_("@S doesn't have has_@j flag, but has ext3 @j %s.\n"),
+         PROMPT_CLEAR, PR_PREEN_OK },
 
        /* Superblock flag is incorrect */
        { PR_0_JOURNAL_RECOVER_SET,
-         N_("@S has ext3 needs_recovery flag set, but no journal.\n"),
+         N_("@S has ext3 needs_recovery flag set, but no @j.\n"),
          PROMPT_CLEAR, PR_PREEN_OK },
 
-       /* Journal should be reset */
+       /* Journal has data, but recovery flag is clear */
+       { PR_0_JOURNAL_RECOVERY_CLEAR,
+         N_("ext3 recovery flag clear, but @j has data.\n"),
+         PROMPT_NONE, 0 },
+
+       /* Ask if we should clear the journal */
        { PR_0_JOURNAL_RESET_JOURNAL,
-         N_("*** WARNING *** leaving data in the journal may be DANGEROUS.\n"),
-         PROMPT_NONE, PR_PREEN_NOMSG|PR_AFTER_CODE, PR_0_JOURNAL_RESET_PROMPT},
+         N_("Clear @j"),
+         PROMPT_NULL, PR_PREEN_NOMSG },
+
+       /* Ask if we should run the journal anyway */
+       { PR_0_JOURNAL_RUN,
+         N_("Run @j anyway"),
+         PROMPT_NULL, 0 },
+
+       /* Run the journal by default */
+       { PR_0_JOURNAL_RUN_DEFAULT,
+         N_("Recovery flag not set in backup @S, so running @j anyway.\n"),
+         PROMPT_NONE, 0 },
 
-       /* Journal should be reset */
-       { PR_0_JOURNAL_RESET_PROMPT,
-         N_("ext3 recovery flag clear, but journal has data.\n"),
-         PROMPT_CLEAR, PR_PREEN_OK|PR_PREEN_NOMSG },
+       /* Clearing orphan inode */
+       { PR_0_ORPHAN_CLEAR_INODE,
+         N_("%s @o @i %i (uid=%Iu, gid=%Ig, mode=%Im, size=%Is)\n"),
+         PROMPT_NONE, 0 },
+
+       /* Illegal block found in orphaned inode */
+       { PR_0_ORPHAN_ILLEGAL_BLOCK_NUM,
+          N_("@I @b #%B (%b) found in @o @i %i.\n"),
+         PROMPT_NONE, 0 },
+                 
+       /* Already cleared block found in orphaned inode */
+       { PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
+          N_("Already cleared @b #%B (%b) found in @o @i %i.\n"),
+         PROMPT_NONE, 0 },
+  
+       /* Illegal orphan inode in superblock */
+       { PR_0_ORPHAN_ILLEGAL_HEAD_INODE,
+         N_("@I @o @i %i in @S.\n"),
+         PROMPT_NONE, 0 },
+
+       /* Illegal inode in orphaned inode list */
+       { PR_0_ORPHAN_ILLEGAL_INODE,
+         N_("@I @i %i in @o @i list.\n"),
+         PROMPT_NONE, 0 },
+
+       /* Filesystem revision is 0, but feature flags are set */
+       { PR_0_FS_REV_LEVEL,
+         "@f has feature flag(s) set, but is a revision 0 @f.  ",
+         PROMPT_FIX, PR_PREEN_OK | PR_NO_OK },
+
+       /* Journal superblock has an unknown read-only feature flag set */
+       { PR_0_JOURNAL_UNSUPP_ROCOMPAT,
+         N_("Ext3 @j @S has an unknown read-only feature flag set.\n"),
+         PROMPT_ABORT, 0 },
+
+       /* Journal superblock has an unknown incompatible feature flag set */
+       { PR_0_JOURNAL_UNSUPP_INCOMPAT,
+         N_("Ext3 @j @S has an unknown incompatible feature flag set.\n"),
+         PROMPT_ABORT, 0 },
+
+       /* Journal has unsupported version number */
+       { PR_0_JOURNAL_UNSUPP_VERSION,
+         N_("@j version not supported by this e2fsck.\n"),
+         PROMPT_ABORT, 0 },
+
+       /* Moving journal to hidden file */
+       { PR_0_MOVE_JOURNAL,
+         N_("Moving @j from /%s to hidden inode.\n\n"),
+         PROMPT_NONE, 0 },
+
+       /* Error moving journal to hidden file */
+       { PR_0_ERR_MOVE_JOURNAL,
+         N_("Error moving @j: %m\n\n"),
+         PROMPT_NONE, 0 },
+
+       /* Clearing V2 journal superblock */
+       { PR_0_CLEAR_V2_JOURNAL,
+         N_("Found invalid V2 @j @S fields (from V1 journal).\n"
+            "Clearing fields beyond the V1 @j @S...\n\n"),
+         PROMPT_NONE, 0 },
 
        /* Pass 1 errors */
        
@@ -247,7 +327,7 @@ static const struct e2fsck_problem problem_table[] = {
 
        /* Reserved inode has bad mode */
        { PR_1_RESERVED_BAD_MODE,
-         N_("Reserved @i %i has bad mode.  "),
+         N_("Reserved @i %i %Q has bad mode.  "),
          PROMPT_CLEAR, PR_PREEN_OK },
 
        /* Deleted inode has zero dtime */
@@ -300,7 +380,7 @@ static const struct e2fsck_problem problem_table[] = {
          N_("@i %i, i_@bs is %Ib, @s %N.  "),
          PROMPT_FIX, PR_PREEN_OK },
 
-       /* Illegal block number in inode */
+       /* Illegal blocknumber in inode */
        { PR_1_ILLEGAL_BLOCK_NUM,
          N_("@I @b #%B (%b) in @i %i.  "),
          PROMPT_CLEAR, PR_LATCH_BLOCK },
@@ -445,18 +525,18 @@ static const struct e2fsck_problem problem_table[] = {
 
        /* Error while iterating over blocks */
        { PR_1_BLOCK_ITERATE,
-         N_("Error while iterating over blocks in @i %i: %m\n"),
+         N_("Error while iterating over @bs in @i %i: %m\n"),
          PROMPT_NONE, PR_FATAL },
 
        /* Error while storing inode count information */         
        { PR_1_ICOUNT_STORE,
-         N_("Error storing @i count information (inode=%i, count=%N): %m\n"),
+         N_("Error storing @i count information (@i=%i, count=%N): %m\n"),
          PROMPT_NONE, PR_FATAL },
 
        /* Error while storing directory block information */     
        { PR_1_ADD_DBLOCK,
          N_("Error storing @d @b information "
-         "(inode=%i, block=%b, num=%N): %m\n"),
+         "(@i=%i, @b=%b, num=%N): %m\n"),
          PROMPT_NONE, PR_FATAL },
 
        /* Error while reading inode (for clearing) */    
@@ -467,11 +547,6 @@ static const struct e2fsck_problem problem_table[] = {
        /* Suppress messages prompt */
        { PR_1_SUPPRESS_MESSAGES, "", PROMPT_SUPPRESS, PR_NO_OK },
                  
-       /* Filesystem contains large files, but has no such flag in sb */
-       { PR_1_FEATURE_LARGE_FILES,
-         N_("@f contains large files, but lacks LARGE_FILE flag in @S.\n"),
-         PROMPT_FIX, 0 },
-         
        /* Imagic flag set on an inode when filesystem doesn't support it */
        { PR_1_SET_IMAGIC,
          N_("@i %i has imagic flag set.  "),
@@ -479,8 +554,8 @@ static const struct e2fsck_problem problem_table[] = {
 
        /* Immutable flag set on a device or socket inode */
        { PR_1_SET_IMMUTABLE,
-         N_("Special (device/socket/fifo) @i %i has immutable or "
-            "append-only flag set.\n"),
+         N_("Special (@v/socket/fifo/symlink) file (@i %i) has immutable\n"
+            "or append-only flag set.  "),
          PROMPT_CLEAR, PR_PREEN_OK | PR_PREEN_NO | PR_NO_OK },
 
        /* Compression flag set on an inode when filesystem doesn't support it */
@@ -490,9 +565,139 @@ static const struct e2fsck_problem problem_table[] = {
 
        /* Non-zero size for device, fifo or socket inode */
        { PR_1_SET_NONZSIZE,
-         "Special (device/socket/fifo) @i %i has non-zero size.  ",
+         "Special (@v/socket/fifo) @i %i has non-zero size.  ",
          PROMPT_FIX, PR_PREEN_OK },
+
+       /* Filesystem revision is 0, but feature flags are set */
+       { PR_1_FS_REV_LEVEL,
+         "@f has feature flag(s) set, but is a revision 0 @f.  ",
+         PROMPT_FIX, PR_PREEN_OK | PR_NO_OK },
+
+       /* Journal inode is not in use, but contains data */      
+       { PR_1_JOURNAL_INODE_NOT_CLEAR,
+         "@j @i is not in use, but contains data.  ",
+         PROMPT_CLEAR, PR_PREEN_OK },    
          
+       /* Journal has bad mode */
+       { PR_1_JOURNAL_BAD_MODE,
+         N_("@j is not regular file.  "),
+         PROMPT_FIX, PR_PREEN_OK },
+
+       /* Deal with inodes that were part of orphan linked list */
+       { PR_1_LOW_DTIME,
+         N_("@i %i was part of the orphaned @i list.  "),
+         PROMPT_FIX, PR_LATCH_LOW_DTIME, 0 },    
+
+       /* Deal with inodes that were part of corrupted orphan linked
+          list (latch question) */
+       { PR_1_ORPHAN_LIST_REFUGEES,
+         N_("@is that were part of a corrupted orphan linked list found.  "),
+         PROMPT_FIX, 0 },                
+                 
+       /* Error allocating refcount structure */
+       { PR_1_ALLOCATE_REFCOUNT,
+         "@A refcount structure (%N): %m\n",
+         PROMPT_NONE, PR_FATAL },
+
+       /* Error reading extended attribute block */
+       { PR_1_READ_EA_BLOCK,
+         N_("Error reading @a @b %b for @i %i.  "),
+         PROMPT_CLEAR, 0 },
+
+       /* Invalid extended attribute block */
+       { PR_1_BAD_EA_BLOCK,
+         N_("@i %i has a bad @a @b %b.  "),
+         PROMPT_CLEAR, 0 },
+
+       /* Error reading Extended Attribute block while fixing refcount */
+       { PR_1_EXTATTR_READ_ABORT,
+         N_("Error reading @a @b %b (%m).  "),
+         PROMPT_ABORT, 0 },
+                 
+       /* Extended attribute reference count incorrect */
+       { PR_1_EXTATTR_REFCOUNT,
+         N_("@a @b %b has reference count %B, should be %N.  "),
+         PROMPT_FIX, 0 },
+                 
+       /* Error writing Extended Attribute block while fixing refcount */ 
+       { PR_1_EXTATTR_WRITE,
+         N_("Error writing @a @b %b (%m).  "),
+         PROMPT_ABORT, 0 },
+
+       /* Multiple EA blocks not supported */
+       { PR_1_EA_MULTI_BLOCK,
+         N_("@a @b %b has h_blocks > 1.  "),
+         PROMPT_CLEAR, 0},       
+
+       /* Error allocating EA region allocation structure */
+       { PR_1_EA_ALLOC_REGION,
+         N_("Error allocating @a @b %b.  "),
+         PROMPT_ABORT, 0},
+       
+       /* Error EA allocation collision */
+       { PR_1_EA_ALLOC_COLLISION,
+         N_("@a @b %b is corrupt (allocation collision).  "),
+         PROMPT_CLEAR, 0},
+       
+       /* Bad extended attribute name */
+       { PR_1_EA_BAD_NAME,
+         N_("@a @b %b is corrupt (invalid name).  "),
+         PROMPT_CLEAR, 0},       
+
+       /* Bad extended attribute value */
+       { PR_1_EA_BAD_VALUE,
+         N_("@a @b %b is corrupt (invalid value).  "),
+         PROMPT_CLEAR, 0},
+
+       /* Inode too big (latch question) */
+       { PR_1_INODE_TOOBIG,
+         N_("@i %i is too big.  "), PROMPT_TRUNCATE, 0 },
+
+       /* Directory too big */
+       { PR_1_TOOBIG_DIR, 
+         N_("@b #%B (%b) causes @d to be too big.  "),
+         PROMPT_CLEAR, PR_LATCH_TOOBIG },
+
+       /* Regular file too big */
+       { PR_1_TOOBIG_REG,
+         N_("@b #%B (%b) causes file to be too big.  "),
+         PROMPT_CLEAR, PR_LATCH_TOOBIG },
+
+       /* Symlink too big */
+       { PR_1_TOOBIG_SYMLINK,
+         N_("@b #%B (%b) causes symlink to be too big.  "),
+         PROMPT_CLEAR, PR_LATCH_TOOBIG },
+
+       /* INDEX_FL flag set on a non-HTREE filesystem */
+       { PR_1_HTREE_SET,
+         N_("@i %i has INDEX_FL flag set on @f without htree support.\n"),
+         PROMPT_CLEAR_HTREE, 0 },
+
+       /* INDEX_FL flag set on a non-directory */      
+       { PR_1_HTREE_NODIR,
+         N_("@i %i has INDEX_FL flag set but is not a @d.\n"),
+         PROMPT_CLEAR_HTREE, 0 },
+
+       /* Invalid root node in HTREE directory */      
+       { PR_1_HTREE_BADROOT,
+         N_("@h %i has an invalid root node.\n"),
+         PROMPT_CLEAR_HTREE, 0 },
+
+       /* Unsupported hash version in HTREE directory */       
+       { PR_1_HTREE_HASHV,
+         N_("@h %i has an unsupported hash version (%N)\n"),
+         PROMPT_CLEAR_HTREE, 0 },
+
+       /* Incompatible flag in HTREE root node */      
+       { PR_1_HTREE_INCOMPAT,
+         N_("@h %i uses an incompatible htree root node flag.\n"),
+         PROMPT_CLEAR_HTREE, 0 },
+
+       /* HTREE too deep */    
+       { PR_1_HTREE_DEPTH,
+         N_("@h %i has a tree depth (%N) which is too big\n"),
+         PROMPT_CLEAR_HTREE, 0 },
+                 
        /* Pass 1b errors */
 
        /* Pass 1B: Rescan for duplicate/bad blocks */
@@ -526,7 +731,11 @@ static const struct e2fsck_problem problem_table[] = {
          N_("@A @i @B (inode_dup_map): %m\n"),
          PROMPT_NONE, PR_FATAL },
 
-
+       /* Error while iterating over blocks */
+       { PR_1B_BLOCK_ITERATE,
+         N_("Error while iterating over @bs in @i %i (%s): %m\n"),
+         PROMPT_NONE, 0 },
+                 
        /* Pass 1C: Scan directories for inodes with dup blocks. */
        { PR_1C_PASS_HEADER,
          N_("Pass 1C: Scan directories for @is with dup @bs.\n"),
@@ -700,12 +909,12 @@ static const struct e2fsck_problem problem_table[] = {
 
        /* Illegal character device inode */
        { PR_2_BAD_CHAR_DEV,
-         N_("@i %i (%Q) is an @I character device.\n"),
+         N_("@i %i (%Q) is an @I character @v.\n"),
          PROMPT_CLEAR, 0 },
 
        /* Illegal block device inode */
        { PR_2_BAD_BLOCK_DEV,
-         N_("@i %i (%Q) is an @I @b device.\n"),
+         N_("@i %i (%Q) is an @I @b @v.\n"),
          PROMPT_CLEAR, 0 },
 
        /* Duplicate '.' entry */
@@ -725,7 +934,7 @@ static const struct e2fsck_problem problem_table[] = {
 
        /* Final rec_len is wrong */
        { PR_2_FINAL_RECLEN,
-         N_("@E has rec_len of %dr, should be %N.\n"),
+         N_("@E has rec_len of %Dr, should be %N.\n"),
          PROMPT_FIX, 0 },
                  
        /* Error allocating icount structure */
@@ -780,19 +989,68 @@ static const struct e2fsck_problem problem_table[] = {
 
        /* Directory filetype incorrect */
        { PR_2_BAD_FILETYPE,
-         N_("@E has an incorrect filetype (was %dt, should be %N)\n"),
+         N_("@E has an incorrect filetype (was %Dt, should be %N).\n"),
          PROMPT_FIX, 0 },
 
        /* Directory filetype set on filesystem */
        { PR_2_CLEAR_FILETYPE,
-         N_("@E has filetype set\n"),
+         N_("@E has filetype set.\n"),
          PROMPT_CLEAR, PR_PREEN_OK },
 
        /* Directory filename is null */
        { PR_2_NULL_NAME,
-         N_("@E has a zero-length name\n"),
+         N_("@E has a zero-length name.\n"),
          PROMPT_CLEAR, 0 },
 
+       /* Invalid symlink */
+       { PR_2_INVALID_SYMLINK,
+         N_("Symlink %Q (@i #%i) is invalid.\n"),
+         PROMPT_CLEAR, 0 },
+
+       /* i_file_acl (extended attribute block) is bad */
+       { PR_2_FILE_ACL_BAD,
+         N_("@a @b @F is invalid (%If).\n"),
+         PROMPT_CLEAR, 0 },
+
+       /* Filesystem contains large files, but has no such flag in sb */
+       { PR_2_FEATURE_LARGE_FILES,
+         N_("@f contains large files, but lacks LARGE_FILE flag in @S.\n"),
+         PROMPT_FIX, 0 },
+         
+       /* Node in HTREE directory not referenced */
+       { PR_2_HTREE_NOTREF,
+         N_("@p @h %d: node (%B) not referenced\n"),
+         PROMPT_NONE, 0 },
+
+       /* Node in HTREE directory referenced twice */
+       { PR_2_HTREE_DUPREF,
+         N_("@p @h %d: node (%B) referenced twice\n"),
+         PROMPT_NONE, 0 },
+
+       /* Node in HTREE directory has bad min hash */
+       { PR_2_HTREE_MIN_HASH,
+         N_("@p @h %d: node (%B) has bad min hash\n"),
+         PROMPT_NONE, 0 },
+
+       /* Node in HTREE directory has bad max hash */
+       { PR_2_HTREE_MAX_HASH,
+         N_("@p @h %d: node (%B) has bad max hash\n"),
+         PROMPT_NONE, 0 },
+
+       /* Clear invalid HTREE directory */
+       { PR_2_HTREE_CLEAR,
+         N_("Invalid @h %d (%q).  "), PROMPT_CLEAR, 0 },
+                 
+       /* Clear the htree flag forcibly */
+       { PR_2_HTREE_FCLR,
+         N_("Forcibly clearing HTREE flag on @i %d (%q).  (Beta test code)\n"),
+                 PROMPT_NONE, 0 },
+
+       /* Bad block in htree interior node */
+       { PR_2_HTREE_BADBLK,
+         N_("@p @h %d (%q): bad @b number %B.\n"),
+         PROMPT_CLEAR_HTREE, 0 },
+
        /* Pass 3 errors */
 
        /* Pass 3: Checking directory connectivity */
@@ -827,7 +1085,7 @@ static const struct e2fsck_problem problem_table[] = {
 
        /* Bad or non-existent /lost+found.  Cannot reconnect */
        { PR_3_NO_LPF,
-         N_("Bad or non-existent /@l.  Cannot reconnect\n"),
+         N_("Bad or non-existent /@l.  Cannot reconnect.\n"),
          PROMPT_NONE, 0 },
 
        /* Could not expand /lost+found */
@@ -967,7 +1225,7 @@ static const struct e2fsck_problem problem_table[] = {
          PROMPT_NONE, PR_PREEN_OK | PR_PREEN_NOMSG},
 
        /* Block not used, but marked in bitmap */
-       { PR_5_UNUSED_BLOCK,
+       { PR_5_BLOCK_UNUSED,
          " -%b",
          PROMPT_NONE, PR_LATCH_BBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
                  
@@ -987,7 +1245,7 @@ static const struct e2fsck_problem problem_table[] = {
          PROMPT_NONE, PR_PREEN_OK | PR_PREEN_NOMSG },
 
        /* Inode not used, but marked in bitmap */
-       { PR_5_UNUSED_INODE,
+       { PR_5_INODE_UNUSED,
          " -%i",
          PROMPT_NONE, PR_LATCH_IBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
                  
@@ -1047,6 +1305,26 @@ static const struct e2fsck_problem problem_table[] = {
          "Error copying in replacement @b @B: %m\n",
          PROMPT_NONE, PR_FATAL },
                  
+       /* Block range not used, but marked in bitmap */
+       { PR_5_BLOCK_RANGE_UNUSED,
+         " -(%b--%c)",
+         PROMPT_NONE, PR_LATCH_BBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
+                 
+       /* Block range used, but not marked used in bitmap */
+       { PR_5_BLOCK_RANGE_USED,
+         " +(%b--%c)",
+         PROMPT_NONE, PR_LATCH_BBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
+
+       /* Inode range not used, but marked in bitmap */
+       { PR_5_INODE_RANGE_UNUSED,
+         " -(%i--%j)",
+         PROMPT_NONE, PR_LATCH_IBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
+                 
+       /* Inode range used, but not marked used in bitmap */
+       { PR_5_INODE_RANGE_USED,
+         " +(%i--%j)",
+         PROMPT_NONE, PR_LATCH_IBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG },
+
        { 0 }
 };
 
@@ -1063,6 +1341,8 @@ static struct latch_descr pr_latch_info[] = {
        { PR_LATCH_BBITMAP, PR_5_BLOCK_BITMAP_HEADER, PR_5_BLOCK_BITMAP_END },
        { PR_LATCH_RELOC, PR_0_RELOCATE_HINT, 0 },
        { PR_LATCH_DBLOCK, PR_1B_DUP_BLOCK_HEADER, PR_1B_DUP_BLOCK_END },
+       { PR_LATCH_LOW_DTIME, PR_1_ORPHAN_LIST_REFUGEES, 0 },
+       { PR_LATCH_TOOBIG, PR_1_INODE_TOOBIG, 0 },
        { -1, 0, 0 },
 };
 
@@ -1145,7 +1425,7 @@ int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx)
 
        ptr = find_problem(code);
        if (!ptr) {
-               printf(_("Unhandled error code (%d)!\n"), code);
+               printf(_("Unhandled error code (0x%x)!\n"), code);
                return 0;
        }
        def_yn = 1;
@@ -1180,7 +1460,8 @@ int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx)
        if (!suppress) {
                message = ptr->e2p_description;
                if (ctx->options & E2F_OPT_PREEN) {
-                       printf("%s: ", ctx->device_name);
+                       printf("%s: ", ctx->device_name ?
+                              ctx->device_name : ctx->filesystem_name);
 #if 0
                        if (ptr->e2p_preen_msg)
                                message = ptr->e2p_preen_msg;