diff options
author | Vasily Averin <vvs@sw.ru> | 2006-09-27 04:49:33 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-27 11:26:09 -0400 |
commit | 7543fc7b3abfee8c6cd6349ebd5e5fde02fac984 (patch) | |
tree | c3525ab6440599fcde96bda0cd41db30308dc2b3 /fs/ext3 | |
parent | 36faadc144477b4929c8fe60b8053f4472eeb3d2 (diff) |
[PATCH] ext3: wrong error behavior
SWsoft Virtuozzo/OpenVZ Linux kernel team has discovered that ext3 error
behavior was broken in linux kernels since 2.5.x versions by the following
patch:
2002/10/31 02:15:26-05:00 tytso@snap.thunk.org
Default mount options from superblock for ext2/3 filesystems
http://linux.bkbits.net:8080/linux-2.6/gnupatch@3dc0d88eKbV9ivV4ptRNM8fBuA3JBQ
In case ext3 file system is mounted with errors=continue
(EXT3_ERRORS_CONTINUE) errors should be ignored when possible. However at
present in case of any error kernel aborts journal and remounts filesystem
to read-only. Such behavior was hit number of times and noted to differ
from that of 2.4.x kernels.
This patch fixes this:
- do nothing in case of EXT3_ERRORS_CONTINUE,
- set EXT3_MOUNT_ABORT and call journal_abort() in all other cases
- panic() should be called after ext3_commit_super() to save
sb marked as EXT3_ERROR_FS
Signed-off-by: Vasily Averin <vvs@sw.ru>
Acked-by: Kirill Korotaev <dev@sw.ru>
Cc: Theodore Ts'o <tytso@mit.edu>
Cc: "Stephen C. Tweedie" <sct@redhat.com>
Cc: Mingming Cao <cmm@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/ext3')
-rw-r--r-- | fs/ext3/super.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index bc7a768f9bb4..4b526b496102 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -159,20 +159,21 @@ static void ext3_handle_error(struct super_block *sb) | |||
159 | if (sb->s_flags & MS_RDONLY) | 159 | if (sb->s_flags & MS_RDONLY) |
160 | return; | 160 | return; |
161 | 161 | ||
162 | if (test_opt (sb, ERRORS_RO)) { | 162 | if (!test_opt (sb, ERRORS_CONT)) { |
163 | printk (KERN_CRIT "Remounting filesystem read-only\n"); | ||
164 | sb->s_flags |= MS_RDONLY; | ||
165 | } else { | ||
166 | journal_t *journal = EXT3_SB(sb)->s_journal; | 163 | journal_t *journal = EXT3_SB(sb)->s_journal; |
167 | 164 | ||
168 | EXT3_SB(sb)->s_mount_opt |= EXT3_MOUNT_ABORT; | 165 | EXT3_SB(sb)->s_mount_opt |= EXT3_MOUNT_ABORT; |
169 | if (journal) | 166 | if (journal) |
170 | journal_abort(journal, -EIO); | 167 | journal_abort(journal, -EIO); |
171 | } | 168 | } |
169 | if (test_opt (sb, ERRORS_RO)) { | ||
170 | printk (KERN_CRIT "Remounting filesystem read-only\n"); | ||
171 | sb->s_flags |= MS_RDONLY; | ||
172 | } | ||
173 | ext3_commit_super(sb, es, 1); | ||
172 | if (test_opt(sb, ERRORS_PANIC)) | 174 | if (test_opt(sb, ERRORS_PANIC)) |
173 | panic("EXT3-fs (device %s): panic forced after error\n", | 175 | panic("EXT3-fs (device %s): panic forced after error\n", |
174 | sb->s_id); | 176 | sb->s_id); |
175 | ext3_commit_super(sb, es, 1); | ||
176 | } | 177 | } |
177 | 178 | ||
178 | void ext3_error (struct super_block * sb, const char * function, | 179 | void ext3_error (struct super_block * sb, const char * function, |