Avoid holding the journal's j_list_lock while copying the buffer_head's data. We hold jbd_lock_bh_state() during the copy, which is all that is needed. fs/jbd/transaction.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -puN fs/jbd/transaction.c~jbd-590-do_get_write_access-speedup fs/jbd/transaction.c --- 25/fs/jbd/transaction.c~jbd-590-do_get_write_access-speedup 2003-06-02 22:26:40.000000000 -0700 +++ 25-akpm/fs/jbd/transaction.c 2003-06-02 22:29:26.000000000 -0700 @@ -699,6 +699,7 @@ repeat: } done_locked: + spin_unlock(&journal->j_list_lock); if (need_copy) { struct page *page; int offset; @@ -712,7 +713,6 @@ done_locked: memcpy(jh->b_frozen_data, source+offset, jh2bh(jh)->b_size); kunmap_atomic(source, KM_USER0); } - spin_unlock(&journal->j_list_lock); jbd_unlock_bh_state(bh); /* If we are about to journal a buffer, then any revoke pending _