This should have been part of the original io error patch, but got dropped
somewhere along the way.
It's extremely important when handling the i/o error in the journal to not
commit the transaction with corrupt data. This patch adds that code back in.
Note that aborted transactions will still not get replayed since the journal
header is never updated. That part of the patch was included initially.
fs/reiserfs/journal.c | 17 +++++++++++++----
1 files changed, 13 insertions(+), 4 deletions(-)
Signed-off-by: Jeff Mahoney <[EMAIL PROTECTED]>
diff -ruNpX dontdiff linux-2.6.14.orig/fs/reiserfs/journal.c
linux-2.6.14.fixed/fs/reiserfs/journal.c
--- linux-2.6.14.orig/fs/reiserfs/journal.c 2005-10-27 20:02:08.000000000
-0400
+++ linux-2.6.14.fixed/fs/reiserfs/journal.c 2005-12-05 17:15:59.000000000
-0500
@@ -1039,6 +1039,10 @@ static int flush_commit_list(struct supe
}
atomic_dec(&journal->j_async_throttle);
+ /* We're skipping the commit if there's an error */
+ if (retval || reiserfs_is_journal_aborted(journal))
+ barrier = 0;
+
/* wait on everything written so far before writing the commit
* if we are in barrier mode, send the commit down now
*/
@@ -1077,10 +1081,16 @@ static int flush_commit_list(struct supe
BUG_ON(atomic_read(&(jl->j_commit_left)) != 1);
if (!barrier) {
- if (buffer_dirty(jl->j_commit_bh))
- BUG();
- mark_buffer_dirty(jl->j_commit_bh);
- sync_dirty_buffer(jl->j_commit_bh);
+ /* If there was a write error in the journal - we can't commit
+ * this transaction - it will be invalid and, if successful,
+ * will just end up propogating the write error out to
+ * the file system. */
+ if (likely(!retval && !reiserfs_is_journal_aborted (journal))) {
+ if (buffer_dirty(jl->j_commit_bh))
+ BUG();
+ mark_buffer_dirty(jl->j_commit_bh) ;
+ sync_dirty_buffer(jl->j_commit_bh) ;
+ }
} else
wait_on_buffer(jl->j_commit_bh);
--
Jeff Mahoney
SuSE Labs