From: "Aneesh Kumar K.V" Subject: [PATCH 5/6] ext4: Call journal commit callback without holding j_list_lock Date: Fri, 31 Oct 2008 22:20:58 +0530 Message-ID: <1225471859-19718-5-git-send-email-aneesh.kumar@linux.vnet.ibm.com> References: <1225471859-19718-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> <1225471859-19718-2-git-send-email-aneesh.kumar@linux.vnet.ibm.com> <1225471859-19718-3-git-send-email-aneesh.kumar@linux.vnet.ibm.com> <1225471859-19718-4-git-send-email-aneesh.kumar@linux.vnet.ibm.com> Cc: linux-ext4@vger.kernel.org, "Aneesh Kumar K.V" To: cmm@us.ibm.com, tytso@mit.edu, sandeen@redhat.com, frederic.bohe@bull.net Return-path: Received: from E23SMTP02.au.ibm.com ([202.81.18.163]:34044 "EHLO e23smtp02.au.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752694AbYJaQvV (ORCPT ); Fri, 31 Oct 2008 12:51:21 -0400 Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [202.81.18.234]) by e23smtp02.au.ibm.com (8.13.1/8.13.1) with ESMTP id m9VGoaiX014603 for ; Sat, 1 Nov 2008 03:50:36 +1100 Received: from d23av01.au.ibm.com (d23av01.au.ibm.com [9.190.234.96]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id m9VGpJ0l2965548 for ; Sat, 1 Nov 2008 03:51:19 +1100 Received: from d23av01.au.ibm.com (loopback [127.0.0.1]) by d23av01.au.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m9VGpIpa002658 for ; Sat, 1 Nov 2008 03:51:19 +1100 In-Reply-To: <1225471859-19718-4-git-send-email-aneesh.kumar@linux.vnet.ibm.com> Sender: linux-ext4-owner@vger.kernel.org List-ID: Signed-off-by: Aneesh Kumar K.V --- fs/jbd2/checkpoint.c | 6 ++++-- fs/jbd2/commit.c | 16 ++++++++++------ include/linux/jbd2.h | 9 +++++++-- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/fs/jbd2/checkpoint.c b/fs/jbd2/checkpoint.c index 9203c33..cbe7227 100644 --- a/fs/jbd2/checkpoint.c +++ b/fs/jbd2/checkpoint.c @@ -716,7 +716,8 @@ void __jbd2_journal_insert_checkpoint(struct journal_head *jh, * Called with j_list_lock held. */ -void __jbd2_journal_drop_transaction(journal_t *journal, transaction_t *transaction) +void ___jbd2_journal_drop_transaction(journal_t *journal, + transaction_t *transaction, int free) { assert_spin_locked(&journal->j_list_lock); if (transaction->t_cpnext) { @@ -742,5 +743,6 @@ void __jbd2_journal_drop_transaction(journal_t *journal, transaction_t *transact J_ASSERT(journal->j_running_transaction != transaction); jbd_debug(1, "Dropping transaction %d, all done\n", transaction->t_tid); - kfree(transaction); + if (free) + kfree(transaction); } diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index ebc667b..35f016c 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c @@ -338,7 +338,7 @@ void jbd2_journal_commit_transaction(journal_t *journal) int space_left = 0; int first_tag = 0; int tag_flag; - int i; + int i, to_free = 0; int tag_bytes = journal_tag_bytes(journal); struct buffer_head *cbh = NULL; /* For transactional checksums */ __u32 crc32_sum = ~0; @@ -974,12 +974,11 @@ void jbd2_journal_commit_transaction(journal_t *journal) journal->j_committing_transaction = NULL; spin_unlock(&journal->j_state_lock); - if (journal->j_commit_callback) - journal->j_commit_callback(journal, commit_transaction); - if (commit_transaction->t_checkpoint_list == NULL && commit_transaction->t_checkpoint_io_list == NULL) { - __jbd2_journal_drop_transaction(journal, commit_transaction); + ___jbd2_journal_drop_transaction(journal, + commit_transaction, 0); + to_free = 1; } else { if (journal->j_checkpoint_transactions == NULL) { journal->j_checkpoint_transactions = commit_transaction; @@ -998,11 +997,16 @@ void jbd2_journal_commit_transaction(journal_t *journal) } spin_unlock(&journal->j_list_lock); + if (journal->j_commit_callback) + journal->j_commit_callback(journal, commit_transaction); + trace_mark(jbd2_end_commit, "dev %s transaction %d head %d", - journal->j_devname, journal->j_commit_sequence, + journal->j_devname, commit_transaction->t_tid, journal->j_tail_sequence); jbd_debug(1, "JBD: commit %d complete, head %d\n", journal->j_commit_sequence, journal->j_tail_sequence); + if (to_free) + kfree(commit_transaction); wake_up(&journal->j_wait_done_commit); } diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 973db89..0ff7209 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -1146,8 +1146,8 @@ int jbd2_log_wait_commit(journal_t *journal, tid_t tid); int jbd2_log_do_checkpoint(journal_t *journal); void __jbd2_log_wait_for_space(journal_t *journal); -extern void __jbd2_journal_drop_transaction(journal_t *, transaction_t *); -extern int jbd2_cleanup_journal_tail(journal_t *); +extern void ___jbd2_journal_drop_transaction(journal_t *, transaction_t *, int); +extern int jbd2_cleanup_journal_tail(journal_t *); /* Debugging code only: */ @@ -1217,6 +1217,11 @@ static inline int jbd_space_needed(journal_t *journal) t_outstanding_credits; return nblocks; } +static inline void __jbd2_journal_drop_transaction(journal_t *journal, + transaction_t *transaction) +{ + return ___jbd2_journal_drop_transaction(journal, transaction, 1); +} /* * Definitions which augment the buffer_head layer -- 1.6.0.3.514.g2f91b