diff --git a/e2fsck/e2fsck.conf.5.in b/e2fsck/e2fsck.conf.5.in index a5021bd1..64aafd70 100644 --- a/e2fsck/e2fsck.conf.5.in +++ b/e2fsck/e2fsck.conf.5.in @@ -109,6 +109,19 @@ This can be disabled by setting to the boolean value of false. This setting defaults to true. .TP +.I broken_system_clock +The +.BR e2fsck (8) +program has some hueristics that assume that the system clock is +correct. In addition, many system programs make similar assumptions. +For example, the UUID library depends on time not going backwards in +order for it to be able to make its guarantees about issuing universally +unique ID's. Systems with broken system clocks, are well, broken. +However, broken system clocks, particularly in embedded systems, do +exist. If true, e2fsck will not abort a preen check if it detects a +last mounted or last write time in the superblock in the future. This +setting defaults to false. +.TP .I clear_test_fs_flag This boolean relation controls whether or not .BR e2fsck (8) diff --git a/e2fsck/problem.c b/e2fsck/problem.c index a713f1b2..9043281d 100644 --- a/e2fsck/problem.c +++ b/e2fsck/problem.c @@ -1741,7 +1741,7 @@ int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx) struct e2fsck_problem *ptr; struct latch_descr *ldesc = 0; const char *message; - int def_yn, answer, ans; + int def_yn, answer, ans, broken_system_clock; int print_answer = 0; int suppress = 0; @@ -1753,6 +1753,15 @@ int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx) if (!(ptr->flags & PR_CONFIG)) { char key[9], *new_desc; + if ((code == PR_0_FUTURE_SB_LAST_MOUNT) || + (code == PR_0_FUTURE_SB_LAST_WRITE)) { + profile_get_boolean(ctx->profile, "options", + "broken_system_clock", 0, 0, + &broken_system_clock); + if (broken_system_clock) + ptr->flags |= PR_PREEN_OK; + } + sprintf(key, "0x%06x", code); profile_get_string(ctx->profile, "problems", key,