From: Bernd Schubert Date: Fri, 12 Nov 2010 23:09:07 +0000 (+0100) Subject: e2fsck: add an option which causes it to only do a journal replay X-Git-Tag: v1.41.13~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=71873b17307993c08b38b97c9551bed231e6048c;p=thirdparty%2Fe2fsprogs.git e2fsck: add an option which causes it to only do a journal replay As recently discussed on linux-ext4@vger.kernel.org add an option to e2fsck to allow to replay the journal only. That will allow scripts, such as pacemakers 'Filesystem' RA to first replay the journal and if that sets an error state from the journal replay, further check for that error (dumpe2fh -h | grep "Filesystem state:") and if that shows and error to refuse to mount. It also allows automatic e2fsck scripts to first replay the journal and on a second run after the real pass1 to passX checks to test for the return code. Signed-off-by: Bernd Schubert Signed-off-by: Theodore Ts'o --- diff --git a/e2fsck/e2fsck.8.in b/e2fsck/e2fsck.8.in index 3fb15e6d3..c554717f6 100644 --- a/e2fsck/e2fsck.8.in +++ b/e2fsck/e2fsck.8.in @@ -186,6 +186,10 @@ Set the version of the extended attribute blocks which will require while checking the filesystem. The version number may be 1 or 2. The default extended attribute version format is 2. .TP +.BI journal_only +Only replay the journal if required, but do not perform any further checks +or repairs. +.TP .BI fragcheck During pass 1, print a detailed report of any discontiguous blocks for files in the filesystem. diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h index 79266581a..4e7fc72b4 100644 --- a/e2fsck/e2fsck.h +++ b/e2fsck/e2fsck.h @@ -155,6 +155,7 @@ struct resource_track { #define E2F_OPT_WRITECHECK 0x0200 #define E2F_OPT_COMPRESS_DIRS 0x0400 #define E2F_OPT_FRAGCHECK 0x0800 +#define E2F_OPT_JOURNAL_ONLY 0x1000 /* only replay the journal */ /* * E2fsck flags diff --git a/e2fsck/unix.c b/e2fsck/unix.c index 414dd1166..624e11b5d 100644 --- a/e2fsck/unix.c +++ b/e2fsck/unix.c @@ -307,6 +307,9 @@ static void check_if_skip(e2fsck_t ctx) if ((ctx->options & E2F_OPT_FORCE) || bad_blocks_file || cflag) return; + if (ctx->options & E2F_OPT_JOURNAL_ONLY) + goto skip; + lastcheck = fs->super->s_lastcheck; if (lastcheck > ctx->now) lastcheck -= ctx->time_fudge; @@ -370,6 +373,7 @@ static void check_if_skip(e2fsck_t ctx) printf(_(" (check in %ld mounts)"), next_check); } fputc('\n', stdout); +skip: ext2fs_close(fs); ctx->fs = NULL; e2fsck_free_context(ctx); @@ -592,6 +596,12 @@ static void parse_extended_opts(e2fsck_t ctx, const char *opts) } else if (strcmp(token, "fragcheck") == 0) { ctx->options |= E2F_OPT_FRAGCHECK; continue; + } else if (strcmp(token, "journal_only") == 0) { + if (arg) { + extended_usage++; + continue; + } + ctx->options |= E2F_OPT_JOURNAL_ONLY; } else { fprintf(stderr, _("Unknown extended option: %s\n"), token); @@ -607,6 +617,7 @@ static void parse_extended_opts(e2fsck_t ctx, const char *opts) "Valid extended options are:\n"), stderr); fputs(("\tea_ver=\n"), stderr); fputs(("\tfragcheck\n"), stderr); + fputs(("\tjournal_only\n"), stderr); fputc('\n', stderr); exit(1); }