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

Reply via email to