diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2009-12-07 01:28:35 -0500 |
---|---|---|
committer | Frederic Weisbecker <fweisbec@gmail.com> | 2009-12-07 01:29:22 -0500 |
commit | 6548698f929814375fa5d62ae1db96959b0418c1 (patch) | |
tree | 340924ae82cb0946aa15045b2b72186de52a8146 /fs/jbd2 | |
parent | 1d2c6cfd40b2dece3bb958cbbc405a2c1536ab75 (diff) | |
parent | 22763c5cf3690a681551162c15d34d935308c8d7 (diff) |
Merge commit 'v2.6.32' into reiserfs/kill-bkl
Merge-reason: The tree was based 2.6.31. It's better to be up to date
with 2.6.32. Although no conflicting changes were made in between,
it gives benchmarking results closer to the lastest kernel behaviour.
Diffstat (limited to 'fs/jbd2')
-rw-r--r-- | fs/jbd2/checkpoint.c | 7 | ||||
-rw-r--r-- | fs/jbd2/commit.c | 71 | ||||
-rw-r--r-- | fs/jbd2/journal.c | 208 | ||||
-rw-r--r-- | fs/jbd2/transaction.c | 7 |
4 files changed, 69 insertions, 224 deletions
diff --git a/fs/jbd2/checkpoint.c b/fs/jbd2/checkpoint.c index 5d70b3e6d49b..ca0f5eb62b20 100644 --- a/fs/jbd2/checkpoint.c +++ b/fs/jbd2/checkpoint.c | |||
@@ -643,6 +643,7 @@ out: | |||
643 | 643 | ||
644 | int __jbd2_journal_remove_checkpoint(struct journal_head *jh) | 644 | int __jbd2_journal_remove_checkpoint(struct journal_head *jh) |
645 | { | 645 | { |
646 | struct transaction_chp_stats_s *stats; | ||
646 | transaction_t *transaction; | 647 | transaction_t *transaction; |
647 | journal_t *journal; | 648 | journal_t *journal; |
648 | int ret = 0; | 649 | int ret = 0; |
@@ -679,6 +680,12 @@ int __jbd2_journal_remove_checkpoint(struct journal_head *jh) | |||
679 | 680 | ||
680 | /* OK, that was the last buffer for the transaction: we can now | 681 | /* OK, that was the last buffer for the transaction: we can now |
681 | safely remove this transaction from the log */ | 682 | safely remove this transaction from the log */ |
683 | stats = &transaction->t_chp_stats; | ||
684 | if (stats->cs_chp_time) | ||
685 | stats->cs_chp_time = jbd2_time_diff(stats->cs_chp_time, | ||
686 | jiffies); | ||
687 | trace_jbd2_checkpoint_stats(journal->j_fs_dev->bd_dev, | ||
688 | transaction->t_tid, stats); | ||
682 | 689 | ||
683 | __jbd2_journal_drop_transaction(journal, transaction); | 690 | __jbd2_journal_drop_transaction(journal, transaction); |
684 | kfree(transaction); | 691 | kfree(transaction); |
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 7b4088b2364d..d4cfd6d2779e 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); |
@@ -695,7 +695,7 @@ start_journal_io: | |||
695 | submit_bh(write_op, bh); | 695 | submit_bh(write_op, bh); |
696 | } | 696 | } |
697 | cond_resched(); | 697 | cond_resched(); |
698 | stats.u.run.rs_blocks_logged += bufs; | 698 | stats.run.rs_blocks_logged += bufs; |
699 | 699 | ||
700 | /* Force a new descriptor to be generated next | 700 | /* Force a new descriptor to be generated next |
701 | time round the loop. */ | 701 | time round the loop. */ |
@@ -707,11 +707,13 @@ start_journal_io: | |||
707 | /* Done it all: now write the commit record asynchronously. */ | 707 | /* Done it all: now write the commit record asynchronously. */ |
708 | 708 | ||
709 | if (JBD2_HAS_INCOMPAT_FEATURE(journal, | 709 | if (JBD2_HAS_INCOMPAT_FEATURE(journal, |
710 | JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { | 710 | JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { |
711 | err = journal_submit_commit_record(journal, commit_transaction, | 711 | err = journal_submit_commit_record(journal, commit_transaction, |
712 | &cbh, crc32_sum); | 712 | &cbh, crc32_sum); |
713 | if (err) | 713 | if (err) |
714 | __jbd2_journal_abort_hard(journal); | 714 | __jbd2_journal_abort_hard(journal); |
715 | if (journal->j_flags & JBD2_BARRIER) | ||
716 | blkdev_issue_flush(journal->j_dev, NULL); | ||
715 | } | 717 | } |
716 | 718 | ||
717 | /* | 719 | /* |
@@ -834,7 +836,7 @@ wait_for_iobuf: | |||
834 | jbd_debug(3, "JBD: commit phase 5\n"); | 836 | jbd_debug(3, "JBD: commit phase 5\n"); |
835 | 837 | ||
836 | if (!JBD2_HAS_INCOMPAT_FEATURE(journal, | 838 | if (!JBD2_HAS_INCOMPAT_FEATURE(journal, |
837 | JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { | 839 | JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { |
838 | err = journal_submit_commit_record(journal, commit_transaction, | 840 | err = journal_submit_commit_record(journal, commit_transaction, |
839 | &cbh, crc32_sum); | 841 | &cbh, crc32_sum); |
840 | if (err) | 842 | if (err) |
@@ -986,33 +988,30 @@ restart_loop: | |||
986 | J_ASSERT(commit_transaction->t_state == T_COMMIT); | 988 | J_ASSERT(commit_transaction->t_state == T_COMMIT); |
987 | 989 | ||
988 | commit_transaction->t_start = jiffies; | 990 | commit_transaction->t_start = jiffies; |
989 | stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging, | 991 | stats.run.rs_logging = jbd2_time_diff(stats.run.rs_logging, |
990 | commit_transaction->t_start); | 992 | commit_transaction->t_start); |
991 | 993 | ||
992 | /* | 994 | /* |
993 | * File the transaction for history | 995 | * File the transaction statistics |
994 | */ | 996 | */ |
995 | stats.ts_type = JBD2_STATS_RUN; | ||
996 | stats.ts_tid = commit_transaction->t_tid; | 997 | stats.ts_tid = commit_transaction->t_tid; |
997 | stats.u.run.rs_handle_count = commit_transaction->t_handle_count; | 998 | stats.run.rs_handle_count = commit_transaction->t_handle_count; |
998 | spin_lock(&journal->j_history_lock); | 999 | trace_jbd2_run_stats(journal->j_fs_dev->bd_dev, |
999 | memcpy(journal->j_history + journal->j_history_cur, &stats, | 1000 | 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 | 1001 | ||
1004 | /* | 1002 | /* |
1005 | * Calculate overall stats | 1003 | * Calculate overall stats |
1006 | */ | 1004 | */ |
1005 | spin_lock(&journal->j_history_lock); | ||
1007 | journal->j_stats.ts_tid++; | 1006 | journal->j_stats.ts_tid++; |
1008 | journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait; | 1007 | journal->j_stats.run.rs_wait += stats.run.rs_wait; |
1009 | journal->j_stats.u.run.rs_running += stats.u.run.rs_running; | 1008 | journal->j_stats.run.rs_running += stats.run.rs_running; |
1010 | journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked; | 1009 | journal->j_stats.run.rs_locked += stats.run.rs_locked; |
1011 | journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing; | 1010 | journal->j_stats.run.rs_flushing += stats.run.rs_flushing; |
1012 | journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging; | 1011 | 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; | 1012 | 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; | 1013 | 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; | 1014 | journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged; |
1016 | spin_unlock(&journal->j_history_lock); | 1015 | spin_unlock(&journal->j_history_lock); |
1017 | 1016 | ||
1018 | commit_transaction->t_state = T_FINISHED; | 1017 | commit_transaction->t_state = T_FINISHED; |
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index e378cb383979..fed85388ee86 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c | |||
@@ -136,10 +136,6 @@ static int kjournald2(void *arg) | |||
136 | journal->j_task = current; | 136 | journal->j_task = current; |
137 | wake_up(&journal->j_wait_done_commit); | 137 | wake_up(&journal->j_wait_done_commit); |
138 | 138 | ||
139 | printk(KERN_INFO "kjournald2 starting: pid %d, dev %s, " | ||
140 | "commit interval %ld seconds\n", current->pid, | ||
141 | journal->j_devname, journal->j_commit_interval / HZ); | ||
142 | |||
143 | /* | 139 | /* |
144 | * And now, wait forever for commit wakeup events. | 140 | * And now, wait forever for commit wakeup events. |
145 | */ | 141 | */ |
@@ -223,7 +219,8 @@ static int jbd2_journal_start_thread(journal_t *journal) | |||
223 | { | 219 | { |
224 | struct task_struct *t; | 220 | struct task_struct *t; |
225 | 221 | ||
226 | t = kthread_run(kjournald2, journal, "kjournald2"); | 222 | t = kthread_run(kjournald2, journal, "jbd2/%s", |
223 | journal->j_devname); | ||
227 | if (IS_ERR(t)) | 224 | if (IS_ERR(t)) |
228 | return PTR_ERR(t); | 225 | return PTR_ERR(t); |
229 | 226 | ||
@@ -679,153 +676,6 @@ struct jbd2_stats_proc_session { | |||
679 | int max; | 676 | int max; |
680 | }; | 677 | }; |
681 | 678 | ||
682 | static void *jbd2_history_skip_empty(struct jbd2_stats_proc_session *s, | ||
683 | struct transaction_stats_s *ts, | ||
684 | int first) | ||
685 | { | ||
686 | if (ts == s->stats + s->max) | ||
687 | ts = s->stats; | ||
688 | if (!first && ts == s->stats + s->start) | ||
689 | return NULL; | ||
690 | while (ts->ts_type == 0) { | ||
691 | ts++; | ||
692 | if (ts == s->stats + s->max) | ||
693 | ts = s->stats; | ||
694 | if (ts == s->stats + s->start) | ||
695 | return NULL; | ||
696 | } | ||
697 | return ts; | ||
698 | |||
699 | } | ||
700 | |||
701 | static void *jbd2_seq_history_start(struct seq_file *seq, loff_t *pos) | ||
702 | { | ||
703 | struct jbd2_stats_proc_session *s = seq->private; | ||
704 | struct transaction_stats_s *ts; | ||
705 | int l = *pos; | ||
706 | |||
707 | if (l == 0) | ||
708 | return SEQ_START_TOKEN; | ||
709 | ts = jbd2_history_skip_empty(s, s->stats + s->start, 1); | ||
710 | if (!ts) | ||
711 | return NULL; | ||
712 | l--; | ||
713 | while (l) { | ||
714 | ts = jbd2_history_skip_empty(s, ++ts, 0); | ||
715 | if (!ts) | ||
716 | break; | ||
717 | l--; | ||
718 | } | ||
719 | return ts; | ||
720 | } | ||
721 | |||
722 | static void *jbd2_seq_history_next(struct seq_file *seq, void *v, loff_t *pos) | ||
723 | { | ||
724 | struct jbd2_stats_proc_session *s = seq->private; | ||
725 | struct transaction_stats_s *ts = v; | ||
726 | |||
727 | ++*pos; | ||
728 | if (v == SEQ_START_TOKEN) | ||
729 | return jbd2_history_skip_empty(s, s->stats + s->start, 1); | ||
730 | else | ||
731 | return jbd2_history_skip_empty(s, ++ts, 0); | ||
732 | } | ||
733 | |||
734 | static int jbd2_seq_history_show(struct seq_file *seq, void *v) | ||
735 | { | ||
736 | struct transaction_stats_s *ts = v; | ||
737 | if (v == SEQ_START_TOKEN) { | ||
738 | seq_printf(seq, "%-4s %-5s %-5s %-5s %-5s %-5s %-5s %-6s %-5s " | ||
739 | "%-5s %-5s %-5s %-5s %-5s\n", "R/C", "tid", | ||
740 | "wait", "run", "lock", "flush", "log", "hndls", | ||
741 | "block", "inlog", "ctime", "write", "drop", | ||
742 | "close"); | ||
743 | return 0; | ||
744 | } | ||
745 | if (ts->ts_type == JBD2_STATS_RUN) | ||
746 | seq_printf(seq, "%-4s %-5lu %-5u %-5u %-5u %-5u %-5u " | ||
747 | "%-6lu %-5lu %-5lu\n", "R", ts->ts_tid, | ||
748 | jiffies_to_msecs(ts->u.run.rs_wait), | ||
749 | jiffies_to_msecs(ts->u.run.rs_running), | ||
750 | jiffies_to_msecs(ts->u.run.rs_locked), | ||
751 | jiffies_to_msecs(ts->u.run.rs_flushing), | ||
752 | jiffies_to_msecs(ts->u.run.rs_logging), | ||
753 | ts->u.run.rs_handle_count, | ||
754 | ts->u.run.rs_blocks, | ||
755 | ts->u.run.rs_blocks_logged); | ||
756 | else if (ts->ts_type == JBD2_STATS_CHECKPOINT) | ||
757 | seq_printf(seq, "%-4s %-5lu %48s %-5u %-5lu %-5lu %-5lu\n", | ||
758 | "C", ts->ts_tid, " ", | ||
759 | jiffies_to_msecs(ts->u.chp.cs_chp_time), | ||
760 | ts->u.chp.cs_written, ts->u.chp.cs_dropped, | ||
761 | ts->u.chp.cs_forced_to_close); | ||
762 | else | ||
763 | J_ASSERT(0); | ||
764 | return 0; | ||
765 | } | ||
766 | |||
767 | static void jbd2_seq_history_stop(struct seq_file *seq, void *v) | ||
768 | { | ||
769 | } | ||
770 | |||
771 | static struct seq_operations jbd2_seq_history_ops = { | ||
772 | .start = jbd2_seq_history_start, | ||
773 | .next = jbd2_seq_history_next, | ||
774 | .stop = jbd2_seq_history_stop, | ||
775 | .show = jbd2_seq_history_show, | ||
776 | }; | ||
777 | |||
778 | static int jbd2_seq_history_open(struct inode *inode, struct file *file) | ||
779 | { | ||
780 | journal_t *journal = PDE(inode)->data; | ||
781 | struct jbd2_stats_proc_session *s; | ||
782 | int rc, size; | ||
783 | |||
784 | s = kmalloc(sizeof(*s), GFP_KERNEL); | ||
785 | if (s == NULL) | ||
786 | return -ENOMEM; | ||
787 | size = sizeof(struct transaction_stats_s) * journal->j_history_max; | ||
788 | s->stats = kmalloc(size, GFP_KERNEL); | ||
789 | if (s->stats == NULL) { | ||
790 | kfree(s); | ||
791 | return -ENOMEM; | ||
792 | } | ||
793 | spin_lock(&journal->j_history_lock); | ||
794 | memcpy(s->stats, journal->j_history, size); | ||
795 | s->max = journal->j_history_max; | ||
796 | s->start = journal->j_history_cur % s->max; | ||
797 | spin_unlock(&journal->j_history_lock); | ||
798 | |||
799 | rc = seq_open(file, &jbd2_seq_history_ops); | ||
800 | if (rc == 0) { | ||
801 | struct seq_file *m = file->private_data; | ||
802 | m->private = s; | ||
803 | } else { | ||
804 | kfree(s->stats); | ||
805 | kfree(s); | ||
806 | } | ||
807 | return rc; | ||
808 | |||
809 | } | ||
810 | |||
811 | static int jbd2_seq_history_release(struct inode *inode, struct file *file) | ||
812 | { | ||
813 | struct seq_file *seq = file->private_data; | ||
814 | struct jbd2_stats_proc_session *s = seq->private; | ||
815 | |||
816 | kfree(s->stats); | ||
817 | kfree(s); | ||
818 | return seq_release(inode, file); | ||
819 | } | ||
820 | |||
821 | static struct file_operations jbd2_seq_history_fops = { | ||
822 | .owner = THIS_MODULE, | ||
823 | .open = jbd2_seq_history_open, | ||
824 | .read = seq_read, | ||
825 | .llseek = seq_lseek, | ||
826 | .release = jbd2_seq_history_release, | ||
827 | }; | ||
828 | |||
829 | static void *jbd2_seq_info_start(struct seq_file *seq, loff_t *pos) | 679 | static void *jbd2_seq_info_start(struct seq_file *seq, loff_t *pos) |
830 | { | 680 | { |
831 | return *pos ? NULL : SEQ_START_TOKEN; | 681 | return *pos ? NULL : SEQ_START_TOKEN; |
@@ -842,29 +692,29 @@ static int jbd2_seq_info_show(struct seq_file *seq, void *v) | |||
842 | 692 | ||
843 | if (v != SEQ_START_TOKEN) | 693 | if (v != SEQ_START_TOKEN) |
844 | return 0; | 694 | return 0; |
845 | seq_printf(seq, "%lu transaction, each upto %u blocks\n", | 695 | seq_printf(seq, "%lu transaction, each up to %u blocks\n", |
846 | s->stats->ts_tid, | 696 | s->stats->ts_tid, |
847 | s->journal->j_max_transaction_buffers); | 697 | s->journal->j_max_transaction_buffers); |
848 | if (s->stats->ts_tid == 0) | 698 | if (s->stats->ts_tid == 0) |
849 | return 0; | 699 | return 0; |
850 | seq_printf(seq, "average: \n %ums waiting for transaction\n", | 700 | seq_printf(seq, "average: \n %ums waiting for transaction\n", |
851 | jiffies_to_msecs(s->stats->u.run.rs_wait / s->stats->ts_tid)); | 701 | jiffies_to_msecs(s->stats->run.rs_wait / s->stats->ts_tid)); |
852 | seq_printf(seq, " %ums running transaction\n", | 702 | seq_printf(seq, " %ums running transaction\n", |
853 | jiffies_to_msecs(s->stats->u.run.rs_running / s->stats->ts_tid)); | 703 | jiffies_to_msecs(s->stats->run.rs_running / s->stats->ts_tid)); |
854 | seq_printf(seq, " %ums transaction was being locked\n", | 704 | seq_printf(seq, " %ums transaction was being locked\n", |
855 | jiffies_to_msecs(s->stats->u.run.rs_locked / s->stats->ts_tid)); | 705 | jiffies_to_msecs(s->stats->run.rs_locked / s->stats->ts_tid)); |
856 | seq_printf(seq, " %ums flushing data (in ordered mode)\n", | 706 | seq_printf(seq, " %ums flushing data (in ordered mode)\n", |
857 | jiffies_to_msecs(s->stats->u.run.rs_flushing / s->stats->ts_tid)); | 707 | jiffies_to_msecs(s->stats->run.rs_flushing / s->stats->ts_tid)); |
858 | seq_printf(seq, " %ums logging transaction\n", | 708 | seq_printf(seq, " %ums logging transaction\n", |
859 | jiffies_to_msecs(s->stats->u.run.rs_logging / s->stats->ts_tid)); | 709 | jiffies_to_msecs(s->stats->run.rs_logging / s->stats->ts_tid)); |
860 | seq_printf(seq, " %lluus average transaction commit time\n", | 710 | seq_printf(seq, " %lluus average transaction commit time\n", |
861 | div_u64(s->journal->j_average_commit_time, 1000)); | 711 | div_u64(s->journal->j_average_commit_time, 1000)); |
862 | seq_printf(seq, " %lu handles per transaction\n", | 712 | seq_printf(seq, " %lu handles per transaction\n", |
863 | s->stats->u.run.rs_handle_count / s->stats->ts_tid); | 713 | s->stats->run.rs_handle_count / s->stats->ts_tid); |
864 | seq_printf(seq, " %lu blocks per transaction\n", | 714 | seq_printf(seq, " %lu blocks per transaction\n", |
865 | s->stats->u.run.rs_blocks / s->stats->ts_tid); | 715 | s->stats->run.rs_blocks / s->stats->ts_tid); |
866 | seq_printf(seq, " %lu logged blocks per transaction\n", | 716 | seq_printf(seq, " %lu logged blocks per transaction\n", |
867 | s->stats->u.run.rs_blocks_logged / s->stats->ts_tid); | 717 | s->stats->run.rs_blocks_logged / s->stats->ts_tid); |
868 | return 0; | 718 | return 0; |
869 | } | 719 | } |
870 | 720 | ||
@@ -872,7 +722,7 @@ static void jbd2_seq_info_stop(struct seq_file *seq, void *v) | |||
872 | { | 722 | { |
873 | } | 723 | } |
874 | 724 | ||
875 | static struct seq_operations jbd2_seq_info_ops = { | 725 | static const struct seq_operations jbd2_seq_info_ops = { |
876 | .start = jbd2_seq_info_start, | 726 | .start = jbd2_seq_info_start, |
877 | .next = jbd2_seq_info_next, | 727 | .next = jbd2_seq_info_next, |
878 | .stop = jbd2_seq_info_stop, | 728 | .stop = jbd2_seq_info_stop, |
@@ -920,7 +770,7 @@ static int jbd2_seq_info_release(struct inode *inode, struct file *file) | |||
920 | return seq_release(inode, file); | 770 | return seq_release(inode, file); |
921 | } | 771 | } |
922 | 772 | ||
923 | static struct file_operations jbd2_seq_info_fops = { | 773 | static const struct file_operations jbd2_seq_info_fops = { |
924 | .owner = THIS_MODULE, | 774 | .owner = THIS_MODULE, |
925 | .open = jbd2_seq_info_open, | 775 | .open = jbd2_seq_info_open, |
926 | .read = seq_read, | 776 | .read = seq_read, |
@@ -934,8 +784,6 @@ static void jbd2_stats_proc_init(journal_t *journal) | |||
934 | { | 784 | { |
935 | journal->j_proc_entry = proc_mkdir(journal->j_devname, proc_jbd2_stats); | 785 | journal->j_proc_entry = proc_mkdir(journal->j_devname, proc_jbd2_stats); |
936 | if (journal->j_proc_entry) { | 786 | if (journal->j_proc_entry) { |
937 | proc_create_data("history", S_IRUGO, journal->j_proc_entry, | ||
938 | &jbd2_seq_history_fops, journal); | ||
939 | proc_create_data("info", S_IRUGO, journal->j_proc_entry, | 787 | proc_create_data("info", S_IRUGO, journal->j_proc_entry, |
940 | &jbd2_seq_info_fops, journal); | 788 | &jbd2_seq_info_fops, journal); |
941 | } | 789 | } |
@@ -944,27 +792,9 @@ static void jbd2_stats_proc_init(journal_t *journal) | |||
944 | static void jbd2_stats_proc_exit(journal_t *journal) | 792 | static void jbd2_stats_proc_exit(journal_t *journal) |
945 | { | 793 | { |
946 | remove_proc_entry("info", journal->j_proc_entry); | 794 | remove_proc_entry("info", journal->j_proc_entry); |
947 | remove_proc_entry("history", journal->j_proc_entry); | ||
948 | remove_proc_entry(journal->j_devname, proc_jbd2_stats); | 795 | remove_proc_entry(journal->j_devname, proc_jbd2_stats); |
949 | } | 796 | } |
950 | 797 | ||
951 | static void journal_init_stats(journal_t *journal) | ||
952 | { | ||
953 | int size; | ||
954 | |||
955 | if (!proc_jbd2_stats) | ||
956 | return; | ||
957 | |||
958 | journal->j_history_max = 100; | ||
959 | size = sizeof(struct transaction_stats_s) * journal->j_history_max; | ||
960 | journal->j_history = kzalloc(size, GFP_KERNEL); | ||
961 | if (!journal->j_history) { | ||
962 | journal->j_history_max = 0; | ||
963 | return; | ||
964 | } | ||
965 | spin_lock_init(&journal->j_history_lock); | ||
966 | } | ||
967 | |||
968 | /* | 798 | /* |
969 | * Management for journal control blocks: functions to create and | 799 | * Management for journal control blocks: functions to create and |
970 | * destroy journal_t structures, and to initialise and read existing | 800 | * destroy journal_t structures, and to initialise and read existing |
@@ -1009,7 +839,7 @@ static journal_t * journal_init_common (void) | |||
1009 | goto fail; | 839 | goto fail; |
1010 | } | 840 | } |
1011 | 841 | ||
1012 | journal_init_stats(journal); | 842 | spin_lock_init(&journal->j_history_lock); |
1013 | 843 | ||
1014 | return journal; | 844 | return journal; |
1015 | fail: | 845 | fail: |
@@ -1083,6 +913,7 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev, | |||
1083 | 913 | ||
1084 | return journal; | 914 | return journal; |
1085 | out_err: | 915 | out_err: |
916 | kfree(journal->j_wbuf); | ||
1086 | jbd2_stats_proc_exit(journal); | 917 | jbd2_stats_proc_exit(journal); |
1087 | kfree(journal); | 918 | kfree(journal); |
1088 | return NULL; | 919 | return NULL; |
@@ -1115,7 +946,7 @@ journal_t * jbd2_journal_init_inode (struct inode *inode) | |||
1115 | while ((p = strchr(p, '/'))) | 946 | while ((p = strchr(p, '/'))) |
1116 | *p = '!'; | 947 | *p = '!'; |
1117 | p = journal->j_devname + strlen(journal->j_devname); | 948 | p = journal->j_devname + strlen(journal->j_devname); |
1118 | sprintf(p, ":%lu", journal->j_inode->i_ino); | 949 | sprintf(p, "-%lu", journal->j_inode->i_ino); |
1119 | jbd_debug(1, | 950 | jbd_debug(1, |
1120 | "journal %p: inode %s/%ld, size %Ld, bits %d, blksize %ld\n", | 951 | "journal %p: inode %s/%ld, size %Ld, bits %d, blksize %ld\n", |
1121 | journal, inode->i_sb->s_id, inode->i_ino, | 952 | journal, inode->i_sb->s_id, inode->i_ino, |
@@ -1156,6 +987,7 @@ journal_t * jbd2_journal_init_inode (struct inode *inode) | |||
1156 | 987 | ||
1157 | return journal; | 988 | return journal; |
1158 | out_err: | 989 | out_err: |
990 | kfree(journal->j_wbuf); | ||
1159 | jbd2_stats_proc_exit(journal); | 991 | jbd2_stats_proc_exit(journal); |
1160 | kfree(journal); | 992 | kfree(journal); |
1161 | return NULL; | 993 | return NULL; |
@@ -1187,6 +1019,12 @@ static int journal_reset(journal_t *journal) | |||
1187 | 1019 | ||
1188 | first = be32_to_cpu(sb->s_first); | 1020 | first = be32_to_cpu(sb->s_first); |
1189 | last = be32_to_cpu(sb->s_maxlen); | 1021 | last = be32_to_cpu(sb->s_maxlen); |
1022 | if (first + JBD2_MIN_JOURNAL_BLOCKS > last + 1) { | ||
1023 | printk(KERN_ERR "JBD: Journal too short (blocks %llu-%llu).\n", | ||
1024 | first, last); | ||
1025 | journal_fail_superblock(journal); | ||
1026 | return -EINVAL; | ||
1027 | } | ||
1190 | 1028 | ||
1191 | journal->j_first = first; | 1029 | journal->j_first = first; |
1192 | journal->j_last = last; | 1030 | journal->j_last = last; |
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index 6213ac728f30..a0512700542f 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
@@ -57,7 +57,7 @@ jbd2_get_transaction(journal_t *journal, transaction_t *transaction) | |||
57 | INIT_LIST_HEAD(&transaction->t_private_list); | 57 | INIT_LIST_HEAD(&transaction->t_private_list); |
58 | 58 | ||
59 | /* Set up the commit timer for the new transaction. */ | 59 | /* Set up the commit timer for the new transaction. */ |
60 | journal->j_commit_timer.expires = round_jiffies(transaction->t_expires); | 60 | journal->j_commit_timer.expires = round_jiffies_up(transaction->t_expires); |
61 | add_timer(&journal->j_commit_timer); | 61 | add_timer(&journal->j_commit_timer); |
62 | 62 | ||
63 | J_ASSERT(journal->j_running_transaction == NULL); | 63 | J_ASSERT(journal->j_running_transaction == NULL); |
@@ -238,6 +238,8 @@ repeat_locked: | |||
238 | __jbd2_log_space_left(journal)); | 238 | __jbd2_log_space_left(journal)); |
239 | spin_unlock(&transaction->t_handle_lock); | 239 | spin_unlock(&transaction->t_handle_lock); |
240 | spin_unlock(&journal->j_state_lock); | 240 | spin_unlock(&journal->j_state_lock); |
241 | |||
242 | lock_map_acquire(&handle->h_lockdep_map); | ||
241 | out: | 243 | out: |
242 | if (unlikely(new_transaction)) /* It's usually NULL */ | 244 | if (unlikely(new_transaction)) /* It's usually NULL */ |
243 | kfree(new_transaction); | 245 | kfree(new_transaction); |
@@ -303,8 +305,6 @@ handle_t *jbd2_journal_start(journal_t *journal, int nblocks) | |||
303 | handle = ERR_PTR(err); | 305 | handle = ERR_PTR(err); |
304 | goto out; | 306 | goto out; |
305 | } | 307 | } |
306 | |||
307 | lock_map_acquire(&handle->h_lockdep_map); | ||
308 | out: | 308 | out: |
309 | return handle; | 309 | return handle; |
310 | } | 310 | } |
@@ -426,6 +426,7 @@ int jbd2_journal_restart(handle_t *handle, int nblocks) | |||
426 | __jbd2_log_start_commit(journal, transaction->t_tid); | 426 | __jbd2_log_start_commit(journal, transaction->t_tid); |
427 | spin_unlock(&journal->j_state_lock); | 427 | spin_unlock(&journal->j_state_lock); |
428 | 428 | ||
429 | lock_map_release(&handle->h_lockdep_map); | ||
429 | handle->h_buffer_credits = nblocks; | 430 | handle->h_buffer_credits = nblocks; |
430 | ret = start_this_handle(journal, handle); | 431 | ret = start_this_handle(journal, handle); |
431 | return ret; | 432 | return ret; |