Implement the designated b_tnext locking. This also covers b_tprev locking. 25-akpm/fs/jbd/transaction.c | 18 +++++++++++------- 25-akpm/include/linux/journal-head.h | 2 +- fs/jbd/commit.c | 0 3 files changed, 12 insertions(+), 8 deletions(-) diff -puN include/linux/journal-head.h~jbd-090-b_tnext-locking include/linux/journal-head.h --- 25/include/linux/journal-head.h~jbd-090-b_tnext-locking Thu Jun 5 15:14:21 2003 +++ 25-akpm/include/linux/journal-head.h Thu Jun 5 15:14:21 2003 @@ -63,7 +63,7 @@ struct journal_head { /* * Doubly-linked list of buffers on a transaction's data, metadata or - * forget queue. [jbd_lock_bh_state()] + * forget queue. [t_list_lock] [jbd_lock_bh_state()] */ struct journal_head *b_tnext, *b_tprev; diff -puN fs/jbd/commit.c~jbd-090-b_tnext-locking fs/jbd/commit.c diff -puN fs/jbd/transaction.c~jbd-090-b_tnext-locking fs/jbd/transaction.c --- 25/fs/jbd/transaction.c~jbd-090-b_tnext-locking Thu Jun 5 15:14:21 2003 +++ 25-akpm/fs/jbd/transaction.c Thu Jun 5 15:14:21 2003 @@ -1414,7 +1414,10 @@ out: /* * Append a buffer to a transaction list, given the transaction's list head * pointer. + * * journal_datalist_lock is held. + * + * jbd_lock_bh_state(jh2bh(jh)) is held. */ static inline void @@ -1438,6 +1441,8 @@ __blist_add_buffer(struct journal_head * * * Called with journal_datalist_lock held, and the journal may not * be locked. + * + * jbd_lock_bh_state(jh2bh(jh)) is held. */ static inline void @@ -1468,16 +1473,13 @@ __blist_del_buffer(struct journal_head * void __journal_unfile_buffer(struct journal_head *jh) { struct journal_head **list = 0; - transaction_t * transaction; + transaction_t *transaction; + struct buffer_head *bh = jh2bh(jh); assert_spin_locked(&journal_datalist_lock); transaction = jh->b_transaction; -#ifdef __SMP__ - J_ASSERT (current->lock_depth >= 0); -#endif J_ASSERT_JH(jh, jh->b_jlist < BJ_Types); - if (jh->b_jlist != BJ_None) J_ASSERT_JH(jh, transaction != 0); @@ -1511,15 +1513,17 @@ void __journal_unfile_buffer(struct jour __blist_del_buffer(list, jh); jh->b_jlist = BJ_None; - if (test_and_clear_bit(BH_JBDDirty, &jh2bh(jh)->b_state)) - mark_buffer_dirty(jh2bh(jh)); /* Expose it to the VM */ + if (test_clear_buffer_jbddirty(bh)) + mark_buffer_dirty(bh); /* Expose it to the VM */ } void journal_unfile_buffer(struct journal_head *jh) { + jbd_lock_bh_state(jh2bh(jh)); spin_lock(&journal_datalist_lock); __journal_unfile_buffer(jh); spin_unlock(&journal_datalist_lock); + jbd_unlock_bh_state(jh2bh(jh)); } /* _