1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <linux/time.h>
17#include <linux/fs.h>
18#include <linux/jbd2.h>
19#include <linux/errno.h>
20#include <linux/slab.h>
21#include <linux/mm.h>
22#include <linux/pagemap.h>
23#include <linux/jiffies.h>
24#include <linux/crc32.h>
25#include <linux/writeback.h>
26#include <linux/backing-dev.h>
27#include <linux/bio.h>
28#include <linux/blkdev.h>
29#include <linux/bitops.h>
30#include <trace/events/jbd2.h>
31
32
33
34
35static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
36{
37 struct buffer_head *orig_bh = bh->b_private;
38
39 BUFFER_TRACE(bh, "");
40 if (uptodate)
41 set_buffer_uptodate(bh);
42 else
43 clear_buffer_uptodate(bh);
44 if (orig_bh) {
45 clear_bit_unlock(BH_Shadow, &orig_bh->b_state);
46 smp_mb__after_clear_bit();
47 wake_up_bit(&orig_bh->b_state, BH_Shadow);
48 }
49 unlock_buffer(bh);
50}
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66static void release_buffer_page(struct buffer_head *bh)
67{
68 struct page *page;
69
70 if (buffer_dirty(bh))
71 goto nope;
72 if (atomic_read(&bh->b_count) != 1)
73 goto nope;
74 page = bh->b_page;
75 if (!page)
76 goto nope;
77 if (page->mapping)
78 goto nope;
79
80
81 if (!trylock_page(page))
82 goto nope;
83
84 page_cache_get(page);
85 __brelse(bh);
86 try_to_free_buffers(page);
87 unlock_page(page);
88 page_cache_release(page);
89 return;
90
91nope:
92 __brelse(bh);
93}
94
95static void jbd2_commit_block_csum_set(journal_t *j, struct buffer_head *bh)
96{
97 struct commit_header *h;
98 __u32 csum;
99
100 if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
101 return;
102
103 h = (struct commit_header *)(bh->b_data);
104 h->h_chksum_type = 0;
105 h->h_chksum_size = 0;
106 h->h_chksum[0] = 0;
107 csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
108 h->h_chksum[0] = cpu_to_be32(csum);
109}
110
111
112
113
114
115
116
117
118
119static int journal_submit_commit_record(journal_t *journal,
120 transaction_t *commit_transaction,
121 struct buffer_head **cbh,
122 __u32 crc32_sum)
123{
124 struct commit_header *tmp;
125 struct buffer_head *bh;
126 int ret;
127 struct timespec now = current_kernel_time();
128
129 *cbh = NULL;
130
131 if (is_journal_aborted(journal))
132 return 0;
133
134 bh = jbd2_journal_get_descriptor_buffer(journal);
135 if (!bh)
136 return 1;
137
138 tmp = (struct commit_header *)bh->b_data;
139 tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
140 tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK);
141 tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid);
142 tmp->h_commit_sec = cpu_to_be64(now.tv_sec);
143 tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec);
144
145 if (JBD2_HAS_COMPAT_FEATURE(journal,
146 JBD2_FEATURE_COMPAT_CHECKSUM)) {
147 tmp->h_chksum_type = JBD2_CRC32_CHKSUM;
148 tmp->h_chksum_size = JBD2_CRC32_CHKSUM_SIZE;
149 tmp->h_chksum[0] = cpu_to_be32(crc32_sum);
150 }
151 jbd2_commit_block_csum_set(journal, bh);
152
153 BUFFER_TRACE(bh, "submit commit block");
154 lock_buffer(bh);
155 clear_buffer_dirty(bh);
156 set_buffer_uptodate(bh);
157 bh->b_end_io = journal_end_buffer_io_sync;
158
159 if (journal->j_flags & JBD2_BARRIER &&
160 !JBD2_HAS_INCOMPAT_FEATURE(journal,
161 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT))
162 ret = submit_bh(WRITE_SYNC | WRITE_FLUSH_FUA, bh);
163 else
164 ret = submit_bh(WRITE_SYNC, bh);
165
166 *cbh = bh;
167 return ret;
168}
169
170
171
172
173
174static int journal_wait_on_commit_record(journal_t *journal,
175 struct buffer_head *bh)
176{
177 int ret = 0;
178
179 clear_buffer_dirty(bh);
180 wait_on_buffer(bh);
181
182 if (unlikely(!buffer_uptodate(bh)))
183 ret = -EIO;
184 put_bh(bh);
185
186 return ret;
187}
188
189
190
191
192
193
194
195static int journal_submit_inode_data_buffers(struct address_space *mapping)
196{
197 int ret;
198 struct writeback_control wbc = {
199 .sync_mode = WB_SYNC_ALL,
200 .nr_to_write = mapping->nrpages * 2,
201 .range_start = 0,
202 .range_end = i_size_read(mapping->host),
203 };
204
205 ret = generic_writepages(mapping, &wbc);
206 return ret;
207}
208
209
210
211
212
213
214
215
216
217static int journal_submit_data_buffers(journal_t *journal,
218 transaction_t *commit_transaction)
219{
220 struct jbd2_inode *jinode;
221 int err, ret = 0;
222 struct address_space *mapping;
223
224 spin_lock(&journal->j_list_lock);
225 list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
226 mapping = jinode->i_vfs_inode->i_mapping;
227 set_bit(__JI_COMMIT_RUNNING, &jinode->i_flags);
228 spin_unlock(&journal->j_list_lock);
229
230
231
232
233
234
235 trace_jbd2_submit_inode_data(jinode->i_vfs_inode);
236 err = journal_submit_inode_data_buffers(mapping);
237 if (!ret)
238 ret = err;
239 spin_lock(&journal->j_list_lock);
240 J_ASSERT(jinode->i_transaction == commit_transaction);
241 clear_bit(__JI_COMMIT_RUNNING, &jinode->i_flags);
242 smp_mb__after_clear_bit();
243 wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
244 }
245 spin_unlock(&journal->j_list_lock);
246 return ret;
247}
248
249
250
251
252
253
254static int journal_finish_inode_data_buffers(journal_t *journal,
255 transaction_t *commit_transaction)
256{
257 struct jbd2_inode *jinode, *next_i;
258 int err, ret = 0;
259
260
261 spin_lock(&journal->j_list_lock);
262 list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
263 set_bit(__JI_COMMIT_RUNNING, &jinode->i_flags);
264 spin_unlock(&journal->j_list_lock);
265 err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping);
266 if (err) {
267
268
269
270
271
272 set_bit(AS_EIO,
273 &jinode->i_vfs_inode->i_mapping->flags);
274
275 if (!ret)
276 ret = err;
277 }
278 spin_lock(&journal->j_list_lock);
279 clear_bit(__JI_COMMIT_RUNNING, &jinode->i_flags);
280 smp_mb__after_clear_bit();
281 wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
282 }
283
284
285 list_for_each_entry_safe(jinode, next_i,
286 &commit_transaction->t_inode_list, i_list) {
287 list_del(&jinode->i_list);
288 if (jinode->i_next_transaction) {
289 jinode->i_transaction = jinode->i_next_transaction;
290 jinode->i_next_transaction = NULL;
291 list_add(&jinode->i_list,
292 &jinode->i_transaction->t_inode_list);
293 } else {
294 jinode->i_transaction = NULL;
295 }
296 }
297 spin_unlock(&journal->j_list_lock);
298
299 return ret;
300}
301
302static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
303{
304 struct page *page = bh->b_page;
305 char *addr;
306 __u32 checksum;
307
308 addr = kmap_atomic(page);
309 checksum = crc32_be(crc32_sum,
310 (void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
311 kunmap_atomic(addr);
312
313 return checksum;
314}
315
316static void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
317 unsigned long long block)
318{
319 tag->t_blocknr = cpu_to_be32(block & (u32)~0);
320 if (tag_bytes > JBD2_TAG_SIZE32)
321 tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
322}
323
324static void jbd2_descr_block_csum_set(journal_t *j,
325 struct buffer_head *bh)
326{
327 struct jbd2_journal_block_tail *tail;
328 __u32 csum;
329
330 if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
331 return;
332
333 tail = (struct jbd2_journal_block_tail *)(bh->b_data + j->j_blocksize -
334 sizeof(struct jbd2_journal_block_tail));
335 tail->t_checksum = 0;
336 csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
337 tail->t_checksum = cpu_to_be32(csum);
338}
339
340static void jbd2_block_tag_csum_set(journal_t *j, journal_block_tag_t *tag,
341 struct buffer_head *bh, __u32 sequence)
342{
343 struct page *page = bh->b_page;
344 __u8 *addr;
345 __u32 csum32;
346 __be32 seq;
347
348 if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
349 return;
350
351 seq = cpu_to_be32(sequence);
352 addr = kmap_atomic(page);
353 csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&seq, sizeof(seq));
354 csum32 = jbd2_chksum(j, csum32, addr + offset_in_page(bh->b_data),
355 bh->b_size);
356 kunmap_atomic(addr);
357
358
359 tag->t_checksum = cpu_to_be16(csum32);
360}
361
362
363
364
365
366
367void jbd2_journal_commit_transaction(journal_t *journal)
368{
369 struct transaction_stats_s stats;
370 transaction_t *commit_transaction;
371 struct journal_head *jh;
372 struct buffer_head *descriptor;
373 struct buffer_head **wbuf = journal->j_wbuf;
374 int bufs;
375 int flags;
376 int err;
377 unsigned long long blocknr;
378 ktime_t start_time;
379 u64 commit_time;
380 char *tagp = NULL;
381 journal_header_t *header;
382 journal_block_tag_t *tag = NULL;
383 int space_left = 0;
384 int first_tag = 0;
385 int tag_flag;
386 int i;
387 int tag_bytes = journal_tag_bytes(journal);
388 struct buffer_head *cbh = NULL;
389 __u32 crc32_sum = ~0;
390 struct blk_plug plug;
391
392 unsigned long first_block;
393 tid_t first_tid;
394 int update_tail;
395 int csum_size = 0;
396 LIST_HEAD(io_bufs);
397 LIST_HEAD(log_bufs);
398
399 if (JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V2))
400 csum_size = sizeof(struct jbd2_journal_block_tail);
401
402
403
404
405
406
407
408 if (journal->j_flags & JBD2_FLUSHED) {
409 jbd_debug(3, "super block updated\n");
410 mutex_lock(&journal->j_checkpoint_mutex);
411
412
413
414
415
416
417 jbd2_journal_update_sb_log_tail(journal,
418 journal->j_tail_sequence,
419 journal->j_tail,
420 WRITE_SYNC);
421 mutex_unlock(&journal->j_checkpoint_mutex);
422 } else {
423 jbd_debug(3, "superblock not updated\n");
424 }
425
426 J_ASSERT(journal->j_running_transaction != NULL);
427 J_ASSERT(journal->j_committing_transaction == NULL);
428
429 commit_transaction = journal->j_running_transaction;
430
431 trace_jbd2_start_commit(journal, commit_transaction);
432 jbd_debug(1, "JBD2: starting commit of transaction %d\n",
433 commit_transaction->t_tid);
434
435 write_lock(&journal->j_state_lock);
436 J_ASSERT(commit_transaction->t_state == T_RUNNING);
437 commit_transaction->t_state = T_LOCKED;
438
439 trace_jbd2_commit_locking(journal, commit_transaction);
440 stats.run.rs_wait = commit_transaction->t_max_wait;
441 stats.run.rs_request_delay = 0;
442 stats.run.rs_locked = jiffies;
443 if (commit_transaction->t_requested)
444 stats.run.rs_request_delay =
445 jbd2_time_diff(commit_transaction->t_requested,
446 stats.run.rs_locked);
447 stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
448 stats.run.rs_locked);
449
450 spin_lock(&commit_transaction->t_handle_lock);
451 while (atomic_read(&commit_transaction->t_updates)) {
452 DEFINE_WAIT(wait);
453
454 prepare_to_wait(&journal->j_wait_updates, &wait,
455 TASK_UNINTERRUPTIBLE);
456 if (atomic_read(&commit_transaction->t_updates)) {
457 spin_unlock(&commit_transaction->t_handle_lock);
458 write_unlock(&journal->j_state_lock);
459 schedule();
460 write_lock(&journal->j_state_lock);
461 spin_lock(&commit_transaction->t_handle_lock);
462 }
463 finish_wait(&journal->j_wait_updates, &wait);
464 }
465 spin_unlock(&commit_transaction->t_handle_lock);
466
467 J_ASSERT (atomic_read(&commit_transaction->t_outstanding_credits) <=
468 journal->j_max_transaction_buffers);
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486 while (commit_transaction->t_reserved_list) {
487 jh = commit_transaction->t_reserved_list;
488 JBUFFER_TRACE(jh, "reserved, unused: refile");
489
490
491
492
493 if (jh->b_committed_data) {
494 struct buffer_head *bh = jh2bh(jh);
495
496 jbd_lock_bh_state(bh);
497 jbd2_free(jh->b_committed_data, bh->b_size);
498 jh->b_committed_data = NULL;
499 jbd_unlock_bh_state(bh);
500 }
501 jbd2_journal_refile_buffer(journal, jh);
502 }
503
504
505
506
507
508
509 spin_lock(&journal->j_list_lock);
510 __jbd2_journal_clean_checkpoint_list(journal);
511 spin_unlock(&journal->j_list_lock);
512
513 jbd_debug(3, "JBD2: commit phase 1\n");
514
515
516
517
518
519 jbd2_clear_buffer_revoked_flags(journal);
520
521
522
523
524 jbd2_journal_switch_revoke_table(journal);
525
526
527
528
529 atomic_sub(atomic_read(&journal->j_reserved_credits),
530 &commit_transaction->t_outstanding_credits);
531
532 trace_jbd2_commit_flushing(journal, commit_transaction);
533 stats.run.rs_flushing = jiffies;
534 stats.run.rs_locked = jbd2_time_diff(stats.run.rs_locked,
535 stats.run.rs_flushing);
536
537 commit_transaction->t_state = T_FLUSH;
538 journal->j_committing_transaction = commit_transaction;
539 journal->j_running_transaction = NULL;
540 start_time = ktime_get();
541 commit_transaction->t_log_start = journal->j_head;
542 wake_up(&journal->j_wait_transaction_locked);
543 write_unlock(&journal->j_state_lock);
544
545 jbd_debug(3, "JBD2: commit phase 2a\n");
546
547
548
549
550
551 err = journal_submit_data_buffers(journal, commit_transaction);
552 if (err)
553 jbd2_journal_abort(journal, err);
554
555 blk_start_plug(&plug);
556 jbd2_journal_write_revoke_records(journal, commit_transaction,
557 &log_bufs, WRITE_SYNC);
558 blk_finish_plug(&plug);
559
560 jbd_debug(3, "JBD2: commit phase 2b\n");
561
562
563
564
565
566
567 write_lock(&journal->j_state_lock);
568 commit_transaction->t_state = T_COMMIT;
569 write_unlock(&journal->j_state_lock);
570
571 trace_jbd2_commit_logging(journal, commit_transaction);
572 stats.run.rs_logging = jiffies;
573 stats.run.rs_flushing = jbd2_time_diff(stats.run.rs_flushing,
574 stats.run.rs_logging);
575 stats.run.rs_blocks =
576 atomic_read(&commit_transaction->t_outstanding_credits);
577 stats.run.rs_blocks_logged = 0;
578
579 J_ASSERT(commit_transaction->t_nr_buffers <=
580 atomic_read(&commit_transaction->t_outstanding_credits));
581
582 err = 0;
583 bufs = 0;
584 descriptor = NULL;
585 blk_start_plug(&plug);
586 while (commit_transaction->t_buffers) {
587
588
589
590 jh = commit_transaction->t_buffers;
591
592
593
594
595 if (is_journal_aborted(journal)) {
596 clear_buffer_jbddirty(jh2bh(jh));
597 JBUFFER_TRACE(jh, "journal is aborting: refile");
598 jbd2_buffer_abort_trigger(jh,
599 jh->b_frozen_data ?
600 jh->b_frozen_triggers :
601 jh->b_triggers);
602 jbd2_journal_refile_buffer(journal, jh);
603
604
605
606
607 if (!commit_transaction->t_buffers)
608 goto start_journal_io;
609 continue;
610 }
611
612
613
614
615 if (!descriptor) {
616 J_ASSERT (bufs == 0);
617
618 jbd_debug(4, "JBD2: get descriptor\n");
619
620 descriptor = jbd2_journal_get_descriptor_buffer(journal);
621 if (!descriptor) {
622 jbd2_journal_abort(journal, -EIO);
623 continue;
624 }
625
626 jbd_debug(4, "JBD2: got buffer %llu (%p)\n",
627 (unsigned long long)descriptor->b_blocknr,
628 descriptor->b_data);
629 header = (journal_header_t *)descriptor->b_data;
630 header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
631 header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
632 header->h_sequence = cpu_to_be32(commit_transaction->t_tid);
633
634 tagp = &descriptor->b_data[sizeof(journal_header_t)];
635 space_left = descriptor->b_size -
636 sizeof(journal_header_t);
637 first_tag = 1;
638 set_buffer_jwrite(descriptor);
639 set_buffer_dirty(descriptor);
640 wbuf[bufs++] = descriptor;
641
642
643
644 BUFFER_TRACE(descriptor, "ph3: file as descriptor");
645 jbd2_file_log_bh(&log_bufs, descriptor);
646 }
647
648
649
650 err = jbd2_journal_next_log_block(journal, &blocknr);
651
652
653
654 if (err) {
655 jbd2_journal_abort(journal, err);
656 continue;
657 }
658
659
660
661
662
663
664 atomic_dec(&commit_transaction->t_outstanding_credits);
665
666
667
668
669 atomic_inc(&jh2bh(jh)->b_count);
670
671
672
673
674
675 set_bit(BH_JWrite, &jh2bh(jh)->b_state);
676 JBUFFER_TRACE(jh, "ph3: write metadata");
677 flags = jbd2_journal_write_metadata_buffer(commit_transaction,
678 jh, &wbuf[bufs], blocknr);
679 if (flags < 0) {
680 jbd2_journal_abort(journal, flags);
681 continue;
682 }
683 jbd2_file_log_bh(&io_bufs, wbuf[bufs]);
684
685
686
687
688 tag_flag = 0;
689 if (flags & 1)
690 tag_flag |= JBD2_FLAG_ESCAPE;
691 if (!first_tag)
692 tag_flag |= JBD2_FLAG_SAME_UUID;
693
694 tag = (journal_block_tag_t *) tagp;
695 write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
696 tag->t_flags = cpu_to_be16(tag_flag);
697 jbd2_block_tag_csum_set(journal, tag, wbuf[bufs],
698 commit_transaction->t_tid);
699 tagp += tag_bytes;
700 space_left -= tag_bytes;
701 bufs++;
702
703 if (first_tag) {
704 memcpy (tagp, journal->j_uuid, 16);
705 tagp += 16;
706 space_left -= 16;
707 first_tag = 0;
708 }
709
710
711
712
713 if (bufs == journal->j_wbufsize ||
714 commit_transaction->t_buffers == NULL ||
715 space_left < tag_bytes + 16 + csum_size) {
716
717 jbd_debug(4, "JBD2: Submit %d IOs\n", bufs);
718
719
720
721
722
723 tag->t_flags |= cpu_to_be16(JBD2_FLAG_LAST_TAG);
724
725 jbd2_descr_block_csum_set(journal, descriptor);
726start_journal_io:
727 for (i = 0; i < bufs; i++) {
728 struct buffer_head *bh = wbuf[i];
729
730
731
732 if (JBD2_HAS_COMPAT_FEATURE(journal,
733 JBD2_FEATURE_COMPAT_CHECKSUM)) {
734 crc32_sum =
735 jbd2_checksum_data(crc32_sum, bh);
736 }
737
738 lock_buffer(bh);
739 clear_buffer_dirty(bh);
740 set_buffer_uptodate(bh);
741 bh->b_end_io = journal_end_buffer_io_sync;
742 submit_bh(WRITE_SYNC, bh);
743 }
744 cond_resched();
745 stats.run.rs_blocks_logged += bufs;
746
747
748
749 descriptor = NULL;
750 bufs = 0;
751 }
752 }
753
754 err = journal_finish_inode_data_buffers(journal, commit_transaction);
755 if (err) {
756 printk(KERN_WARNING
757 "JBD2: Detected IO errors while flushing file data "
758 "on %s\n", journal->j_devname);
759 if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR)
760 jbd2_journal_abort(journal, err);
761 err = 0;
762 }
763
764
765
766
767
768
769
770
771 update_tail =
772 jbd2_journal_get_log_tail(journal, &first_tid, &first_block);
773
774 write_lock(&journal->j_state_lock);
775 if (update_tail) {
776 long freed = first_block - journal->j_tail;
777
778 if (first_block < journal->j_tail)
779 freed += journal->j_last - journal->j_first;
780
781 if (freed < journal->j_maxlen / 4)
782 update_tail = 0;
783 }
784 J_ASSERT(commit_transaction->t_state == T_COMMIT);
785 commit_transaction->t_state = T_COMMIT_DFLUSH;
786 write_unlock(&journal->j_state_lock);
787
788
789
790
791
792
793 if (commit_transaction->t_need_data_flush &&
794 (journal->j_fs_dev != journal->j_dev) &&
795 (journal->j_flags & JBD2_BARRIER))
796 blkdev_issue_flush(journal->j_fs_dev, GFP_NOFS, NULL);
797
798
799 if (JBD2_HAS_INCOMPAT_FEATURE(journal,
800 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
801 err = journal_submit_commit_record(journal, commit_transaction,
802 &cbh, crc32_sum);
803 if (err)
804 __jbd2_journal_abort_hard(journal);
805 }
806
807 blk_finish_plug(&plug);
808
809
810
811
812
813
814
815
816
817
818
819
820 jbd_debug(3, "JBD2: commit phase 3\n");
821
822 while (!list_empty(&io_bufs)) {
823 struct buffer_head *bh = list_entry(io_bufs.prev,
824 struct buffer_head,
825 b_assoc_buffers);
826
827 wait_on_buffer(bh);
828 cond_resched();
829
830 if (unlikely(!buffer_uptodate(bh)))
831 err = -EIO;
832 jbd2_unfile_log_bh(bh);
833
834
835
836
837
838 BUFFER_TRACE(bh, "dumping temporary bh");
839 __brelse(bh);
840 J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
841 free_buffer_head(bh);
842
843
844 jh = commit_transaction->t_shadow_list->b_tprev;
845 bh = jh2bh(jh);
846 clear_buffer_jwrite(bh);
847 J_ASSERT_BH(bh, buffer_jbddirty(bh));
848 J_ASSERT_BH(bh, !buffer_shadow(bh));
849
850
851
852
853
854 JBUFFER_TRACE(jh, "file as BJ_Forget");
855 jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
856 JBUFFER_TRACE(jh, "brelse shadowed buffer");
857 __brelse(bh);
858 }
859
860 J_ASSERT (commit_transaction->t_shadow_list == NULL);
861
862 jbd_debug(3, "JBD2: commit phase 4\n");
863
864
865 while (!list_empty(&log_bufs)) {
866 struct buffer_head *bh;
867
868 bh = list_entry(log_bufs.prev, struct buffer_head, b_assoc_buffers);
869 wait_on_buffer(bh);
870 cond_resched();
871
872 if (unlikely(!buffer_uptodate(bh)))
873 err = -EIO;
874
875 BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
876 clear_buffer_jwrite(bh);
877 jbd2_unfile_log_bh(bh);
878 __brelse(bh);
879
880 }
881
882 if (err)
883 jbd2_journal_abort(journal, err);
884
885 jbd_debug(3, "JBD2: commit phase 5\n");
886 write_lock(&journal->j_state_lock);
887 J_ASSERT(commit_transaction->t_state == T_COMMIT_DFLUSH);
888 commit_transaction->t_state = T_COMMIT_JFLUSH;
889 write_unlock(&journal->j_state_lock);
890
891 if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
892 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
893 err = journal_submit_commit_record(journal, commit_transaction,
894 &cbh, crc32_sum);
895 if (err)
896 __jbd2_journal_abort_hard(journal);
897 }
898 if (cbh)
899 err = journal_wait_on_commit_record(journal, cbh);
900 if (JBD2_HAS_INCOMPAT_FEATURE(journal,
901 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT) &&
902 journal->j_flags & JBD2_BARRIER) {
903 blkdev_issue_flush(journal->j_dev, GFP_NOFS, NULL);
904 }
905
906 if (err)
907 jbd2_journal_abort(journal, err);
908
909
910
911
912
913
914 if (update_tail)
915 jbd2_update_log_tail(journal, first_tid, first_block);
916
917
918
919
920
921
922 jbd_debug(3, "JBD2: commit phase 6\n");
923
924 J_ASSERT(list_empty(&commit_transaction->t_inode_list));
925 J_ASSERT(commit_transaction->t_buffers == NULL);
926 J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
927 J_ASSERT(commit_transaction->t_shadow_list == NULL);
928
929restart_loop:
930
931
932
933
934 spin_lock(&journal->j_list_lock);
935 while (commit_transaction->t_forget) {
936 transaction_t *cp_transaction;
937 struct buffer_head *bh;
938 int try_to_free = 0;
939
940 jh = commit_transaction->t_forget;
941 spin_unlock(&journal->j_list_lock);
942 bh = jh2bh(jh);
943
944
945
946
947 get_bh(bh);
948 jbd_lock_bh_state(bh);
949 J_ASSERT_JH(jh, jh->b_transaction == commit_transaction);
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964 if (jh->b_committed_data) {
965 jbd2_free(jh->b_committed_data, bh->b_size);
966 jh->b_committed_data = NULL;
967 if (jh->b_frozen_data) {
968 jh->b_committed_data = jh->b_frozen_data;
969 jh->b_frozen_data = NULL;
970 jh->b_frozen_triggers = NULL;
971 }
972 } else if (jh->b_frozen_data) {
973 jbd2_free(jh->b_frozen_data, bh->b_size);
974 jh->b_frozen_data = NULL;
975 jh->b_frozen_triggers = NULL;
976 }
977
978 spin_lock(&journal->j_list_lock);
979 cp_transaction = jh->b_cp_transaction;
980 if (cp_transaction) {
981 JBUFFER_TRACE(jh, "remove from old cp transaction");
982 cp_transaction->t_chp_stats.cs_dropped++;
983 __jbd2_journal_remove_checkpoint(jh);
984 }
985
986
987
988
989
990
991
992
993
994
995
996 if (buffer_freed(bh)) {
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012 jh->b_modified = 0;
1013 if (!jh->b_next_transaction) {
1014 clear_buffer_freed(bh);
1015 clear_buffer_jbddirty(bh);
1016 clear_buffer_mapped(bh);
1017 clear_buffer_new(bh);
1018 clear_buffer_req(bh);
1019 bh->b_bdev = NULL;
1020 }
1021 }
1022
1023 if (buffer_jbddirty(bh)) {
1024 JBUFFER_TRACE(jh, "add to new checkpointing trans");
1025 __jbd2_journal_insert_checkpoint(jh, commit_transaction);
1026 if (is_journal_aborted(journal))
1027 clear_buffer_jbddirty(bh);
1028 } else {
1029 J_ASSERT_BH(bh, !buffer_dirty(bh));
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039 if (!jh->b_next_transaction)
1040 try_to_free = 1;
1041 }
1042 JBUFFER_TRACE(jh, "refile or unfile buffer");
1043 __jbd2_journal_refile_buffer(jh);
1044 jbd_unlock_bh_state(bh);
1045 if (try_to_free)
1046 release_buffer_page(bh);
1047 else
1048 __brelse(bh);
1049 cond_resched_lock(&journal->j_list_lock);
1050 }
1051 spin_unlock(&journal->j_list_lock);
1052
1053
1054
1055
1056
1057
1058 write_lock(&journal->j_state_lock);
1059 spin_lock(&journal->j_list_lock);
1060
1061
1062
1063
1064 if (commit_transaction->t_forget) {
1065 spin_unlock(&journal->j_list_lock);
1066 write_unlock(&journal->j_state_lock);
1067 goto restart_loop;
1068 }
1069
1070
1071
1072 jbd_debug(3, "JBD2: commit phase 7\n");
1073
1074 J_ASSERT(commit_transaction->t_state == T_COMMIT_JFLUSH);
1075
1076 commit_transaction->t_start = jiffies;
1077 stats.run.rs_logging = jbd2_time_diff(stats.run.rs_logging,
1078 commit_transaction->t_start);
1079
1080
1081
1082
1083 stats.ts_tid = commit_transaction->t_tid;
1084 stats.run.rs_handle_count =
1085 atomic_read(&commit_transaction->t_handle_count);
1086 trace_jbd2_run_stats(journal->j_fs_dev->bd_dev,
1087 commit_transaction->t_tid, &stats.run);
1088
1089
1090
1091
1092 spin_lock(&journal->j_history_lock);
1093 journal->j_stats.ts_tid++;
1094 if (commit_transaction->t_requested)
1095 journal->j_stats.ts_requested++;
1096 journal->j_stats.run.rs_wait += stats.run.rs_wait;
1097 journal->j_stats.run.rs_request_delay += stats.run.rs_request_delay;
1098 journal->j_stats.run.rs_running += stats.run.rs_running;
1099 journal->j_stats.run.rs_locked += stats.run.rs_locked;
1100 journal->j_stats.run.rs_flushing += stats.run.rs_flushing;
1101 journal->j_stats.run.rs_logging += stats.run.rs_logging;
1102 journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count;
1103 journal->j_stats.run.rs_blocks += stats.run.rs_blocks;
1104 journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged;
1105 spin_unlock(&journal->j_history_lock);
1106
1107 commit_transaction->t_state = T_COMMIT_CALLBACK;
1108 J_ASSERT(commit_transaction == journal->j_committing_transaction);
1109 journal->j_commit_sequence = commit_transaction->t_tid;
1110 journal->j_committing_transaction = NULL;
1111 commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time));
1112
1113
1114
1115
1116
1117 if (likely(journal->j_average_commit_time))
1118 journal->j_average_commit_time = (commit_time +
1119 journal->j_average_commit_time*3) / 4;
1120 else
1121 journal->j_average_commit_time = commit_time;
1122
1123 write_unlock(&journal->j_state_lock);
1124
1125 if (journal->j_checkpoint_transactions == NULL) {
1126 journal->j_checkpoint_transactions = commit_transaction;
1127 commit_transaction->t_cpnext = commit_transaction;
1128 commit_transaction->t_cpprev = commit_transaction;
1129 } else {
1130 commit_transaction->t_cpnext =
1131 journal->j_checkpoint_transactions;
1132 commit_transaction->t_cpprev =
1133 commit_transaction->t_cpnext->t_cpprev;
1134 commit_transaction->t_cpnext->t_cpprev =
1135 commit_transaction;
1136 commit_transaction->t_cpprev->t_cpnext =
1137 commit_transaction;
1138 }
1139 spin_unlock(&journal->j_list_lock);
1140
1141
1142
1143 if (journal->j_commit_callback)
1144 journal->j_commit_callback(journal, commit_transaction);
1145
1146 trace_jbd2_end_commit(journal, commit_transaction);
1147 jbd_debug(1, "JBD2: commit %d complete, head %d\n",
1148 journal->j_commit_sequence, journal->j_tail_sequence);
1149
1150 write_lock(&journal->j_state_lock);
1151 spin_lock(&journal->j_list_lock);
1152 commit_transaction->t_state = T_FINISHED;
1153
1154 if (commit_transaction->t_checkpoint_list == NULL &&
1155 commit_transaction->t_checkpoint_io_list == NULL) {
1156 __jbd2_journal_drop_transaction(journal, commit_transaction);
1157 jbd2_journal_free_transaction(commit_transaction);
1158 }
1159 spin_unlock(&journal->j_list_lock);
1160 write_unlock(&journal->j_state_lock);
1161 wake_up(&journal->j_wait_done_commit);
1162}
1163