[PATCH] ext3/4: fix J_ASSERT(transaction->t_updates > 0) in journal_stop()
A disk generated some I/O error, after it, I hitted J_ASSERT(transaction->t_updates > 0) in journal_stop(). It seems to happened on ext3_truncate() path from stack trace. Then, maybe the following case may trigger J_ASSERT(transaction->t_updates > 0). ext3_truncate() -> ext3_free_branches() -> ext3_journal_test_restart() -> ext3_journal_restart() -> journal_restart() transaction->t_updates--; /* another process aborted journal */ -> start_this_handle() returns -EROFS without transaction->t_updates++; -> ext3_journal_stop() -> journal_stop() J_ASSERT(transaction->t_updates > 0) If journal was aborted in middle of journal_restart(), ext3_truncate() may trigger J_ASSERT(). Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> Cc: <linux-ext4@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
82591e6ea2
commit
3e2a532b26
|
@ -1314,13 +1314,14 @@ int journal_stop(handle_t *handle)
|
|||
int old_handle_count, err;
|
||||
pid_t pid;
|
||||
|
||||
J_ASSERT(transaction->t_updates > 0);
|
||||
J_ASSERT(journal_current_handle() == handle);
|
||||
|
||||
if (is_handle_aborted(handle))
|
||||
err = -EIO;
|
||||
else
|
||||
else {
|
||||
J_ASSERT(transaction->t_updates > 0);
|
||||
err = 0;
|
||||
}
|
||||
|
||||
if (--handle->h_ref > 0) {
|
||||
jbd_debug(4, "h_ref %d -> %d\n", handle->h_ref + 1,
|
||||
|
|
|
@ -1314,13 +1314,14 @@ int jbd2_journal_stop(handle_t *handle)
|
|||
int old_handle_count, err;
|
||||
pid_t pid;
|
||||
|
||||
J_ASSERT(transaction->t_updates > 0);
|
||||
J_ASSERT(journal_current_handle() == handle);
|
||||
|
||||
if (is_handle_aborted(handle))
|
||||
err = -EIO;
|
||||
else
|
||||
else {
|
||||
J_ASSERT(transaction->t_updates > 0);
|
||||
err = 0;
|
||||
}
|
||||
|
||||
if (--handle->h_ref > 0) {
|
||||
jbd_debug(4, "h_ref %d -> %d\n", handle->h_ref + 1,
|
||||
|
|
Loading…
Reference in New Issue