summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Sandeen <sandeen@fedoraproject.org>2010-07-05 20:31:30 +0000
committerEric Sandeen <sandeen@fedoraproject.org>2010-07-05 20:31:30 +0000
commitbb0d23c1db1dcb8ac9fddd31efeec180acf532bc (patch)
tree11f46ff4a456d9ee38c1063326b1fb30a9fd973c
parent9c8d2cd522c221a8fad2939e2fc838d70b535ac9 (diff)
downloade2fsprogs-bb0d23c1db1dcb8ac9fddd31efeec180acf532bc.tar.gz
e2fsprogs-bb0d23c1db1dcb8ac9fddd31efeec180acf532bc.tar.xz
e2fsprogs-bb0d23c1db1dcb8ac9fddd31efeec180acf532bc.zip
* Mon Jul 05 2010 Eric Sandeen <sandeen@redhat.com> 1.41.9-8e2fsprogs-1_41_9-8_fc12
- e2fsck: Skip time-based checks if the time looks insane (#577126)
-rw-r--r--e2fsprogs-1.41.9-broken_system_clock.patch69
-rw-r--r--e2fsprogs-1.41.9-skip-time-checks-for-crazyclock.patch200
-rw-r--r--e2fsprogs.spec9
3 files changed, 277 insertions, 1 deletions
diff --git a/e2fsprogs-1.41.9-broken_system_clock.patch b/e2fsprogs-1.41.9-broken_system_clock.patch
new file mode 100644
index 0000000..d3ee5c4
--- /dev/null
+++ b/e2fsprogs-1.41.9-broken_system_clock.patch
@@ -0,0 +1,69 @@
+From: Theodore Ts'o <tytso@mit.edu>
+Date: Mon, 4 Jan 2010 18:59:04 +0000 (-0500)
+Subject: e2fsck: Add new e2fsck.conf option: broken_system_clock
+X-Git-Tag: v1.41.10~5
+X-Git-Url: http://git.kernel.org/?p=fs%2Fext2%2Fe2fsprogs.git;a=commitdiff_plain;h=c70674387ee0c038bca16098f7869181beeabe0a
+
+e2fsck: Add new e2fsck.conf option: broken_system_clock
+
+The broken_system_clock allows the time to be in the future when in
+preen mode. It's useful for people who have, as the name implies,
+broken system clocks.
+
+Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
+---
+
+diff --git a/e2fsck/e2fsck.conf.5.in b/e2fsck/e2fsck.conf.5.in
+index a5021bd..64aafd7 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 a713f1b..9043281 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,
+
diff --git a/e2fsprogs-1.41.9-skip-time-checks-for-crazyclock.patch b/e2fsprogs-1.41.9-skip-time-checks-for-crazyclock.patch
new file mode 100644
index 0000000..9f74a54
--- /dev/null
+++ b/e2fsprogs-1.41.9-skip-time-checks-for-crazyclock.patch
@@ -0,0 +1,200 @@
+From: Theodore Ts'o <tytso@mit.edu>
+Date: Thu, 13 May 2010 21:36:36 +0000 (-0400)
+Subject: e2fsck: Skip time-based checks if the time looks insane or broken_system_clock
+X-Git-Tag: v1.41.12~14
+X-Git-Url: http://git.kernel.org/?p=fs%2Fext2%2Fe2fsprogs.git;a=commitdiff_plain;h=177839e2454dcc298244481da9c72a19b41836be
+
+e2fsck: Skip time-based checks if the time looks insane or broken_system_clock
+
+There are broken embedded devices that have system clocks that always
+reset to January 1, 1970 whenever they boot (even if no power is
+lost). There are also systems that have super cheap clock crystals
+that can be very inaccurate. So if the option broken_system_clock is
+given, disable all time based checks. E2fsck will also try to detect
+incorrect system clock times, and automatically mark the system clock
+as insane.
+
+Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
+---
+
+diff --git a/e2fsck/e2fsck.c b/e2fsck/e2fsck.c
+index 26f7b5e..f1da97a 100644
+--- a/e2fsck/e2fsck.c
++++ b/e2fsck/e2fsck.c
+@@ -37,8 +37,11 @@ errcode_t e2fsck_allocate_context(e2fsck_t *ret)
+ time_env = getenv("E2FSCK_TIME");
+ if (time_env)
+ context->now = strtoul(time_env, NULL, 0);
+- else
++ else {
+ context->now = time(0);
++ if (context->now < 1262322000) /* January 1 2010 */
++ context->flags |= E2F_FLAG_TIME_INSANE;
++ }
+
+ *ret = context;
+ return 0;
+@@ -52,7 +55,7 @@ errcode_t e2fsck_reset_context(e2fsck_t ctx)
+ {
+ int i;
+
+- ctx->flags = 0;
++ ctx->flags &= E2F_RESET_FLAGS;
+ ctx->lost_and_found = 0;
+ ctx->bad_lost_and_found = 0;
+ if (ctx->inode_used_map) {
+diff --git a/e2fsck/e2fsck.conf.5.in b/e2fsck/e2fsck.conf.5.in
+index 64aafd7..7cb0633 100644
+--- a/e2fsck/e2fsck.conf.5.in
++++ b/e2fsck/e2fsck.conf.5.in
+@@ -118,9 +118,10 @@ 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.
++exist. E2fsck will attempt to use hueristics to determine if the time
++can no tbe trusted; and to skip time-based checks if this is true. If
++this boolean is set to true, then e2fsck will always assume that the
++system clock can not be trusted.
+ .TP
+ .I clear_test_fs_flag
+ This boolean relation controls whether or not
+diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h
+index e763b89..7926658 100644
+--- a/e2fsck/e2fsck.h
++++ b/e2fsck/e2fsck.h
+@@ -176,6 +176,9 @@ struct resource_track {
+ #define E2F_FLAG_RESIZE_INODE 0x0400 /* Request to recreate resize inode */
+ #define E2F_FLAG_GOT_DEVSIZE 0x0800 /* Device size has been fetched */
+ #define E2F_FLAG_EXITING 0x1000 /* E2fsck exiting due to errors */
++#define E2F_FLAG_TIME_INSANE 0x2000 /* Time is insane */
++
++#define E2F_RESET_FLAGS (E2F_FLAG_TIME_INSANE)
+
+ /*
+ * Defines for indicating the e2fsck pass number
+diff --git a/e2fsck/problem.c b/e2fsck/problem.c
+index 5825f5b..8032fda 100644
+--- a/e2fsck/problem.c
++++ b/e2fsck/problem.c
+@@ -1746,7 +1746,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, broken_system_clock;
++ int def_yn, answer, ans;
+ int print_answer = 0;
+ int suppress = 0;
+
+@@ -1758,15 +1758,6 @@ 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,
+diff --git a/e2fsck/super.c b/e2fsck/super.c
+index 951f6db..accc2f1 100644
+--- a/e2fsck/super.c
++++ b/e2fsck/super.c
+@@ -464,6 +464,7 @@ void check_super_block(e2fsck_t ctx)
+ int ipg_max;
+ int inode_size;
+ int accept_time_fudge;
++ int broken_system_clock;
+ dgrp_t i;
+ blk_t should_be;
+ struct problem_context pctx;
+@@ -821,11 +822,16 @@ void check_super_block(e2fsck_t ctx)
+ 0, accept_time_fudge, &accept_time_fudge);
+ ctx->time_fudge = accept_time_fudge ? 86400 : 0;
+
++ profile_get_boolean(ctx->profile, "options", "broken_system_clock",
++ 0, 0, &broken_system_clock);
++
+ /*
+ * Check to see if the superblock last mount time or last
+ * write time is in the future.
+ */
+- if (fs->super->s_mtime > (__u32) ctx->now) {
++ if (!broken_system_clock &&
++ !(ctx->flags & E2F_FLAG_TIME_INSANE) &&
++ fs->super->s_mtime > (__u32) ctx->now) {
+ pctx.num = fs->super->s_mtime;
+ problem = PR_0_FUTURE_SB_LAST_MOUNT;
+ if (fs->super->s_mtime <= (__u32) ctx->now + ctx->time_fudge)
+@@ -835,7 +841,9 @@ void check_super_block(e2fsck_t ctx)
+ ext2fs_mark_super_dirty(fs);
+ }
+ }
+- if (fs->super->s_wtime > (__u32) ctx->now) {
++ if (!broken_system_clock &&
++ !(ctx->flags & E2F_FLAG_TIME_INSANE) &&
++ fs->super->s_wtime > (__u32) ctx->now) {
+ pctx.num = fs->super->s_wtime;
+ problem = PR_0_FUTURE_SB_LAST_WRITE;
+ if (fs->super->s_wtime <= (__u32) ctx->now + ctx->time_fudge)
+diff --git a/e2fsck/unix.c b/e2fsck/unix.c
+index fd62ce5..383c651 100644
+--- a/e2fsck/unix.c
++++ b/e2fsck/unix.c
+@@ -291,8 +291,13 @@ static void check_if_skip(e2fsck_t ctx)
+ long next_check;
+ int batt = is_on_batt();
+ int defer_check_on_battery;
++ int broken_system_clock;
+ time_t lastcheck;
+
++ profile_get_boolean(ctx->profile, "options", "broken_system_clock",
++ 0, 0, &broken_system_clock);
++ if (ctx->flags & E2F_FLAG_TIME_INSANE)
++ broken_system_clock = 1;
+ profile_get_boolean(ctx->profile, "options",
+ "defer_check_on_battery", 0, 1,
+ &defer_check_on_battery);
+@@ -320,11 +325,12 @@ static void check_if_skip(e2fsck_t ctx)
+ if (batt && (fs->super->s_mnt_count <
+ (unsigned) fs->super->s_max_mnt_count*2))
+ reason = 0;
+- } else if (fs->super->s_checkinterval && (ctx->now < lastcheck)) {
++ } else if (!broken_system_clock && fs->super->s_checkinterval &&
++ (ctx->now < lastcheck)) {
+ reason = _(" has filesystem last checked time in the future");
+ if (batt)
+ reason = 0;
+- } else if (fs->super->s_checkinterval &&
++ } else if (!broken_system_clock && fs->super->s_checkinterval &&
+ ((ctx->now - lastcheck) >=
+ ((time_t) fs->super->s_checkinterval))) {
+ reason = _(" has gone %u days without being checked");
+@@ -350,7 +356,7 @@ static void check_if_skip(e2fsck_t ctx)
+ if (next_check <= 0)
+ next_check = 1;
+ }
+- if (fs->super->s_checkinterval &&
++ if (!broken_system_clock && fs->super->s_checkinterval &&
+ ((ctx->now - fs->super->s_lastcheck) >= fs->super->s_checkinterval))
+ next_check = 1;
+ if (next_check <= 5) {
+@@ -1433,7 +1439,8 @@ no_journal:
+ } else
+ sb->s_state &= ~EXT2_VALID_FS;
+ sb->s_mnt_count = 0;
+- sb->s_lastcheck = ctx->now;
++ if (!(ctx->flags & E2F_FLAG_TIME_INSANE))
++ sb->s_lastcheck = ctx->now;
+ ext2fs_mark_super_dirty(fs);
+ }
+ }
+
diff --git a/e2fsprogs.spec b/e2fsprogs.spec
index 3af303f..7d6125a 100644
--- a/e2fsprogs.spec
+++ b/e2fsprogs.spec
@@ -4,7 +4,7 @@
Summary: Utilities for managing ext2, ext3, and ext4 filesystems
Name: e2fsprogs
Version: 1.41.9
-Release: 7%{?dist}
+Release: 8%{?dist}
# License tags based on COPYING file distinctions for various components
License: GPLv2
@@ -18,6 +18,8 @@ Patch5: e2fsprogs-1.41.9-24hr-fsck-grace.patch
Patch6: e2fsprogs-1.41.9-s_jnl_blocks-swap.patch
Patch7: e2fsprogs-1.41.9-resize-array.patch
Patch8: e2fsprogs-1.41.9-dlopen-fix.patch
+Patch9: e2fsprogs-1.41.9-broken_system_clock.patch
+Patch10: e2fsprogs-1.41.9-skip-time-checks-for-crazyclock.patch
Url: http://e2fsprogs.sourceforge.net/
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -148,6 +150,8 @@ It was originally inspired by the Multics SubSystem library.
%patch6 -p1 -b .swap
%patch7 -p1 -b .resize2
%patch8 -p1 -b .dlopen
+%patch9 -p1 -b .brokenclock
+%patch10 -p1 -b .crazyclock
%build
%configure --enable-elf-shlibs --enable-nls --disable-uuidd --disable-fsck \
@@ -305,6 +309,9 @@ exit 0
%{_libdir}/pkgconfig/ss.pc
%changelog
+* Mon Jul 05 2010 Eric Sandeen <sandeen@redhat.com> 1.41.9-8
+- e2fsck: Skip time-based checks if the time looks insane (#577126)
+
* Sun Feb 07 2010 Eric Sandeen <sandeen@redhat.com> 1.41.9-7
- Upstream version of resize2fs array fix, original was wrong