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.c75
1 files changed, 39 insertions, 36 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
index 7b4088b2364d..8896c1d4febe 100644
--- a/fs/jbd2/commit.c
+++ b/fs/jbd2/commit.c
@@ -25,6 +25,7 @@
25#include <linux/writeback.h> 25#include <linux/writeback.h>
26#include <linux/backing-dev.h> 26#include <linux/backing-dev.h>
27#include <linux/bio.h> 27#include <linux/bio.h>
28#include <linux/blkdev.h>
28#include <trace/events/jbd2.h> 29#include <trace/events/jbd2.h>
29 30
30/* 31/*
@@ -133,8 +134,8 @@ static int journal_submit_commit_record(journal_t *journal,
133 bh->b_end_io = journal_end_buffer_io_sync; 134 bh->b_end_io = journal_end_buffer_io_sync;
134 135
135 if (journal->j_flags & JBD2_BARRIER && 136 if (journal->j_flags & JBD2_BARRIER &&
136 !JBD2_HAS_INCOMPAT_FEATURE(journal, 137 !JBD2_HAS_INCOMPAT_FEATURE(journal,
137 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 138 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
138 set_buffer_ordered(bh); 139 set_buffer_ordered(bh);
139 barrier_done = 1; 140 barrier_done = 1;
140 } 141 }
@@ -220,7 +221,6 @@ static int journal_submit_inode_data_buffers(struct address_space *mapping)
220 .nr_to_write = mapping->nrpages * 2, 221 .nr_to_write = mapping->nrpages * 2,
221 .range_start = 0, 222 .range_start = 0,
222 .range_end = i_size_read(mapping->host), 223 .range_end = i_size_read(mapping->host),
223 .for_writepages = 1,
224 }; 224 };
225 225
226 ret = generic_writepages(mapping, &wbc); 226 ret = generic_writepages(mapping, &wbc);
@@ -410,10 +410,10 @@ void jbd2_journal_commit_transaction(journal_t *journal)
410 if (commit_transaction->t_synchronous_commit) 410 if (commit_transaction->t_synchronous_commit)
411 write_op = WRITE_SYNC_PLUG; 411 write_op = WRITE_SYNC_PLUG;
412 trace_jbd2_commit_locking(journal, commit_transaction); 412 trace_jbd2_commit_locking(journal, commit_transaction);
413 stats.u.run.rs_wait = commit_transaction->t_max_wait; 413 stats.run.rs_wait = commit_transaction->t_max_wait;
414 stats.u.run.rs_locked = jiffies; 414 stats.run.rs_locked = jiffies;
415 stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start, 415 stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
416 stats.u.run.rs_locked); 416 stats.run.rs_locked);
417 417
418 spin_lock(&commit_transaction->t_handle_lock); 418 spin_lock(&commit_transaction->t_handle_lock);
419 while (commit_transaction->t_updates) { 419 while (commit_transaction->t_updates) {
@@ -486,9 +486,9 @@ void jbd2_journal_commit_transaction(journal_t *journal)
486 jbd2_journal_switch_revoke_table(journal); 486 jbd2_journal_switch_revoke_table(journal);
487 487
488 trace_jbd2_commit_flushing(journal, commit_transaction); 488 trace_jbd2_commit_flushing(journal, commit_transaction);
489 stats.u.run.rs_flushing = jiffies; 489 stats.run.rs_flushing = jiffies;
490 stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked, 490 stats.run.rs_locked = jbd2_time_diff(stats.run.rs_locked,
491 stats.u.run.rs_flushing); 491 stats.run.rs_flushing);
492 492
493 commit_transaction->t_state = T_FLUSH; 493 commit_transaction->t_state = T_FLUSH;
494 journal->j_committing_transaction = commit_transaction; 494 journal->j_committing_transaction = commit_transaction;
@@ -523,11 +523,11 @@ void jbd2_journal_commit_transaction(journal_t *journal)
523 spin_unlock(&journal->j_state_lock); 523 spin_unlock(&journal->j_state_lock);
524 524
525 trace_jbd2_commit_logging(journal, commit_transaction); 525 trace_jbd2_commit_logging(journal, commit_transaction);
526 stats.u.run.rs_logging = jiffies; 526 stats.run.rs_logging = jiffies;
527 stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing, 527 stats.run.rs_flushing = jbd2_time_diff(stats.run.rs_flushing,
528 stats.u.run.rs_logging); 528 stats.run.rs_logging);
529 stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits; 529 stats.run.rs_blocks = commit_transaction->t_outstanding_credits;
530 stats.u.run.rs_blocks_logged = 0; 530 stats.run.rs_blocks_logged = 0;
531 531
532 J_ASSERT(commit_transaction->t_nr_buffers <= 532 J_ASSERT(commit_transaction->t_nr_buffers <=
533 commit_transaction->t_outstanding_credits); 533 commit_transaction->t_outstanding_credits);
@@ -636,6 +636,10 @@ void jbd2_journal_commit_transaction(journal_t *journal)
636 JBUFFER_TRACE(jh, "ph3: write metadata"); 636 JBUFFER_TRACE(jh, "ph3: write metadata");
637 flags = jbd2_journal_write_metadata_buffer(commit_transaction, 637 flags = jbd2_journal_write_metadata_buffer(commit_transaction,
638 jh, &new_jh, blocknr); 638 jh, &new_jh, blocknr);
639 if (flags < 0) {
640 jbd2_journal_abort(journal, flags);
641 continue;
642 }
639 set_bit(BH_JWrite, &jh2bh(new_jh)->b_state); 643 set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
640 wbuf[bufs++] = jh2bh(new_jh); 644 wbuf[bufs++] = jh2bh(new_jh);
641 645
@@ -695,7 +699,7 @@ start_journal_io:
695 submit_bh(write_op, bh); 699 submit_bh(write_op, bh);
696 } 700 }
697 cond_resched(); 701 cond_resched();
698 stats.u.run.rs_blocks_logged += bufs; 702 stats.run.rs_blocks_logged += bufs;
699 703
700 /* Force a new descriptor to be generated next 704 /* Force a new descriptor to be generated next
701 time round the loop. */ 705 time round the loop. */
@@ -707,11 +711,13 @@ start_journal_io:
707 /* Done it all: now write the commit record asynchronously. */ 711 /* Done it all: now write the commit record asynchronously. */
708 712
709 if (JBD2_HAS_INCOMPAT_FEATURE(journal, 713 if (JBD2_HAS_INCOMPAT_FEATURE(journal,
710 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 714 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
711 err = journal_submit_commit_record(journal, commit_transaction, 715 err = journal_submit_commit_record(journal, commit_transaction,
712 &cbh, crc32_sum); 716 &cbh, crc32_sum);
713 if (err) 717 if (err)
714 __jbd2_journal_abort_hard(journal); 718 __jbd2_journal_abort_hard(journal);
719 if (journal->j_flags & JBD2_BARRIER)
720 blkdev_issue_flush(journal->j_dev, NULL);
715 } 721 }
716 722
717 /* 723 /*
@@ -834,7 +840,7 @@ wait_for_iobuf:
834 jbd_debug(3, "JBD: commit phase 5\n"); 840 jbd_debug(3, "JBD: commit phase 5\n");
835 841
836 if (!JBD2_HAS_INCOMPAT_FEATURE(journal, 842 if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
837 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 843 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
838 err = journal_submit_commit_record(journal, commit_transaction, 844 err = journal_submit_commit_record(journal, commit_transaction,
839 &cbh, crc32_sum); 845 &cbh, crc32_sum);
840 if (err) 846 if (err)
@@ -986,33 +992,30 @@ restart_loop:
986 J_ASSERT(commit_transaction->t_state == T_COMMIT); 992 J_ASSERT(commit_transaction->t_state == T_COMMIT);
987 993
988 commit_transaction->t_start = jiffies; 994 commit_transaction->t_start = jiffies;
989 stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging, 995 stats.run.rs_logging = jbd2_time_diff(stats.run.rs_logging,
990 commit_transaction->t_start); 996 commit_transaction->t_start);
991 997
992 /* 998 /*
993 * File the transaction for history 999 * File the transaction statistics
994 */ 1000 */
995 stats.ts_type = JBD2_STATS_RUN;
996 stats.ts_tid = commit_transaction->t_tid; 1001 stats.ts_tid = commit_transaction->t_tid;
997 stats.u.run.rs_handle_count = commit_transaction->t_handle_count; 1002 stats.run.rs_handle_count = commit_transaction->t_handle_count;
998 spin_lock(&journal->j_history_lock); 1003 trace_jbd2_run_stats(journal->j_fs_dev->bd_dev,
999 memcpy(journal->j_history + journal->j_history_cur, &stats, 1004 commit_transaction->t_tid, &stats.run);
1000 sizeof(stats));
1001 if (++journal->j_history_cur == journal->j_history_max)
1002 journal->j_history_cur = 0;
1003 1005
1004 /* 1006 /*
1005 * Calculate overall stats 1007 * Calculate overall stats
1006 */ 1008 */
1009 spin_lock(&journal->j_history_lock);
1007 journal->j_stats.ts_tid++; 1010 journal->j_stats.ts_tid++;
1008 journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait; 1011 journal->j_stats.run.rs_wait += stats.run.rs_wait;
1009 journal->j_stats.u.run.rs_running += stats.u.run.rs_running; 1012 journal->j_stats.run.rs_running += stats.run.rs_running;
1010 journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked; 1013 journal->j_stats.run.rs_locked += stats.run.rs_locked;
1011 journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing; 1014 journal->j_stats.run.rs_flushing += stats.run.rs_flushing;
1012 journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging; 1015 journal->j_stats.run.rs_logging += stats.run.rs_logging;
1013 journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count; 1016 journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count;
1014 journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks; 1017 journal->j_stats.run.rs_blocks += stats.run.rs_blocks;
1015 journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged; 1018 journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged;
1016 spin_unlock(&journal->j_history_lock); 1019 spin_unlock(&journal->j_history_lock);
1017 1020
1018 commit_transaction->t_state = T_FINISHED; 1021 commit_transaction->t_state = T_FINISHED;