Signed-off-by: Andrew Morton --- 25-akpm/fs/jbd/transaction.c | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) diff -puN fs/jbd/transaction.c~jbd-jh-unmapping-race-fix fs/jbd/transaction.c --- 25/fs/jbd/transaction.c~jbd-jh-unmapping-race-fix 2004-07-30 22:08:13.165436560 -0700 +++ 25-akpm/fs/jbd/transaction.c 2004-07-30 22:11:26.359066664 -0700 @@ -1750,14 +1750,10 @@ static int journal_unmap_buffer(journal_ jbd_lock_bh_state(bh); spin_lock(&journal->j_list_lock); - /* - * Now we have the locks, check again to see whether kjournald has - * taken the buffer off the transaction. - */ - if (!buffer_jbd(bh)) - goto zap_buffer; + jh = journal_grab_journal_head(bh); + if (!jh) + goto zap_buffer_no_jh; - jh = bh2jh(bh); transaction = jh->b_transaction; if (transaction == NULL) { /* First case: not on any transaction. If it @@ -1788,6 +1784,7 @@ static int journal_unmap_buffer(journal_ spin_unlock(&journal->j_list_lock); jbd_unlock_bh_state(bh); spin_unlock(&journal->j_state_lock); + journal_put_journal_head(jh); return ret; } else { /* There is no currently-running transaction. So the @@ -1801,6 +1798,7 @@ static int journal_unmap_buffer(journal_ spin_unlock(&journal->j_list_lock); jbd_unlock_bh_state(bh); spin_unlock(&journal->j_state_lock); + journal_put_journal_head(jh); return ret; } else { /* The orphan record's transaction has @@ -1824,6 +1822,7 @@ static int journal_unmap_buffer(journal_ spin_unlock(&journal->j_list_lock); jbd_unlock_bh_state(bh); spin_unlock(&journal->j_state_lock); + journal_put_journal_head(jh); return 0; } else { /* Good, the buffer belongs to the running transaction. @@ -1837,6 +1836,8 @@ static int journal_unmap_buffer(journal_ } zap_buffer: + journal_put_journal_head(jh); +zap_buffer_no_jh: spin_unlock(&journal->j_list_lock); jbd_unlock_bh_state(bh); spin_unlock(&journal->j_state_lock); _