Skip to content

Commit

Permalink
jbd: ordered data integrity fix
Browse files Browse the repository at this point in the history
In ordered mode, if a file data buffer being dirtied exists in the
committing transaction, we write the buffer to the disk, move it from the
committing transaction to the running transaction, then dirty it.  But we
don't have to remove the buffer from the committing transaction when the
buffer couldn't be written out, otherwise it would miss the error and the
committing transaction would not abort.

This patch adds an error check before removing the buffer from the
committing transaction.

Signed-off-by: Hidehiro Kawai <hidehiro.kawai.ez@hitachi.com>
Acked-by: Jan Kara <jack@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Hidehiro Kawai authored and Linus Torvalds committed Oct 20, 2008
1 parent 0e4fb5e commit 960a22a
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions fs/jbd/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -954,9 +954,10 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh)
journal_t *journal = handle->h_transaction->t_journal;
int need_brelse = 0;
struct journal_head *jh;
int ret = 0;

if (is_handle_aborted(handle))
return 0;
return ret;

jh = journal_add_journal_head(bh);
JBUFFER_TRACE(jh, "entry");
Expand Down Expand Up @@ -1067,7 +1068,16 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh)
time if it is redirtied */
}

/* journal_clean_data_list() may have got there first */
/*
* We cannot remove the buffer with io error from the
* committing transaction, because otherwise it would
* miss the error and the commit would not abort.
*/
if (unlikely(!buffer_uptodate(bh))) {
ret = -EIO;
goto no_journal;
}

if (jh->b_transaction != NULL) {
JBUFFER_TRACE(jh, "unfile from commit");
__journal_temp_unlink_buffer(jh);
Expand Down Expand Up @@ -1108,7 +1118,7 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh)
}
JBUFFER_TRACE(jh, "exit");
journal_put_journal_head(jh);
return 0;
return ret;
}

/**
Expand Down

0 comments on commit 960a22a

Please sign in to comment.