/* However, if the buffer is still owned by a prior
                 * (committing) transaction, we can't drop it yet... */
                JBUFFER_TRACE(jh, "belongs to older transaction");
-               /* ... but we CAN drop it from the new transaction if we
-                * have also modified it since the original commit. */
+               /* ... but we CAN drop it from the new transaction through
+                * marking the buffer as freed and set j_next_transaction to
+                * the new transaction, so that not only the commit code
+                * knows it should clear dirty bits when it is done with the
+                * buffer, but also the buffer can be checkpointed only
+                * after the new transaction commits. */
 
-               if (jh->b_next_transaction) {
-                       J_ASSERT(jh->b_next_transaction == transaction);
+               set_buffer_freed(bh);
+
+               if (!jh->b_next_transaction) {
                        spin_lock(&journal->j_list_lock);
-                       jh->b_next_transaction = NULL;
+                       jh->b_next_transaction = transaction;
                        spin_unlock(&journal->j_list_lock);
+               } else {
+                       J_ASSERT(jh->b_next_transaction == transaction);
 
                        /*
                         * only drop a reference if this transaction modified