host> diff -puN jbd/transaction.c /usr/src/linux-2.6.5-7.252/fs/jbd/transaction.c --- jbd/transaction.c 2006-08-14 12:25:43.424153474 -0500 +++ /usr/src/linux-2.6.5-7.252/fs/jbd/transaction.c 2006-07-30 10:29:27.000000000 -0500 @@ -125,13 +125,9 @@ repeat_locked: /* Wait on the journal's transaction barrier if necessary */ if (journal->j_barrier_count) { - DEFINE_WAIT(wait); - - prepare_to_wait(&journal->j_wait_transaction_locked, - &wait, TASK_UNINTERRUPTIBLE); spin_unlock(&journal->j_state_lock); - schedule(); - finish_wait(&journal->j_wait_transaction_locked, &wait); + wait_event(journal->j_wait_transaction_locked, + journal->j_barrier_count == 0); goto repeat; } @@ -480,8 +476,8 @@ void journal_unlock_updates (journal_t * up(&journal->j_barrier); spin_lock(&journal->j_state_lock); --journal->j_barrier_count; - wake_up(&journal->j_wait_transaction_locked); spin_unlock(&journal->j_state_lock); + wake_up(&journal->j_wait_transaction_locked); } /* @@ -1368,7 +1364,8 @@ int journal_stop(handle_t *handle) transaction->t_updates--; if (!transaction->t_updates) { wake_up(&journal->j_wait_updates); - wake_up(&journal->j_wait_transaction_locked); + if (journal->j_barrier_count) + wake_up(&journal->j_wait_transaction_locked); } /* Move callbacks from the handle to the transaction. */