aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jbd2
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2008-10-28 21:08:20 -0400
committerTheodore Ts'o <tytso@mit.edu>2008-10-28 21:08:20 -0400
commit6c20ec850360bc6e5c66a787f0523a80450d65ab (patch)
tree567f496cf53dbfbc235809edac134e0247a062c8 /fs/jbd2
parentef2cabf7c6d838eb0ee2b4fb8ef84f7c06ce16d9 (diff)
downloadkernel_samsung_aries-6c20ec850360bc6e5c66a787f0523a80450d65ab.zip
kernel_samsung_aries-6c20ec850360bc6e5c66a787f0523a80450d65ab.tar.gz
kernel_samsung_aries-6c20ec850360bc6e5c66a787f0523a80450d65ab.tar.bz2
jbd2: Call the commit callback before the transaction could get dropped
The transaction can potentially get dropped if there are no buffers that need to be written. Make sure we call the commit callback before potentially deciding to drop the transaction. Also avoid dereferencing the commit_transaction pointer in the marker for the same reason. This patch fixes the bug reported by Eric Paris at: http://bugzilla.kernel.org/show_bug.cgi?id=11838 Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> Acked-by: Eric Sandeen <sandeen@redhat.com> Tested-by: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'fs/jbd2')
-rw-r--r--fs/jbd2/commit.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
index 8b119e1..ebc667b 100644
--- a/fs/jbd2/commit.c
+++ b/fs/jbd2/commit.c
@@ -974,6 +974,9 @@ restart_loop:
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);
@@ -995,11 +998,8 @@ restart_loop:
}
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, commit_transaction->t_tid,
+ journal->j_devname, journal->j_commit_sequence,
journal->j_tail_sequence);
jbd_debug(1, "JBD: commit %d complete, head %d\n",
journal->j_commit_sequence, journal->j_tail_sequence);