aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jbd2/commit.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/jbd2/commit.c')
-rw-r--r--fs/jbd2/commit.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
index 39b5cee3dd8a..8749a86f4175 100644
--- a/fs/jbd2/commit.c
+++ b/fs/jbd2/commit.c
@@ -20,6 +20,7 @@
20#include <linux/slab.h> 20#include <linux/slab.h>
21#include <linux/mm.h> 21#include <linux/mm.h>
22#include <linux/pagemap.h> 22#include <linux/pagemap.h>
23#include <linux/jiffies.h>
23 24
24/* 25/*
25 * Default IO end handler for temporary BJ_IO buffer_heads. 26 * Default IO end handler for temporary BJ_IO buffer_heads.
@@ -290,6 +291,7 @@ static inline void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
290 */ 291 */
291void jbd2_journal_commit_transaction(journal_t *journal) 292void jbd2_journal_commit_transaction(journal_t *journal)
292{ 293{
294 struct transaction_stats_s stats;
293 transaction_t *commit_transaction; 295 transaction_t *commit_transaction;
294 struct journal_head *jh, *new_jh, *descriptor; 296 struct journal_head *jh, *new_jh, *descriptor;
295 struct buffer_head **wbuf = journal->j_wbuf; 297 struct buffer_head **wbuf = journal->j_wbuf;
@@ -337,6 +339,11 @@ void jbd2_journal_commit_transaction(journal_t *journal)
337 spin_lock(&journal->j_state_lock); 339 spin_lock(&journal->j_state_lock);
338 commit_transaction->t_state = T_LOCKED; 340 commit_transaction->t_state = T_LOCKED;
339 341
342 stats.u.run.rs_wait = commit_transaction->t_max_wait;
343 stats.u.run.rs_locked = jiffies;
344 stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
345 stats.u.run.rs_locked);
346
340 spin_lock(&commit_transaction->t_handle_lock); 347 spin_lock(&commit_transaction->t_handle_lock);
341 while (commit_transaction->t_updates) { 348 while (commit_transaction->t_updates) {
342 DEFINE_WAIT(wait); 349 DEFINE_WAIT(wait);
@@ -407,6 +414,10 @@ void jbd2_journal_commit_transaction(journal_t *journal)
407 */ 414 */
408 jbd2_journal_switch_revoke_table(journal); 415 jbd2_journal_switch_revoke_table(journal);
409 416
417 stats.u.run.rs_flushing = jiffies;
418 stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked,
419 stats.u.run.rs_flushing);
420
410 commit_transaction->t_state = T_FLUSH; 421 commit_transaction->t_state = T_FLUSH;
411 journal->j_committing_transaction = commit_transaction; 422 journal->j_committing_transaction = commit_transaction;
412 journal->j_running_transaction = NULL; 423 journal->j_running_transaction = NULL;
@@ -498,6 +509,12 @@ void jbd2_journal_commit_transaction(journal_t *journal)
498 */ 509 */
499 commit_transaction->t_state = T_COMMIT; 510 commit_transaction->t_state = T_COMMIT;
500 511
512 stats.u.run.rs_logging = jiffies;
513 stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing,
514 stats.u.run.rs_logging);
515 stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits;
516 stats.u.run.rs_blocks_logged = 0;
517
501 descriptor = NULL; 518 descriptor = NULL;
502 bufs = 0; 519 bufs = 0;
503 while (commit_transaction->t_buffers) { 520 while (commit_transaction->t_buffers) {
@@ -646,6 +663,7 @@ start_journal_io:
646 submit_bh(WRITE, bh); 663 submit_bh(WRITE, bh);
647 } 664 }
648 cond_resched(); 665 cond_resched();
666 stats.u.run.rs_blocks_logged += bufs;
649 667
650 /* Force a new descriptor to be generated next 668 /* Force a new descriptor to be generated next
651 time round the loop. */ 669 time round the loop. */
@@ -816,6 +834,7 @@ restart_loop:
816 cp_transaction = jh->b_cp_transaction; 834 cp_transaction = jh->b_cp_transaction;
817 if (cp_transaction) { 835 if (cp_transaction) {
818 JBUFFER_TRACE(jh, "remove from old cp transaction"); 836 JBUFFER_TRACE(jh, "remove from old cp transaction");
837 cp_transaction->t_chp_stats.cs_dropped++;
819 __jbd2_journal_remove_checkpoint(jh); 838 __jbd2_journal_remove_checkpoint(jh);
820 } 839 }
821 840
@@ -890,6 +909,36 @@ restart_loop:
890 909
891 J_ASSERT(commit_transaction->t_state == T_COMMIT); 910 J_ASSERT(commit_transaction->t_state == T_COMMIT);
892 911
912 commit_transaction->t_start = jiffies;
913 stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging,
914 commit_transaction->t_start);
915
916 /*
917 * File the transaction for history
918 */
919 stats.ts_type = JBD2_STATS_RUN;
920 stats.ts_tid = commit_transaction->t_tid;
921 stats.u.run.rs_handle_count = commit_transaction->t_handle_count;
922 spin_lock(&journal->j_history_lock);
923 memcpy(journal->j_history + journal->j_history_cur, &stats,
924 sizeof(stats));
925 if (++journal->j_history_cur == journal->j_history_max)
926 journal->j_history_cur = 0;
927
928 /*
929 * Calculate overall stats
930 */
931 journal->j_stats.ts_tid++;
932 journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
933 journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
934 journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
935 journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
936 journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
937 journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
938 journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
939 journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged;
940 spin_unlock(&journal->j_history_lock);
941
893 commit_transaction->t_state = T_FINISHED; 942 commit_transaction->t_state = T_FINISHED;
894 J_ASSERT(commit_transaction == journal->j_committing_transaction); 943 J_ASSERT(commit_transaction == journal->j_committing_transaction);
895 journal->j_commit_sequence = commit_transaction->t_tid; 944 journal->j_commit_sequence = commit_transaction->t_tid;