journal_unlock_journal_head() is misnamed: what it does is to drop a ref on the journal_head and free it if that ref fell to zero. It doesn't actually unlock anything. Rename it to journal_put_journal_head(). 25-akpm/fs/jbd/commit.c | 6 +++--- 25-akpm/fs/jbd/journal.c | 10 +++++++--- 25-akpm/fs/jbd/transaction.c | 8 ++++---- 25-akpm/include/linux/jbd.h | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff -puN fs/jbd/commit.c~jbd-045-rename-journal_unlock_journal_head fs/jbd/commit.c --- 25/fs/jbd/commit.c~jbd-045-rename-journal_unlock_journal_head Thu Jun 5 15:14:17 2003 +++ 25-akpm/fs/jbd/commit.c Thu Jun 5 15:14:17 2003 @@ -487,7 +487,7 @@ start_journal_io: */ bh = jh2bh(jh); BUFFER_TRACE(bh, "dumping temporary bh"); - journal_unlock_journal_head(jh); + journal_put_journal_head(jh); __brelse(bh); J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0); free_buffer_head(bh); @@ -536,7 +536,7 @@ start_journal_io: clear_bit(BH_JWrite, &bh->b_state); journal_unfile_buffer(jh); jh->b_transaction = NULL; - journal_unlock_journal_head(jh); + journal_put_journal_head(jh); __brelse(bh); /* One for getblk */ /* AKPM: bforget here */ } @@ -578,7 +578,7 @@ start_journal_io: if (unlikely(!buffer_uptodate(bh))) err = -EIO; put_bh(bh); /* One for getblk() */ - journal_unlock_journal_head(descriptor); + journal_put_journal_head(descriptor); } /* End of a transaction! Finally, we can do checkpoint diff -puN fs/jbd/journal.c~jbd-045-rename-journal_unlock_journal_head fs/jbd/journal.c --- 25/fs/jbd/journal.c~jbd-045-rename-journal_unlock_journal_head Thu Jun 5 15:14:17 2003 +++ 25-akpm/fs/jbd/journal.c Thu Jun 5 15:14:17 2003 @@ -1686,7 +1686,7 @@ static void journal_free_journal_head(st * _before_ attaching the journal_head to a transaction. To protect the * journal_head in this situation, journal_add_journal_head elevates the * journal_head's b_jcount refcount by one. The caller must call - * journal_unlock_journal_head() to undo this. + * journal_put_journal_head() to undo this. * * So the typical usage would be: * @@ -1694,7 +1694,7 @@ static void journal_free_journal_head(st * struct journal_head *jh = journal_add_journal_head(bh); * ... * jh->b_transaction = xxx; - * journal_unlock_journal_head(jh); + * journal_put_journal_head(jh); * * Now, the journal_head's b_jcount is zero, but it is safe from being released * because it has a non-zero b_transaction. @@ -1791,7 +1791,11 @@ void journal_remove_journal_head(struct jbd_unlock_bh_journal_head(bh); } -void journal_unlock_journal_head(struct journal_head *jh) +/* + * Drop a reference on the passed journal_head. If it fell to zero then try to + * release the journal_head from the buffer_head. + */ +void journal_put_journal_head(struct journal_head *jh) { struct buffer_head *bh = jh2bh(jh); diff -puN fs/jbd/transaction.c~jbd-045-rename-journal_unlock_journal_head fs/jbd/transaction.c --- 25/fs/jbd/transaction.c~jbd-045-rename-journal_unlock_journal_head Thu Jun 5 15:14:17 2003 +++ 25-akpm/fs/jbd/transaction.c Thu Jun 5 15:14:17 2003 @@ -725,7 +725,7 @@ int journal_get_write_access (handle_t * * completes any outstanding IO before proceeding. */ lock_journal(journal); rc = do_get_write_access(handle, jh, 0); - journal_unlock_journal_head(jh); + journal_put_journal_head(jh); unlock_journal(journal); return rc; } @@ -802,7 +802,7 @@ int journal_get_create_access (handle_t JBUFFER_TRACE(jh, "cancelling revoke"); lock_kernel(); journal_cancel_revoke(handle, jh); - journal_unlock_journal_head(jh); + journal_put_journal_head(jh); unlock_kernel(); out: unlock_journal(journal); @@ -877,7 +877,7 @@ int journal_get_undo_access (handle_t *h out: if (!err) J_ASSERT_JH(jh, jh->b_committed_data); - journal_unlock_journal_head(jh); + journal_put_journal_head(jh); unlock_journal(journal); return err; } @@ -1035,7 +1035,7 @@ no_journal: __brelse(bh); } JBUFFER_TRACE(jh, "exit"); - journal_unlock_journal_head(jh); + journal_put_journal_head(jh); return 0; } diff -puN include/linux/jbd.h~jbd-045-rename-journal_unlock_journal_head include/linux/jbd.h --- 25/include/linux/jbd.h~jbd-045-rename-journal_unlock_journal_head Thu Jun 5 15:14:17 2003 +++ 25-akpm/include/linux/jbd.h Thu Jun 5 15:14:17 2003 @@ -967,7 +967,7 @@ extern int journal_force_commit(journ extern struct journal_head *journal_add_journal_head(struct buffer_head *bh); extern void journal_remove_journal_head(struct buffer_head *bh); -extern void journal_unlock_journal_head(struct journal_head *jh); +extern void journal_put_journal_head(struct journal_head *jh); /* * handle management _