Whamcloud - gitweb
debian: fix dpkg-buildflags so it works when the shell is dash
[tools/e2fsprogs.git] / e2fsck / problem.c
index a713f1b..579c838 100644 (file)
@@ -9,6 +9,7 @@
  * %End-Header%
  */
 
+#include "config.h"
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
@@ -361,11 +362,6 @@ static struct e2fsck_problem problem_table[] = {
          N_("@g descriptor %g marked uninitialized without feature set.\n"),
             PROMPT_FIX, PR_PREEN_OK },
 
-       /* group N block bitmap uninitialized but inode bitmap in use. */
-       { PR_0_BB_UNINIT_IB_INIT,
-         N_("@g %g @b @B uninitialized but @i @B in use.\n"),
-            PROMPT_FIX, PR_PREEN_OK },
-
        /* Group descriptor N has invalid unused inodes count. */
        { PR_0_GDT_ITABLE_UNUSED,
          N_("@g descriptor %g has invalid unused inodes count %b.  "),
@@ -402,6 +398,31 @@ static struct e2fsck_problem problem_table[] = {
          N_("One or more @b @g descriptor checksums are invalid.  "),
             PROMPT_FIX, PR_PREEN_OK },
 
+       /* Free inodes count wrong */
+       { PR_0_FREE_INODE_COUNT,
+         N_("Setting free @is count to %j (was %i)\n"),
+         PROMPT_NONE, PR_PREEN_NOMSG },
+
+       /* Free blocks count wrong */
+       { PR_0_FREE_BLOCK_COUNT,
+         N_("Setting free @bs count to %c (was %b)\n"),
+         PROMPT_NONE, PR_PREEN_NOMSG },
+
+       /* Making quota file hidden */
+       { PR_0_HIDE_QUOTA,
+         N_("Making @q @is hidden.\n\n"),
+         PROMPT_NONE, PR_PREEN_OK },
+
+       /* Superblock has invalid MMP block. */
+       { PR_0_MMP_INVALID_BLK,
+         N_("@S has invalid MMP block.  "),
+         PROMPT_CLEAR, PR_PREEN_OK },
+
+       /* Superblock has invalid MMP magic. */
+       { PR_0_MMP_INVALID_MAGIC,
+         N_("@S has invalid MMP magic.  "),
+         PROMPT_FIX, PR_PREEN_OK | PR_NO_OK},
+
        /* Pass 1 errors */
 
        /* Pass 1: Checking inodes, blocks, and sizes */
@@ -703,7 +724,7 @@ static struct e2fsck_problem problem_table[] = {
        /* Error reading Extended Attribute block while fixing refcount */
        { PR_1_EXTATTR_READ_ABORT,
          N_("Error reading @a @b %b (%m).  "),
-         PROMPT_ABORT, 0 },
+         PROMPT_NONE, PR_FATAL },
 
        /* Extended attribute reference count incorrect */
        { PR_1_EXTATTR_REFCOUNT,
@@ -711,9 +732,9 @@ static struct e2fsck_problem problem_table[] = {
          PROMPT_FIX, 0 },
 
        /* Error writing Extended Attribute block while fixing refcount */
-       { PR_1_EXTATTR_WRITE,
+       { PR_1_EXTATTR_WRITE_ABORT,
          N_("Error writing @a @b %b (%m).  "),
-         PROMPT_ABORT, 0 },
+         PROMPT_NONE, PR_FATAL },
 
        /* Multiple EA blocks not supported */
        { PR_1_EA_MULTI_BLOCK,
@@ -721,9 +742,9 @@ static struct e2fsck_problem problem_table[] = {
          PROMPT_CLEAR, 0},
 
        /* Error allocating EA region allocation structure */
-       { PR_1_EA_ALLOC_REGION,
+       { PR_1_EA_ALLOC_REGION_ABORT,
          N_("@A @a @b %b.  "),
-         PROMPT_ABORT, 0},
+         PROMPT_NONE, PR_FATAL},
 
        /* Error EA allocation collision */
        { PR_1_EA_ALLOC_COLLISION,
@@ -798,7 +819,7 @@ static struct e2fsck_problem problem_table[] = {
        /* Resize inode failed */
        { PR_1_RESIZE_INODE_CREATE,
          N_("Resize @i (re)creation failed: %m."),
-         PROMPT_ABORT, 0 },
+         PROMPT_CONTINUE, 0 },
 
        /* invalid inode->i_extra_isize */
        { PR_1_EXTRA_ISIZE,
@@ -885,6 +906,36 @@ static struct e2fsck_problem problem_table[] = {
          N_("@i %i has an invalid extent node (blk %b, lblk %c)\n"),
          PROMPT_CLEAR, 0 },
 
+       { PR_1_EOFBLOCKS_FL_SET,
+         N_("@i %i should not have EOFBLOCKS_FL set "
+            "(size %Is, lblk %r)\n"),
+         PROMPT_CLEAR, PR_PREEN_OK },
+
+       /* Failed to convert subcluster bitmap */
+       { PR_1_CONVERT_SUBCLUSTER,
+         N_("Error converting subcluster @b @B: %m\n"),
+         PROMPT_NONE, PR_FATAL },
+
+       /* Quota inode has bad mode */
+       { PR_1_QUOTA_BAD_MODE,
+         N_("@q @i is not regular file.  "),
+         PROMPT_CLEAR, PR_PREEN_OK },
+
+       /* Quota inode is not in use, but contains data */
+       { PR_1_QUOTA_INODE_NOT_CLEAR,
+         N_("@q @i is not in use, but contains data.  "),
+         PROMPT_CLEAR, PR_PREEN_OK },
+
+       /* Quota inode is user visible */
+       { PR_1_QUOTA_INODE_NOT_HIDDEN,
+         N_("@q @i is visible to the user.  "),
+         PROMPT_CLEAR, PR_PREEN_OK },
+
+       /* Invalid bad inode */
+       { PR_1_INVALID_BAD_INODE,
+         N_("The bad @b @i looks @n.  "),
+         PROMPT_CLEAR, 0 },
+
        /* Pass 1b errors */
 
        /* Pass 1B: Rescan for duplicate/bad blocks */
@@ -928,7 +979,6 @@ static struct e2fsck_problem problem_table[] = {
          N_("Error adjusting refcount for @a @b %b (@i %i): %m\n"),
          PROMPT_NONE, 0 },
 
-
        /* Pass 1C: Scan directories for inodes with multiply-claimed blocks. */
        { PR_1C_PASS_HEADER,
          N_("Pass 1C: Scanning directories for @is with @m @bs\n"),
@@ -1768,6 +1818,7 @@ int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx)
                reconfigure_bool(ctx, ptr, key, PR_NOCOLLATE, "no_collate");
                reconfigure_bool(ctx, ptr, key, PR_NO_NOMSG, "no_nomsg");
                reconfigure_bool(ctx, ptr, key, PR_PREEN_NOHDR, "preen_noheader");
+               reconfigure_bool(ctx, ptr, key, PR_FORCE_NO, "force_no");
 
                ptr->flags |= PR_CONFIG;
        }
@@ -1798,7 +1849,7 @@ int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx)
            (ctx->options & E2F_OPT_PREEN))
                suppress++;
        if ((ptr->flags & PR_NO_NOMSG) &&
-           (ctx->options & E2F_OPT_NO))
+           ((ctx->options & E2F_OPT_NO) || (ptr->flags & PR_FORCE_NO)))
                suppress++;
        if (!suppress) {
                message = ptr->e2p_description;
@@ -1822,7 +1873,11 @@ int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx)
                else
                        answer = def_yn;
        } else {
-               if (ctx->options & E2F_OPT_PREEN) {
+               if (ptr->flags & PR_FORCE_NO) {
+                       answer = 0;
+                       if (!suppress)
+                               print_answer = 1;
+               } else if (ctx->options & E2F_OPT_PREEN) {
                        answer = def_yn;
                        if (!(ptr->flags & PR_PREEN_NOMSG))
                                print_answer = 1;
@@ -1933,6 +1988,7 @@ int main(int argc, char *argv[])
        e2fsck_t ctx;
        int rc;
 
+       memset(&ctx, 0, sizeof(ctx)); /* just to quiet compiler */
        rc = verify_problem_table(ctx);
        if (rc == 0)
                printf("e2fsck problem table verified\n");