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/jbd.h>
19#include <linux/errno.h>
20#include <linux/mm.h>
21#include <linux/pagemap.h>
22#include <linux/bio.h>
23#include <linux/blkdev.h>
24#include <trace/events/jbd.h>
25
26
27
28
29static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
30{
31 BUFFER_TRACE(bh, "");
32 if (uptodate)
33 set_buffer_uptodate(bh);
34 else
35 clear_buffer_uptodate(bh);
36 unlock_buffer(bh);
37}
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53static void release_buffer_page(struct buffer_head *bh)
54{
55 struct page *page;
56
57 if (buffer_dirty(bh))
58 goto nope;
59 if (atomic_read(&bh->b_count) != 1)
60 goto nope;
61 page = bh->b_page;
62 if (!page)
63 goto nope;
64 if (page->mapping)
65 goto nope;
66
67
68 if (!trylock_page(page))
69 goto nope;
70
71 page_cache_get(page);
72 __brelse(bh);
73 try_to_free_buffers(page);
74 unlock_page(page);
75 page_cache_release(page);
76 return;
77
78nope:
79 __brelse(bh);
80}
81
82
83
84
85
86static void release_data_buffer(struct buffer_head *bh)
87{
88 if (buffer_freed(bh)) {
89 clear_buffer_freed(bh);
90 release_buffer_page(bh);
91 } else
92 put_bh(bh);
93}
94
95
96
97
98
99
100static int inverted_lock(journal_t *journal, struct buffer_head *bh)
101{
102 if (!jbd_trylock_bh_state(bh)) {
103 spin_unlock(&journal->j_list_lock);
104 schedule();
105 return 0;
106 }
107 return 1;
108}
109
110
111
112
113
114
115
116
117static int journal_write_commit_record(journal_t *journal,
118 transaction_t *commit_transaction)
119{
120 struct journal_head *descriptor;
121 struct buffer_head *bh;
122 journal_header_t *header;
123 int ret;
124
125 if (is_journal_aborted(journal))
126 return 0;
127
128 descriptor = journal_get_descriptor_buffer(journal);
129 if (!descriptor)
130 return 1;
131
132 bh = jh2bh(descriptor);
133
134 header = (journal_header_t *)(bh->b_data);
135 header->h_magic = cpu_to_be32(JFS_MAGIC_NUMBER);
136 header->h_blocktype = cpu_to_be32(JFS_COMMIT_BLOCK);
137 header->h_sequence = cpu_to_be32(commit_transaction->t_tid);
138
139 JBUFFER_TRACE(descriptor, "write commit block");
140 set_buffer_dirty(bh);
141
142 if (journal->j_flags & JFS_BARRIER)
143 ret = __sync_dirty_buffer(bh, WRITE_SYNC | WRITE_FLUSH_FUA);
144 else
145 ret = sync_dirty_buffer(bh);
146
147 put_bh(bh);
148 journal_put_journal_head(descriptor);
149
150 return (ret == -EIO);
151}
152
153static void journal_do_submit_data(struct buffer_head **wbuf, int bufs,
154 int write_op)
155{
156 int i;
157
158 for (i = 0; i < bufs; i++) {
159 wbuf[i]->b_end_io = end_buffer_write_sync;
160
161 submit_bh(write_op, wbuf[i]);
162 }
163}
164
165
166
167
168static int journal_submit_data_buffers(journal_t *journal,
169 transaction_t *commit_transaction,
170 int write_op)
171{
172 struct journal_head *jh;
173 struct buffer_head *bh;
174 int locked;
175 int bufs = 0;
176 struct buffer_head **wbuf = journal->j_wbuf;
177 int err = 0;
178
179
180
181
182
183
184
185
186
187write_out_data:
188 cond_resched();
189 spin_lock(&journal->j_list_lock);
190
191 while (commit_transaction->t_sync_datalist) {
192 jh = commit_transaction->t_sync_datalist;
193 bh = jh2bh(jh);
194 locked = 0;
195
196
197
198 get_bh(bh);
199
200
201
202
203
204 if (buffer_dirty(bh)) {
205 if (!trylock_buffer(bh)) {
206 BUFFER_TRACE(bh, "needs blocking lock");
207 spin_unlock(&journal->j_list_lock);
208 trace_jbd_do_submit_data(journal,
209 commit_transaction);
210
211 journal_do_submit_data(wbuf, bufs, write_op);
212 bufs = 0;
213 lock_buffer(bh);
214 spin_lock(&journal->j_list_lock);
215 }
216 locked = 1;
217 }
218
219 if (!inverted_lock(journal, bh)) {
220 jbd_lock_bh_state(bh);
221 spin_lock(&journal->j_list_lock);
222 }
223
224 if (!buffer_jbd(bh) || bh2jh(bh) != jh
225 || jh->b_transaction != commit_transaction
226 || jh->b_jlist != BJ_SyncData) {
227 jbd_unlock_bh_state(bh);
228 if (locked)
229 unlock_buffer(bh);
230 BUFFER_TRACE(bh, "already cleaned up");
231 release_data_buffer(bh);
232 continue;
233 }
234 if (locked && test_clear_buffer_dirty(bh)) {
235 BUFFER_TRACE(bh, "needs writeout, adding to array");
236 wbuf[bufs++] = bh;
237 __journal_file_buffer(jh, commit_transaction,
238 BJ_Locked);
239 jbd_unlock_bh_state(bh);
240 if (bufs == journal->j_wbufsize) {
241 spin_unlock(&journal->j_list_lock);
242 trace_jbd_do_submit_data(journal,
243 commit_transaction);
244 journal_do_submit_data(wbuf, bufs, write_op);
245 bufs = 0;
246 goto write_out_data;
247 }
248 } else if (!locked && buffer_locked(bh)) {
249 __journal_file_buffer(jh, commit_transaction,
250 BJ_Locked);
251 jbd_unlock_bh_state(bh);
252 put_bh(bh);
253 } else {
254 BUFFER_TRACE(bh, "writeout complete: unfile");
255 if (unlikely(!buffer_uptodate(bh)))
256 err = -EIO;
257 __journal_unfile_buffer(jh);
258 jbd_unlock_bh_state(bh);
259 if (locked)
260 unlock_buffer(bh);
261 release_data_buffer(bh);
262 }
263
264 if (need_resched() || spin_needbreak(&journal->j_list_lock)) {
265 spin_unlock(&journal->j_list_lock);
266 goto write_out_data;
267 }
268 }
269 spin_unlock(&journal->j_list_lock);
270 trace_jbd_do_submit_data(journal, commit_transaction);
271 journal_do_submit_data(wbuf, bufs, write_op);
272
273 return err;
274}
275
276
277
278
279
280
281
282void journal_commit_transaction(journal_t *journal)
283{
284 transaction_t *commit_transaction;
285 struct journal_head *jh, *new_jh, *descriptor;
286 struct buffer_head **wbuf = journal->j_wbuf;
287 int bufs;
288 int flags;
289 int err;
290 unsigned int blocknr;
291 ktime_t start_time;
292 u64 commit_time;
293 char *tagp = NULL;
294 journal_header_t *header;
295 journal_block_tag_t *tag = NULL;
296 int space_left = 0;
297 int first_tag = 0;
298 int tag_flag;
299 int i;
300 struct blk_plug plug;
301
302
303
304
305
306
307
308 if (journal->j_flags & JFS_FLUSHED) {
309 jbd_debug(3, "super block updated\n");
310 journal_update_superblock(journal, 1);
311 } else {
312 jbd_debug(3, "superblock not updated\n");
313 }
314
315 J_ASSERT(journal->j_running_transaction != NULL);
316 J_ASSERT(journal->j_committing_transaction == NULL);
317
318 commit_transaction = journal->j_running_transaction;
319 J_ASSERT(commit_transaction->t_state == T_RUNNING);
320
321 trace_jbd_start_commit(journal, commit_transaction);
322 jbd_debug(1, "JBD: starting commit of transaction %d\n",
323 commit_transaction->t_tid);
324
325 spin_lock(&journal->j_state_lock);
326 commit_transaction->t_state = T_LOCKED;
327
328 trace_jbd_commit_locking(journal, commit_transaction);
329 spin_lock(&commit_transaction->t_handle_lock);
330 while (commit_transaction->t_updates) {
331 DEFINE_WAIT(wait);
332
333 prepare_to_wait(&journal->j_wait_updates, &wait,
334 TASK_UNINTERRUPTIBLE);
335 if (commit_transaction->t_updates) {
336 spin_unlock(&commit_transaction->t_handle_lock);
337 spin_unlock(&journal->j_state_lock);
338 schedule();
339 spin_lock(&journal->j_state_lock);
340 spin_lock(&commit_transaction->t_handle_lock);
341 }
342 finish_wait(&journal->j_wait_updates, &wait);
343 }
344 spin_unlock(&commit_transaction->t_handle_lock);
345
346 J_ASSERT (commit_transaction->t_outstanding_credits <=
347 journal->j_max_transaction_buffers);
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365 while (commit_transaction->t_reserved_list) {
366 jh = commit_transaction->t_reserved_list;
367 JBUFFER_TRACE(jh, "reserved, unused: refile");
368
369
370
371
372 if (jh->b_committed_data) {
373 struct buffer_head *bh = jh2bh(jh);
374
375 jbd_lock_bh_state(bh);
376 jbd_free(jh->b_committed_data, bh->b_size);
377 jh->b_committed_data = NULL;
378 jbd_unlock_bh_state(bh);
379 }
380 journal_refile_buffer(journal, jh);
381 }
382
383
384
385
386
387
388 spin_lock(&journal->j_list_lock);
389 __journal_clean_checkpoint_list(journal);
390 spin_unlock(&journal->j_list_lock);
391
392 jbd_debug (3, "JBD: commit phase 1\n");
393
394
395
396
397
398 journal_clear_buffer_revoked_flags(journal);
399
400
401
402
403 journal_switch_revoke_table(journal);
404
405 trace_jbd_commit_flushing(journal, commit_transaction);
406 commit_transaction->t_state = T_FLUSH;
407 journal->j_committing_transaction = commit_transaction;
408 journal->j_running_transaction = NULL;
409 start_time = ktime_get();
410 commit_transaction->t_log_start = journal->j_head;
411 wake_up(&journal->j_wait_transaction_locked);
412 spin_unlock(&journal->j_state_lock);
413
414 jbd_debug (3, "JBD: commit phase 2\n");
415
416
417
418
419
420 blk_start_plug(&plug);
421 err = journal_submit_data_buffers(journal, commit_transaction,
422 WRITE_SYNC);
423 blk_finish_plug(&plug);
424
425
426
427
428 spin_lock(&journal->j_list_lock);
429 while (commit_transaction->t_locked_list) {
430 struct buffer_head *bh;
431
432 jh = commit_transaction->t_locked_list->b_tprev;
433 bh = jh2bh(jh);
434 get_bh(bh);
435 if (buffer_locked(bh)) {
436 spin_unlock(&journal->j_list_lock);
437 wait_on_buffer(bh);
438 spin_lock(&journal->j_list_lock);
439 }
440 if (unlikely(!buffer_uptodate(bh))) {
441 if (!trylock_page(bh->b_page)) {
442 spin_unlock(&journal->j_list_lock);
443 lock_page(bh->b_page);
444 spin_lock(&journal->j_list_lock);
445 }
446 if (bh->b_page->mapping)
447 set_bit(AS_EIO, &bh->b_page->mapping->flags);
448
449 unlock_page(bh->b_page);
450 SetPageError(bh->b_page);
451 err = -EIO;
452 }
453 if (!inverted_lock(journal, bh)) {
454 put_bh(bh);
455 spin_lock(&journal->j_list_lock);
456 continue;
457 }
458 if (buffer_jbd(bh) && bh2jh(bh) == jh &&
459 jh->b_transaction == commit_transaction &&
460 jh->b_jlist == BJ_Locked)
461 __journal_unfile_buffer(jh);
462 jbd_unlock_bh_state(bh);
463 release_data_buffer(bh);
464 cond_resched_lock(&journal->j_list_lock);
465 }
466 spin_unlock(&journal->j_list_lock);
467
468 if (err) {
469 char b[BDEVNAME_SIZE];
470
471 printk(KERN_WARNING
472 "JBD: Detected IO errors while flushing file data "
473 "on %s\n", bdevname(journal->j_fs_dev, b));
474 if (journal->j_flags & JFS_ABORT_ON_SYNCDATA_ERR)
475 journal_abort(journal, err);
476 err = 0;
477 }
478
479 blk_start_plug(&plug);
480
481 journal_write_revoke_records(journal, commit_transaction, WRITE_SYNC);
482
483
484
485
486
487
488
489 J_ASSERT (commit_transaction->t_sync_datalist == NULL);
490
491 jbd_debug (3, "JBD: commit phase 3\n");
492
493
494
495
496
497
498 spin_lock(&journal->j_state_lock);
499 commit_transaction->t_state = T_COMMIT;
500 spin_unlock(&journal->j_state_lock);
501
502 trace_jbd_commit_logging(journal, commit_transaction);
503 J_ASSERT(commit_transaction->t_nr_buffers <=
504 commit_transaction->t_outstanding_credits);
505
506 descriptor = NULL;
507 bufs = 0;
508 while (commit_transaction->t_buffers) {
509
510
511
512 jh = commit_transaction->t_buffers;
513
514
515
516
517 if (is_journal_aborted(journal)) {
518 clear_buffer_jbddirty(jh2bh(jh));
519 JBUFFER_TRACE(jh, "journal is aborting: refile");
520 journal_refile_buffer(journal, jh);
521
522
523
524
525 if (!commit_transaction->t_buffers)
526 goto start_journal_io;
527 continue;
528 }
529
530
531
532
533 if (!descriptor) {
534 struct buffer_head *bh;
535
536 J_ASSERT (bufs == 0);
537
538 jbd_debug(4, "JBD: get descriptor\n");
539
540 descriptor = journal_get_descriptor_buffer(journal);
541 if (!descriptor) {
542 journal_abort(journal, -EIO);
543 continue;
544 }
545
546 bh = jh2bh(descriptor);
547 jbd_debug(4, "JBD: got buffer %llu (%p)\n",
548 (unsigned long long)bh->b_blocknr, bh->b_data);
549 header = (journal_header_t *)&bh->b_data[0];
550 header->h_magic = cpu_to_be32(JFS_MAGIC_NUMBER);
551 header->h_blocktype = cpu_to_be32(JFS_DESCRIPTOR_BLOCK);
552 header->h_sequence = cpu_to_be32(commit_transaction->t_tid);
553
554 tagp = &bh->b_data[sizeof(journal_header_t)];
555 space_left = bh->b_size - sizeof(journal_header_t);
556 first_tag = 1;
557 set_buffer_jwrite(bh);
558 set_buffer_dirty(bh);
559 wbuf[bufs++] = bh;
560
561
562
563 BUFFER_TRACE(bh, "ph3: file as descriptor");
564 journal_file_buffer(descriptor, commit_transaction,
565 BJ_LogCtl);
566 }
567
568
569
570 err = journal_next_log_block(journal, &blocknr);
571
572
573
574 if (err) {
575 journal_abort(journal, err);
576 continue;
577 }
578
579
580
581
582
583
584 commit_transaction->t_outstanding_credits--;
585
586
587
588
589 get_bh(jh2bh(jh));
590
591
592
593
594
595 set_buffer_jwrite(jh2bh(jh));
596
597
598
599
600
601
602 JBUFFER_TRACE(jh, "ph3: write metadata");
603 flags = journal_write_metadata_buffer(commit_transaction,
604 jh, &new_jh, blocknr);
605 set_buffer_jwrite(jh2bh(new_jh));
606 wbuf[bufs++] = jh2bh(new_jh);
607
608
609
610
611 tag_flag = 0;
612 if (flags & 1)
613 tag_flag |= JFS_FLAG_ESCAPE;
614 if (!first_tag)
615 tag_flag |= JFS_FLAG_SAME_UUID;
616
617 tag = (journal_block_tag_t *) tagp;
618 tag->t_blocknr = cpu_to_be32(jh2bh(jh)->b_blocknr);
619 tag->t_flags = cpu_to_be32(tag_flag);
620 tagp += sizeof(journal_block_tag_t);
621 space_left -= sizeof(journal_block_tag_t);
622
623 if (first_tag) {
624 memcpy (tagp, journal->j_uuid, 16);
625 tagp += 16;
626 space_left -= 16;
627 first_tag = 0;
628 }
629
630
631
632
633 if (bufs == journal->j_wbufsize ||
634 commit_transaction->t_buffers == NULL ||
635 space_left < sizeof(journal_block_tag_t) + 16) {
636
637 jbd_debug(4, "JBD: Submit %d IOs\n", bufs);
638
639
640
641
642
643 tag->t_flags |= cpu_to_be32(JFS_FLAG_LAST_TAG);
644
645start_journal_io:
646 for (i = 0; i < bufs; i++) {
647 struct buffer_head *bh = wbuf[i];
648 lock_buffer(bh);
649 clear_buffer_dirty(bh);
650 set_buffer_uptodate(bh);
651 bh->b_end_io = journal_end_buffer_io_sync;
652 submit_bh(WRITE_SYNC, bh);
653 }
654 cond_resched();
655
656
657
658 descriptor = NULL;
659 bufs = 0;
660 }
661 }
662
663 blk_finish_plug(&plug);
664
665
666
667
668
669
670
671
672
673
674
675
676 jbd_debug(3, "JBD: commit phase 4\n");
677
678
679
680
681
682wait_for_iobuf:
683 while (commit_transaction->t_iobuf_list != NULL) {
684 struct buffer_head *bh;
685
686 jh = commit_transaction->t_iobuf_list->b_tprev;
687 bh = jh2bh(jh);
688 if (buffer_locked(bh)) {
689 wait_on_buffer(bh);
690 goto wait_for_iobuf;
691 }
692 if (cond_resched())
693 goto wait_for_iobuf;
694
695 if (unlikely(!buffer_uptodate(bh)))
696 err = -EIO;
697
698 clear_buffer_jwrite(bh);
699
700 JBUFFER_TRACE(jh, "ph4: unfile after journal write");
701 journal_unfile_buffer(journal, jh);
702
703
704
705
706
707 BUFFER_TRACE(bh, "dumping temporary bh");
708 journal_put_journal_head(jh);
709 __brelse(bh);
710 J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
711 free_buffer_head(bh);
712
713
714
715 jh = commit_transaction->t_shadow_list->b_tprev;
716 bh = jh2bh(jh);
717 clear_buffer_jwrite(bh);
718 J_ASSERT_BH(bh, buffer_jbddirty(bh));
719
720
721
722
723
724 JBUFFER_TRACE(jh, "file as BJ_Forget");
725 journal_file_buffer(jh, commit_transaction, BJ_Forget);
726
727
728
729
730
731
732 smp_mb();
733 wake_up_bit(&bh->b_state, BH_Unshadow);
734 JBUFFER_TRACE(jh, "brelse shadowed buffer");
735 __brelse(bh);
736 }
737
738 J_ASSERT (commit_transaction->t_shadow_list == NULL);
739
740 jbd_debug(3, "JBD: commit phase 5\n");
741
742
743 wait_for_ctlbuf:
744 while (commit_transaction->t_log_list != NULL) {
745 struct buffer_head *bh;
746
747 jh = commit_transaction->t_log_list->b_tprev;
748 bh = jh2bh(jh);
749 if (buffer_locked(bh)) {
750 wait_on_buffer(bh);
751 goto wait_for_ctlbuf;
752 }
753 if (cond_resched())
754 goto wait_for_ctlbuf;
755
756 if (unlikely(!buffer_uptodate(bh)))
757 err = -EIO;
758
759 BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
760 clear_buffer_jwrite(bh);
761 journal_unfile_buffer(journal, jh);
762 journal_put_journal_head(jh);
763 __brelse(bh);
764
765 }
766
767 if (err)
768 journal_abort(journal, err);
769
770 jbd_debug(3, "JBD: commit phase 6\n");
771
772
773 spin_lock(&journal->j_state_lock);
774 J_ASSERT(commit_transaction->t_state == T_COMMIT);
775 commit_transaction->t_state = T_COMMIT_RECORD;
776 spin_unlock(&journal->j_state_lock);
777
778 if (journal_write_commit_record(journal, commit_transaction))
779 err = -EIO;
780
781 if (err)
782 journal_abort(journal, err);
783
784
785
786
787
788
789 jbd_debug(3, "JBD: commit phase 7\n");
790
791 J_ASSERT(commit_transaction->t_sync_datalist == NULL);
792 J_ASSERT(commit_transaction->t_buffers == NULL);
793 J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
794 J_ASSERT(commit_transaction->t_iobuf_list == NULL);
795 J_ASSERT(commit_transaction->t_shadow_list == NULL);
796 J_ASSERT(commit_transaction->t_log_list == NULL);
797
798restart_loop:
799
800
801
802
803 spin_lock(&journal->j_list_lock);
804 while (commit_transaction->t_forget) {
805 transaction_t *cp_transaction;
806 struct buffer_head *bh;
807 int try_to_free = 0;
808
809 jh = commit_transaction->t_forget;
810 spin_unlock(&journal->j_list_lock);
811 bh = jh2bh(jh);
812
813
814
815
816 get_bh(bh);
817 jbd_lock_bh_state(bh);
818 J_ASSERT_JH(jh, jh->b_transaction == commit_transaction ||
819 jh->b_transaction == journal->j_running_transaction);
820
821
822
823
824
825
826
827
828
829
830
831 if (jh->b_committed_data) {
832 jbd_free(jh->b_committed_data, bh->b_size);
833 jh->b_committed_data = NULL;
834 if (jh->b_frozen_data) {
835 jh->b_committed_data = jh->b_frozen_data;
836 jh->b_frozen_data = NULL;
837 }
838 } else if (jh->b_frozen_data) {
839 jbd_free(jh->b_frozen_data, bh->b_size);
840 jh->b_frozen_data = NULL;
841 }
842
843 spin_lock(&journal->j_list_lock);
844 cp_transaction = jh->b_cp_transaction;
845 if (cp_transaction) {
846 JBUFFER_TRACE(jh, "remove from old cp transaction");
847 __journal_remove_checkpoint(jh);
848 }
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864 if (buffer_freed(bh) && !jh->b_next_transaction) {
865 clear_buffer_freed(bh);
866 clear_buffer_jbddirty(bh);
867 }
868
869 if (buffer_jbddirty(bh)) {
870 JBUFFER_TRACE(jh, "add to new checkpointing trans");
871 __journal_insert_checkpoint(jh, commit_transaction);
872 if (is_journal_aborted(journal))
873 clear_buffer_jbddirty(bh);
874 } else {
875 J_ASSERT_BH(bh, !buffer_dirty(bh));
876
877
878
879
880
881
882
883
884
885 if (!jh->b_next_transaction)
886 try_to_free = 1;
887 }
888 JBUFFER_TRACE(jh, "refile or unfile freed buffer");
889 __journal_refile_buffer(jh);
890 jbd_unlock_bh_state(bh);
891 if (try_to_free)
892 release_buffer_page(bh);
893 else
894 __brelse(bh);
895 cond_resched_lock(&journal->j_list_lock);
896 }
897 spin_unlock(&journal->j_list_lock);
898
899
900
901
902
903
904 spin_lock(&journal->j_state_lock);
905 spin_lock(&journal->j_list_lock);
906
907
908
909
910 if (commit_transaction->t_forget) {
911 spin_unlock(&journal->j_list_lock);
912 spin_unlock(&journal->j_state_lock);
913 goto restart_loop;
914 }
915
916
917
918 jbd_debug(3, "JBD: commit phase 8\n");
919
920 J_ASSERT(commit_transaction->t_state == T_COMMIT_RECORD);
921
922 commit_transaction->t_state = T_FINISHED;
923 J_ASSERT(commit_transaction == journal->j_committing_transaction);
924 journal->j_commit_sequence = commit_transaction->t_tid;
925 journal->j_committing_transaction = NULL;
926 commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time));
927
928
929
930
931
932 if (likely(journal->j_average_commit_time))
933 journal->j_average_commit_time = (commit_time*3 +
934 journal->j_average_commit_time) / 4;
935 else
936 journal->j_average_commit_time = commit_time;
937
938 spin_unlock(&journal->j_state_lock);
939
940 if (commit_transaction->t_checkpoint_list == NULL &&
941 commit_transaction->t_checkpoint_io_list == NULL) {
942 __journal_drop_transaction(journal, commit_transaction);
943 } else {
944 if (journal->j_checkpoint_transactions == NULL) {
945 journal->j_checkpoint_transactions = commit_transaction;
946 commit_transaction->t_cpnext = commit_transaction;
947 commit_transaction->t_cpprev = commit_transaction;
948 } else {
949 commit_transaction->t_cpnext =
950 journal->j_checkpoint_transactions;
951 commit_transaction->t_cpprev =
952 commit_transaction->t_cpnext->t_cpprev;
953 commit_transaction->t_cpnext->t_cpprev =
954 commit_transaction;
955 commit_transaction->t_cpprev->t_cpnext =
956 commit_transaction;
957 }
958 }
959 spin_unlock(&journal->j_list_lock);
960
961 trace_jbd_end_commit(journal, commit_transaction);
962 jbd_debug(1, "JBD: commit %d complete, head %d\n",
963 journal->j_commit_sequence, journal->j_tail_sequence);
964
965 wake_up(&journal->j_wait_done_commit);
966}
967