Whamcloud - gitweb
e2fsck: skip quota update when interrupted
[tools/e2fsprogs.git] / e2fsck / unix.c
index 8d1bdf3..9d9ba04 100644 (file)
@@ -458,7 +458,7 @@ static void check_if_skip(e2fsck_t ctx)
        }
        log_out(ctx, "\n");
 skip:
-       ext2fs_close_free(&fs);
+       ext2fs_close_free(&ctx->fs);
        e2fsck_free_context(ctx);
        exit(FSCK_OK);
 }
@@ -1177,7 +1177,7 @@ int main (int argc, char *argv[])
        e2fsck_t        ctx;
        blk64_t         orig_superblock;
        struct problem_context pctx;
-       int flags, run_result;
+       int flags, run_result, was_changed;
        int journal_size;
        int sysval, sys_page_size = 4096;
        int old_bitmaps;
@@ -1462,7 +1462,7 @@ failure:
                /*
                 * Restart in order to reopen fs but this time start mmp.
                 */
-               ext2fs_close_free(&fs);
+               ext2fs_close_free(&ctx->fs);
                flags &= ~EXT2_FLAG_SKIP_MMP;
                goto restart;
        }
@@ -1667,8 +1667,15 @@ print_unsupp_features:
        }
 no_journal:
 
-       if (ctx->qctx) {
+       if (run_result & E2F_FLAG_ABORT) {
+               fatal_error(ctx, _("aborted"));
+       } else if (run_result & E2F_FLAG_CANCEL) {
+               log_out(ctx, _("%s: e2fsck canceled.\n"), ctx->device_name ?
+                       ctx->device_name : ctx->filesystem_name);
+               exit_value |= FSCK_CANCELED;
+       } else if (ctx->qctx && !ctx->invalid_bitmaps) {
                int i, needs_writeout;
+
                for (i = 0; i < MAXQUOTAS; i++) {
                        if (qtype != -1 && qtype != i)
                                continue;
@@ -1692,25 +1699,45 @@ no_journal:
                                _("while resetting context"));
                        fatal_error(ctx, 0);
                }
-               ext2fs_close_free(&fs);
+               ext2fs_close_free(&ctx->fs);
                goto restart;
        }
-       if (run_result & E2F_FLAG_CANCEL) {
-               log_out(ctx, _("%s: e2fsck canceled.\n"), ctx->device_name ?
-                       ctx->device_name : ctx->filesystem_name);
-               exit_value |= FSCK_CANCELED;
-       }
-       if (run_result & E2F_FLAG_ABORT)
-               fatal_error(ctx, _("aborted"));
-       if (check_backup_super_block(ctx)) {
-               fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
-               ext2fs_mark_super_dirty(fs);
-       }
 
 #ifdef MTRACE
        mtrace_print("Cleanup");
 #endif
-       if (ext2fs_test_changed(fs)) {
+       was_changed = ext2fs_test_changed(fs);
+       if (!(ctx->flags & E2F_FLAG_RUN_RETURN) &&
+           !(ctx->options & E2F_OPT_READONLY)) {
+               if (ext2fs_test_valid(fs)) {
+                       if (!(sb->s_state & EXT2_VALID_FS))
+                               exit_value |= FSCK_NONDESTRUCT;
+                       sb->s_state = EXT2_VALID_FS;
+                       if (check_backup_super_block(ctx))
+                               fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
+               } else
+                       sb->s_state &= ~EXT2_VALID_FS;
+               if (!(ctx->flags & E2F_FLAG_TIME_INSANE))
+                       sb->s_lastcheck = ctx->now;
+               sb->s_mnt_count = 0;
+               memset(((char *) sb) + EXT4_S_ERR_START, 0, EXT4_S_ERR_LEN);
+               pctx.errcode = ext2fs_set_gdt_csum(ctx->fs);
+               if (pctx.errcode)
+                       fix_problem(ctx, PR_6_SET_BG_CHECKSUM, &pctx);
+               ext2fs_mark_super_dirty(fs);
+       }
+
+       e2fsck_write_bitmaps(ctx);
+       if (fs->flags & EXT2_FLAG_DIRTY) {
+               pctx.errcode = ext2fs_flush(ctx->fs);
+               if (pctx.errcode)
+                       fix_problem(ctx, PR_6_FLUSH_FILESYSTEM, &pctx);
+       }
+       pctx.errcode = io_channel_flush(ctx->fs->io);
+       if (pctx.errcode)
+               fix_problem(ctx, PR_6_IO_FLUSH, &pctx);
+
+       if (was_changed) {
                exit_value |= FSCK_NONDESTRUCT;
                if (!(ctx->options & E2F_OPT_PREEN))
                        log_out(ctx, _("\n%s: ***** FILE SYSTEM WAS "
@@ -1741,40 +1768,12 @@ no_journal:
                    (sb->s_state & EXT2_VALID_FS) &&
                    !(sb->s_state & EXT2_ERROR_FS))
                        exit_value = 0;
-       } else {
+       } else
                show_stats(ctx);
-               if (!(ctx->options & E2F_OPT_READONLY)) {
-                       if (ext2fs_test_valid(fs)) {
-                               if (!(sb->s_state & EXT2_VALID_FS))
-                                       exit_value |= FSCK_NONDESTRUCT;
-                               sb->s_state = EXT2_VALID_FS;
-                       } else
-                               sb->s_state &= ~EXT2_VALID_FS;
-                       sb->s_mnt_count = 0;
-                       if (!(ctx->flags & E2F_FLAG_TIME_INSANE))
-                               sb->s_lastcheck = ctx->now;
-                       memset(((char *) sb) + EXT4_S_ERR_START, 0,
-                              EXT4_S_ERR_LEN);
-                       ext2fs_mark_super_dirty(fs);
-               }
-       }
 
-       if ((run_result & E2F_FLAG_CANCEL) == 0 &&
-           sb->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_GDT_CSUM &&
-           !(ctx->options & E2F_OPT_READONLY)) {
-               retval = ext2fs_set_gdt_csum(ctx->fs);
-               if (retval) {
-                       com_err(ctx->program_name, retval, "%s",
-                               _("while setting block group checksum info"));
-                       fatal_error(ctx, 0);
-               }
-       }
-
-       e2fsck_write_bitmaps(ctx);
-       io_channel_flush(ctx->fs->io);
        print_resource_track(ctx, NULL, &ctx->global_rtrack, ctx->fs->io);
 
-       ext2fs_close_free(&fs);
+       ext2fs_close_free(&ctx->fs);
        free(ctx->journal_name);
 
        e2fsck_free_context(ctx);