1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <linux/time.h>
18#include <linux/fs.h>
19#include <linux/jbd2.h>
20#include <linux/errno.h>
21#include <linux/slab.h>
22#include <linux/timer.h>
23#include <linux/mm.h>
24#include <linux/highmem.h>
25#include <linux/hrtimer.h>
26#include <linux/backing-dev.h>
27#include <linux/bug.h>
28#include <linux/module.h>
29#include <linux/sched/mm.h>
30
31#include <trace/events/jbd2.h>
32
33static void __jbd2_journal_temp_unlink_buffer(struct journal_head *jh);
34static void __jbd2_journal_unfile_buffer(struct journal_head *jh);
35
36static struct kmem_cache *transaction_cache;
37int __init jbd2_journal_init_transaction_cache(void)
38{
39 J_ASSERT(!transaction_cache);
40 transaction_cache = kmem_cache_create("jbd2_transaction_s",
41 sizeof(transaction_t),
42 0,
43 SLAB_HWCACHE_ALIGN|SLAB_TEMPORARY,
44 NULL);
45 if (transaction_cache)
46 return 0;
47 return -ENOMEM;
48}
49
50void jbd2_journal_destroy_transaction_cache(void)
51{
52 kmem_cache_destroy(transaction_cache);
53 transaction_cache = NULL;
54}
55
56void jbd2_journal_free_transaction(transaction_t *transaction)
57{
58 if (unlikely(ZERO_OR_NULL_PTR(transaction)))
59 return;
60 kmem_cache_free(transaction_cache, transaction);
61}
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78static void jbd2_get_transaction(journal_t *journal,
79 transaction_t *transaction)
80{
81 transaction->t_journal = journal;
82 transaction->t_state = T_RUNNING;
83 transaction->t_start_time = ktime_get();
84 transaction->t_tid = journal->j_transaction_sequence++;
85 transaction->t_expires = jiffies + journal->j_commit_interval;
86 spin_lock_init(&transaction->t_handle_lock);
87 atomic_set(&transaction->t_updates, 0);
88 atomic_set(&transaction->t_outstanding_credits,
89 atomic_read(&journal->j_reserved_credits));
90 atomic_set(&transaction->t_handle_count, 0);
91 INIT_LIST_HEAD(&transaction->t_inode_list);
92 INIT_LIST_HEAD(&transaction->t_private_list);
93
94
95 journal->j_commit_timer.expires = round_jiffies_up(transaction->t_expires);
96 add_timer(&journal->j_commit_timer);
97
98 J_ASSERT(journal->j_running_transaction == NULL);
99 journal->j_running_transaction = transaction;
100 transaction->t_max_wait = 0;
101 transaction->t_start = jiffies;
102 transaction->t_requested = 0;
103}
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123static inline void update_t_max_wait(transaction_t *transaction,
124 unsigned long ts)
125{
126#ifdef CONFIG_JBD2_DEBUG
127 if (jbd2_journal_enable_debug &&
128 time_after(transaction->t_start, ts)) {
129 ts = jbd2_time_diff(ts, transaction->t_start);
130 spin_lock(&transaction->t_handle_lock);
131 if (ts > transaction->t_max_wait)
132 transaction->t_max_wait = ts;
133 spin_unlock(&transaction->t_handle_lock);
134 }
135#endif
136}
137
138
139
140
141
142
143static void wait_transaction_locked(journal_t *journal)
144 __releases(journal->j_state_lock)
145{
146 DEFINE_WAIT(wait);
147 int need_to_start;
148 tid_t tid = journal->j_running_transaction->t_tid;
149
150 prepare_to_wait(&journal->j_wait_transaction_locked, &wait,
151 TASK_UNINTERRUPTIBLE);
152 need_to_start = !tid_geq(journal->j_commit_request, tid);
153 read_unlock(&journal->j_state_lock);
154 if (need_to_start)
155 jbd2_log_start_commit(journal, tid);
156 jbd2_might_wait_for_commit(journal);
157 schedule();
158 finish_wait(&journal->j_wait_transaction_locked, &wait);
159}
160
161
162
163
164
165
166static void wait_transaction_switching(journal_t *journal)
167 __releases(journal->j_state_lock)
168{
169 DEFINE_WAIT(wait);
170
171 if (WARN_ON(!journal->j_running_transaction ||
172 journal->j_running_transaction->t_state != T_SWITCH))
173 return;
174 prepare_to_wait(&journal->j_wait_transaction_locked, &wait,
175 TASK_UNINTERRUPTIBLE);
176 read_unlock(&journal->j_state_lock);
177
178
179
180
181
182
183 schedule();
184 finish_wait(&journal->j_wait_transaction_locked, &wait);
185}
186
187static void sub_reserved_credits(journal_t *journal, int blocks)
188{
189 atomic_sub(blocks, &journal->j_reserved_credits);
190 wake_up(&journal->j_wait_reserved);
191}
192
193
194
195
196
197
198
199static int add_transaction_credits(journal_t *journal, int blocks,
200 int rsv_blocks)
201{
202 transaction_t *t = journal->j_running_transaction;
203 int needed;
204 int total = blocks + rsv_blocks;
205
206
207
208
209
210 if (t->t_state != T_RUNNING) {
211 WARN_ON_ONCE(t->t_state >= T_FLUSH);
212 wait_transaction_locked(journal);
213 return 1;
214 }
215
216
217
218
219
220
221 needed = atomic_add_return(total, &t->t_outstanding_credits);
222 if (needed > journal->j_max_transaction_buffers) {
223
224
225
226
227
228 atomic_sub(total, &t->t_outstanding_credits);
229
230
231
232
233
234 if (atomic_read(&journal->j_reserved_credits) + total >
235 journal->j_max_transaction_buffers) {
236 read_unlock(&journal->j_state_lock);
237 jbd2_might_wait_for_commit(journal);
238 wait_event(journal->j_wait_reserved,
239 atomic_read(&journal->j_reserved_credits) + total <=
240 journal->j_max_transaction_buffers);
241 return 1;
242 }
243
244 wait_transaction_locked(journal);
245 return 1;
246 }
247
248
249
250
251
252
253
254
255
256
257
258
259 if (jbd2_log_space_left(journal) < jbd2_space_needed(journal)) {
260 atomic_sub(total, &t->t_outstanding_credits);
261 read_unlock(&journal->j_state_lock);
262 jbd2_might_wait_for_commit(journal);
263 write_lock(&journal->j_state_lock);
264 if (jbd2_log_space_left(journal) < jbd2_space_needed(journal))
265 __jbd2_log_wait_for_space(journal);
266 write_unlock(&journal->j_state_lock);
267 return 1;
268 }
269
270
271 if (!rsv_blocks)
272 return 0;
273
274 needed = atomic_add_return(rsv_blocks, &journal->j_reserved_credits);
275
276 if (needed > journal->j_max_transaction_buffers / 2) {
277 sub_reserved_credits(journal, rsv_blocks);
278 atomic_sub(total, &t->t_outstanding_credits);
279 read_unlock(&journal->j_state_lock);
280 jbd2_might_wait_for_commit(journal);
281 wait_event(journal->j_wait_reserved,
282 atomic_read(&journal->j_reserved_credits) + rsv_blocks
283 <= journal->j_max_transaction_buffers / 2);
284 return 1;
285 }
286 return 0;
287}
288
289
290
291
292
293
294
295
296static int start_this_handle(journal_t *journal, handle_t *handle,
297 gfp_t gfp_mask)
298{
299 transaction_t *transaction, *new_transaction = NULL;
300 int blocks = handle->h_buffer_credits;
301 int rsv_blocks = 0;
302 unsigned long ts = jiffies;
303
304 if (handle->h_rsv_handle)
305 rsv_blocks = handle->h_rsv_handle->h_buffer_credits;
306
307
308
309
310
311
312 if ((rsv_blocks > journal->j_max_transaction_buffers / 2) ||
313 (rsv_blocks + blocks > journal->j_max_transaction_buffers)) {
314 printk(KERN_ERR "JBD2: %s wants too many credits "
315 "credits:%d rsv_credits:%d max:%d\n",
316 current->comm, blocks, rsv_blocks,
317 journal->j_max_transaction_buffers);
318 WARN_ON(1);
319 return -ENOSPC;
320 }
321
322alloc_transaction:
323 if (!journal->j_running_transaction) {
324
325
326
327
328 if ((gfp_mask & __GFP_FS) == 0)
329 gfp_mask |= __GFP_NOFAIL;
330 new_transaction = kmem_cache_zalloc(transaction_cache,
331 gfp_mask);
332 if (!new_transaction)
333 return -ENOMEM;
334 }
335
336 jbd_debug(3, "New handle %p going live.\n", handle);
337
338
339
340
341
342repeat:
343 read_lock(&journal->j_state_lock);
344 BUG_ON(journal->j_flags & JBD2_UNMOUNT);
345 if (is_journal_aborted(journal) ||
346 (journal->j_errno != 0 && !(journal->j_flags & JBD2_ACK_ERR))) {
347 read_unlock(&journal->j_state_lock);
348 jbd2_journal_free_transaction(new_transaction);
349 return -EROFS;
350 }
351
352
353
354
355
356
357 if (!handle->h_reserved && journal->j_barrier_count) {
358 read_unlock(&journal->j_state_lock);
359 wait_event(journal->j_wait_transaction_locked,
360 journal->j_barrier_count == 0);
361 goto repeat;
362 }
363
364 if (!journal->j_running_transaction) {
365 read_unlock(&journal->j_state_lock);
366 if (!new_transaction)
367 goto alloc_transaction;
368 write_lock(&journal->j_state_lock);
369 if (!journal->j_running_transaction &&
370 (handle->h_reserved || !journal->j_barrier_count)) {
371 jbd2_get_transaction(journal, new_transaction);
372 new_transaction = NULL;
373 }
374 write_unlock(&journal->j_state_lock);
375 goto repeat;
376 }
377
378 transaction = journal->j_running_transaction;
379
380 if (!handle->h_reserved) {
381
382 if (add_transaction_credits(journal, blocks, rsv_blocks))
383 goto repeat;
384 } else {
385
386
387
388
389
390
391
392 if (transaction->t_state == T_SWITCH) {
393 wait_transaction_switching(journal);
394 goto repeat;
395 }
396 sub_reserved_credits(journal, blocks);
397 handle->h_reserved = 0;
398 }
399
400
401
402
403 update_t_max_wait(transaction, ts);
404 handle->h_transaction = transaction;
405 handle->h_requested_credits = blocks;
406 handle->h_start_jiffies = jiffies;
407 atomic_inc(&transaction->t_updates);
408 atomic_inc(&transaction->t_handle_count);
409 jbd_debug(4, "Handle %p given %d credits (total %d, free %lu)\n",
410 handle, blocks,
411 atomic_read(&transaction->t_outstanding_credits),
412 jbd2_log_space_left(journal));
413 read_unlock(&journal->j_state_lock);
414 current->journal_info = handle;
415
416 rwsem_acquire_read(&journal->j_trans_commit_map, 0, 0, _THIS_IP_);
417 jbd2_journal_free_transaction(new_transaction);
418
419
420
421
422 handle->saved_alloc_context = memalloc_nofs_save();
423 return 0;
424}
425
426
427static handle_t *new_handle(int nblocks)
428{
429 handle_t *handle = jbd2_alloc_handle(GFP_NOFS);
430 if (!handle)
431 return NULL;
432 handle->h_buffer_credits = nblocks;
433 handle->h_ref = 1;
434
435 return handle;
436}
437
438handle_t *jbd2__journal_start(journal_t *journal, int nblocks, int rsv_blocks,
439 gfp_t gfp_mask, unsigned int type,
440 unsigned int line_no)
441{
442 handle_t *handle = journal_current_handle();
443 int err;
444
445 if (!journal)
446 return ERR_PTR(-EROFS);
447
448 if (handle) {
449 J_ASSERT(handle->h_transaction->t_journal == journal);
450 handle->h_ref++;
451 return handle;
452 }
453
454 handle = new_handle(nblocks);
455 if (!handle)
456 return ERR_PTR(-ENOMEM);
457 if (rsv_blocks) {
458 handle_t *rsv_handle;
459
460 rsv_handle = new_handle(rsv_blocks);
461 if (!rsv_handle) {
462 jbd2_free_handle(handle);
463 return ERR_PTR(-ENOMEM);
464 }
465 rsv_handle->h_reserved = 1;
466 rsv_handle->h_journal = journal;
467 handle->h_rsv_handle = rsv_handle;
468 }
469
470 err = start_this_handle(journal, handle, gfp_mask);
471 if (err < 0) {
472 if (handle->h_rsv_handle)
473 jbd2_free_handle(handle->h_rsv_handle);
474 jbd2_free_handle(handle);
475 return ERR_PTR(err);
476 }
477 handle->h_type = type;
478 handle->h_line_no = line_no;
479 trace_jbd2_handle_start(journal->j_fs_dev->bd_dev,
480 handle->h_transaction->t_tid, type,
481 line_no, nblocks);
482
483 return handle;
484}
485EXPORT_SYMBOL(jbd2__journal_start);
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507handle_t *jbd2_journal_start(journal_t *journal, int nblocks)
508{
509 return jbd2__journal_start(journal, nblocks, 0, GFP_NOFS, 0, 0);
510}
511EXPORT_SYMBOL(jbd2_journal_start);
512
513void jbd2_journal_free_reserved(handle_t *handle)
514{
515 journal_t *journal = handle->h_journal;
516
517 WARN_ON(!handle->h_reserved);
518 sub_reserved_credits(journal, handle->h_buffer_credits);
519 jbd2_free_handle(handle);
520}
521EXPORT_SYMBOL(jbd2_journal_free_reserved);
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537int jbd2_journal_start_reserved(handle_t *handle, unsigned int type,
538 unsigned int line_no)
539{
540 journal_t *journal = handle->h_journal;
541 int ret = -EIO;
542
543 if (WARN_ON(!handle->h_reserved)) {
544
545 jbd2_journal_stop(handle);
546 return ret;
547 }
548
549
550
551
552 if (WARN_ON(current->journal_info)) {
553 jbd2_journal_free_reserved(handle);
554 return ret;
555 }
556
557 handle->h_journal = NULL;
558
559
560
561
562 ret = start_this_handle(journal, handle, GFP_NOFS);
563 if (ret < 0) {
564 handle->h_journal = journal;
565 jbd2_journal_free_reserved(handle);
566 return ret;
567 }
568 handle->h_type = type;
569 handle->h_line_no = line_no;
570 return 0;
571}
572EXPORT_SYMBOL(jbd2_journal_start_reserved);
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594int jbd2_journal_extend(handle_t *handle, int nblocks)
595{
596 transaction_t *transaction = handle->h_transaction;
597 journal_t *journal;
598 int result;
599 int wanted;
600
601 if (is_handle_aborted(handle))
602 return -EROFS;
603 journal = transaction->t_journal;
604
605 result = 1;
606
607 read_lock(&journal->j_state_lock);
608
609
610 if (transaction->t_state != T_RUNNING) {
611 jbd_debug(3, "denied handle %p %d blocks: "
612 "transaction not running\n", handle, nblocks);
613 goto error_out;
614 }
615
616 spin_lock(&transaction->t_handle_lock);
617 wanted = atomic_add_return(nblocks,
618 &transaction->t_outstanding_credits);
619
620 if (wanted > journal->j_max_transaction_buffers) {
621 jbd_debug(3, "denied handle %p %d blocks: "
622 "transaction too large\n", handle, nblocks);
623 atomic_sub(nblocks, &transaction->t_outstanding_credits);
624 goto unlock;
625 }
626
627 if (wanted + (wanted >> JBD2_CONTROL_BLOCKS_SHIFT) >
628 jbd2_log_space_left(journal)) {
629 jbd_debug(3, "denied handle %p %d blocks: "
630 "insufficient log space\n", handle, nblocks);
631 atomic_sub(nblocks, &transaction->t_outstanding_credits);
632 goto unlock;
633 }
634
635 trace_jbd2_handle_extend(journal->j_fs_dev->bd_dev,
636 transaction->t_tid,
637 handle->h_type, handle->h_line_no,
638 handle->h_buffer_credits,
639 nblocks);
640
641 handle->h_buffer_credits += nblocks;
642 handle->h_requested_credits += nblocks;
643 result = 0;
644
645 jbd_debug(3, "extended handle %p by %d\n", handle, nblocks);
646unlock:
647 spin_unlock(&transaction->t_handle_lock);
648error_out:
649 read_unlock(&journal->j_state_lock);
650 return result;
651}
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670int jbd2__journal_restart(handle_t *handle, int nblocks, gfp_t gfp_mask)
671{
672 transaction_t *transaction = handle->h_transaction;
673 journal_t *journal;
674 tid_t tid;
675 int need_to_start, ret;
676
677
678
679 if (is_handle_aborted(handle))
680 return 0;
681 journal = transaction->t_journal;
682
683
684
685
686
687 J_ASSERT(atomic_read(&transaction->t_updates) > 0);
688 J_ASSERT(journal_current_handle() == handle);
689
690 read_lock(&journal->j_state_lock);
691 spin_lock(&transaction->t_handle_lock);
692 atomic_sub(handle->h_buffer_credits,
693 &transaction->t_outstanding_credits);
694 if (handle->h_rsv_handle) {
695 sub_reserved_credits(journal,
696 handle->h_rsv_handle->h_buffer_credits);
697 }
698 if (atomic_dec_and_test(&transaction->t_updates))
699 wake_up(&journal->j_wait_updates);
700 tid = transaction->t_tid;
701 spin_unlock(&transaction->t_handle_lock);
702 handle->h_transaction = NULL;
703 current->journal_info = NULL;
704
705 jbd_debug(2, "restarting handle %p\n", handle);
706 need_to_start = !tid_geq(journal->j_commit_request, tid);
707 read_unlock(&journal->j_state_lock);
708 if (need_to_start)
709 jbd2_log_start_commit(journal, tid);
710
711 rwsem_release(&journal->j_trans_commit_map, 1, _THIS_IP_);
712 handle->h_buffer_credits = nblocks;
713
714
715
716
717
718 memalloc_nofs_restore(handle->saved_alloc_context);
719 ret = start_this_handle(journal, handle, gfp_mask);
720 return ret;
721}
722EXPORT_SYMBOL(jbd2__journal_restart);
723
724
725int jbd2_journal_restart(handle_t *handle, int nblocks)
726{
727 return jbd2__journal_restart(handle, nblocks, GFP_NOFS);
728}
729EXPORT_SYMBOL(jbd2_journal_restart);
730
731
732
733
734
735
736
737
738
739
740
741void jbd2_journal_lock_updates(journal_t *journal)
742{
743 DEFINE_WAIT(wait);
744
745 jbd2_might_wait_for_commit(journal);
746
747 write_lock(&journal->j_state_lock);
748 ++journal->j_barrier_count;
749
750
751 if (atomic_read(&journal->j_reserved_credits)) {
752 write_unlock(&journal->j_state_lock);
753 wait_event(journal->j_wait_reserved,
754 atomic_read(&journal->j_reserved_credits) == 0);
755 write_lock(&journal->j_state_lock);
756 }
757
758
759 while (1) {
760 transaction_t *transaction = journal->j_running_transaction;
761
762 if (!transaction)
763 break;
764
765 spin_lock(&transaction->t_handle_lock);
766 prepare_to_wait(&journal->j_wait_updates, &wait,
767 TASK_UNINTERRUPTIBLE);
768 if (!atomic_read(&transaction->t_updates)) {
769 spin_unlock(&transaction->t_handle_lock);
770 finish_wait(&journal->j_wait_updates, &wait);
771 break;
772 }
773 spin_unlock(&transaction->t_handle_lock);
774 write_unlock(&journal->j_state_lock);
775 schedule();
776 finish_wait(&journal->j_wait_updates, &wait);
777 write_lock(&journal->j_state_lock);
778 }
779 write_unlock(&journal->j_state_lock);
780
781
782
783
784
785
786
787 mutex_lock(&journal->j_barrier);
788}
789
790
791
792
793
794
795
796
797
798void jbd2_journal_unlock_updates (journal_t *journal)
799{
800 J_ASSERT(journal->j_barrier_count != 0);
801
802 mutex_unlock(&journal->j_barrier);
803 write_lock(&journal->j_state_lock);
804 --journal->j_barrier_count;
805 write_unlock(&journal->j_state_lock);
806 wake_up(&journal->j_wait_transaction_locked);
807}
808
809static void warn_dirty_buffer(struct buffer_head *bh)
810{
811 printk(KERN_WARNING
812 "JBD2: Spotted dirty metadata buffer (dev = %pg, blocknr = %llu). "
813 "There's a risk of filesystem corruption in case of system "
814 "crash.\n",
815 bh->b_bdev, (unsigned long long)bh->b_blocknr);
816}
817
818
819static void jbd2_freeze_jh_data(struct journal_head *jh)
820{
821 struct page *page;
822 int offset;
823 char *source;
824 struct buffer_head *bh = jh2bh(jh);
825
826 J_EXPECT_JH(jh, buffer_uptodate(bh), "Possible IO failure.\n");
827 page = bh->b_page;
828 offset = offset_in_page(bh->b_data);
829 source = kmap_atomic(page);
830
831 jbd2_buffer_frozen_trigger(jh, source + offset, jh->b_triggers);
832 memcpy(jh->b_frozen_data, source + offset, bh->b_size);
833 kunmap_atomic(source);
834
835
836
837
838
839 jh->b_frozen_triggers = jh->b_triggers;
840}
841
842
843
844
845
846
847
848
849
850
851
852static int
853do_get_write_access(handle_t *handle, struct journal_head *jh,
854 int force_copy)
855{
856 struct buffer_head *bh;
857 transaction_t *transaction = handle->h_transaction;
858 journal_t *journal;
859 int error;
860 char *frozen_buffer = NULL;
861 unsigned long start_lock, time_lock;
862
863 if (is_handle_aborted(handle))
864 return -EROFS;
865 journal = transaction->t_journal;
866
867 jbd_debug(5, "journal_head %p, force_copy %d\n", jh, force_copy);
868
869 JBUFFER_TRACE(jh, "entry");
870repeat:
871 bh = jh2bh(jh);
872
873
874
875 start_lock = jiffies;
876 lock_buffer(bh);
877 jbd_lock_bh_state(bh);
878
879
880 time_lock = jbd2_time_diff(start_lock, jiffies);
881 if (time_lock > HZ/10)
882 trace_jbd2_lock_buffer_stall(bh->b_bdev->bd_dev,
883 jiffies_to_msecs(time_lock));
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898 if (buffer_dirty(bh)) {
899
900
901
902
903 if (jh->b_transaction) {
904 J_ASSERT_JH(jh,
905 jh->b_transaction == transaction ||
906 jh->b_transaction ==
907 journal->j_committing_transaction);
908 if (jh->b_next_transaction)
909 J_ASSERT_JH(jh, jh->b_next_transaction ==
910 transaction);
911 warn_dirty_buffer(bh);
912 }
913
914
915
916
917
918 JBUFFER_TRACE(jh, "Journalling dirty buffer");
919 clear_buffer_dirty(bh);
920 set_buffer_jbddirty(bh);
921 }
922
923 unlock_buffer(bh);
924
925 error = -EROFS;
926 if (is_handle_aborted(handle)) {
927 jbd_unlock_bh_state(bh);
928 goto out;
929 }
930 error = 0;
931
932
933
934
935
936 if (jh->b_transaction == transaction ||
937 jh->b_next_transaction == transaction)
938 goto done;
939
940
941
942
943
944 jh->b_modified = 0;
945
946
947
948
949
950
951 if (!jh->b_transaction) {
952 JBUFFER_TRACE(jh, "no transaction");
953 J_ASSERT_JH(jh, !jh->b_next_transaction);
954 JBUFFER_TRACE(jh, "file as BJ_Reserved");
955
956
957
958
959
960 smp_wmb();
961 spin_lock(&journal->j_list_lock);
962 __jbd2_journal_file_buffer(jh, transaction, BJ_Reserved);
963 spin_unlock(&journal->j_list_lock);
964 goto done;
965 }
966
967
968
969
970 if (jh->b_frozen_data) {
971 JBUFFER_TRACE(jh, "has frozen data");
972 J_ASSERT_JH(jh, jh->b_next_transaction == NULL);
973 goto attach_next;
974 }
975
976 JBUFFER_TRACE(jh, "owned by older transaction");
977 J_ASSERT_JH(jh, jh->b_next_transaction == NULL);
978 J_ASSERT_JH(jh, jh->b_transaction == journal->j_committing_transaction);
979
980
981
982
983
984
985
986
987
988
989 if (buffer_shadow(bh)) {
990 JBUFFER_TRACE(jh, "on shadow: sleep");
991 jbd_unlock_bh_state(bh);
992 wait_on_bit_io(&bh->b_state, BH_Shadow, TASK_UNINTERRUPTIBLE);
993 goto repeat;
994 }
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008 if (jh->b_jlist == BJ_Metadata || force_copy) {
1009 JBUFFER_TRACE(jh, "generate frozen data");
1010 if (!frozen_buffer) {
1011 JBUFFER_TRACE(jh, "allocate memory for buffer");
1012 jbd_unlock_bh_state(bh);
1013 frozen_buffer = jbd2_alloc(jh2bh(jh)->b_size,
1014 GFP_NOFS | __GFP_NOFAIL);
1015 goto repeat;
1016 }
1017 jh->b_frozen_data = frozen_buffer;
1018 frozen_buffer = NULL;
1019 jbd2_freeze_jh_data(jh);
1020 }
1021attach_next:
1022
1023
1024
1025
1026
1027 smp_wmb();
1028 jh->b_next_transaction = transaction;
1029
1030done:
1031 jbd_unlock_bh_state(bh);
1032
1033
1034
1035
1036
1037 jbd2_journal_cancel_revoke(handle, jh);
1038
1039out:
1040 if (unlikely(frozen_buffer))
1041 jbd2_free(frozen_buffer, bh->b_size);
1042
1043 JBUFFER_TRACE(jh, "exit");
1044 return error;
1045}
1046
1047
1048static bool jbd2_write_access_granted(handle_t *handle, struct buffer_head *bh,
1049 bool undo)
1050{
1051 struct journal_head *jh;
1052 bool ret = false;
1053
1054
1055 if (buffer_dirty(bh))
1056 return false;
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069 rcu_read_lock();
1070 if (!buffer_jbd(bh))
1071 goto out;
1072
1073 jh = READ_ONCE(bh->b_private);
1074 if (!jh)
1075 goto out;
1076
1077 if (undo && !jh->b_committed_data)
1078 goto out;
1079 if (jh->b_transaction != handle->h_transaction &&
1080 jh->b_next_transaction != handle->h_transaction)
1081 goto out;
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091 smp_mb();
1092 if (unlikely(jh->b_bh != bh))
1093 goto out;
1094 ret = true;
1095out:
1096 rcu_read_unlock();
1097 return ret;
1098}
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111int jbd2_journal_get_write_access(handle_t *handle, struct buffer_head *bh)
1112{
1113 struct journal_head *jh;
1114 int rc;
1115
1116 if (jbd2_write_access_granted(handle, bh, false))
1117 return 0;
1118
1119 jh = jbd2_journal_add_journal_head(bh);
1120
1121
1122
1123 rc = do_get_write_access(handle, jh, 0);
1124 jbd2_journal_put_journal_head(jh);
1125 return rc;
1126}
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148int jbd2_journal_get_create_access(handle_t *handle, struct buffer_head *bh)
1149{
1150 transaction_t *transaction = handle->h_transaction;
1151 journal_t *journal;
1152 struct journal_head *jh = jbd2_journal_add_journal_head(bh);
1153 int err;
1154
1155 jbd_debug(5, "journal_head %p\n", jh);
1156 err = -EROFS;
1157 if (is_handle_aborted(handle))
1158 goto out;
1159 journal = transaction->t_journal;
1160 err = 0;
1161
1162 JBUFFER_TRACE(jh, "entry");
1163
1164
1165
1166
1167
1168
1169
1170 jbd_lock_bh_state(bh);
1171 J_ASSERT_JH(jh, (jh->b_transaction == transaction ||
1172 jh->b_transaction == NULL ||
1173 (jh->b_transaction == journal->j_committing_transaction &&
1174 jh->b_jlist == BJ_Forget)));
1175
1176 J_ASSERT_JH(jh, jh->b_next_transaction == NULL);
1177 J_ASSERT_JH(jh, buffer_locked(jh2bh(jh)));
1178
1179 if (jh->b_transaction == NULL) {
1180
1181
1182
1183
1184
1185
1186
1187
1188 clear_buffer_dirty(jh2bh(jh));
1189
1190 jh->b_modified = 0;
1191
1192 JBUFFER_TRACE(jh, "file as BJ_Reserved");
1193 spin_lock(&journal->j_list_lock);
1194 __jbd2_journal_file_buffer(jh, transaction, BJ_Reserved);
1195 spin_unlock(&journal->j_list_lock);
1196 } else if (jh->b_transaction == journal->j_committing_transaction) {
1197
1198 jh->b_modified = 0;
1199
1200 JBUFFER_TRACE(jh, "set next transaction");
1201 spin_lock(&journal->j_list_lock);
1202 jh->b_next_transaction = transaction;
1203 spin_unlock(&journal->j_list_lock);
1204 }
1205 jbd_unlock_bh_state(bh);
1206
1207
1208
1209
1210
1211
1212
1213
1214 JBUFFER_TRACE(jh, "cancelling revoke");
1215 jbd2_journal_cancel_revoke(handle, jh);
1216out:
1217 jbd2_journal_put_journal_head(jh);
1218 return err;
1219}
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247int jbd2_journal_get_undo_access(handle_t *handle, struct buffer_head *bh)
1248{
1249 int err;
1250 struct journal_head *jh;
1251 char *committed_data = NULL;
1252
1253 if (jbd2_write_access_granted(handle, bh, true))
1254 return 0;
1255
1256 jh = jbd2_journal_add_journal_head(bh);
1257 JBUFFER_TRACE(jh, "entry");
1258
1259
1260
1261
1262
1263
1264 err = do_get_write_access(handle, jh, 1);
1265 if (err)
1266 goto out;
1267
1268repeat:
1269 if (!jh->b_committed_data)
1270 committed_data = jbd2_alloc(jh2bh(jh)->b_size,
1271 GFP_NOFS|__GFP_NOFAIL);
1272
1273 jbd_lock_bh_state(bh);
1274 if (!jh->b_committed_data) {
1275
1276
1277 JBUFFER_TRACE(jh, "generate b_committed data");
1278 if (!committed_data) {
1279 jbd_unlock_bh_state(bh);
1280 goto repeat;
1281 }
1282
1283 jh->b_committed_data = committed_data;
1284 committed_data = NULL;
1285 memcpy(jh->b_committed_data, bh->b_data, bh->b_size);
1286 }
1287 jbd_unlock_bh_state(bh);
1288out:
1289 jbd2_journal_put_journal_head(jh);
1290 if (unlikely(committed_data))
1291 jbd2_free(committed_data, bh->b_size);
1292 return err;
1293}
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306void jbd2_journal_set_triggers(struct buffer_head *bh,
1307 struct jbd2_buffer_trigger_type *type)
1308{
1309 struct journal_head *jh = jbd2_journal_grab_journal_head(bh);
1310
1311 if (WARN_ON(!jh))
1312 return;
1313 jh->b_triggers = type;
1314 jbd2_journal_put_journal_head(jh);
1315}
1316
1317void jbd2_buffer_frozen_trigger(struct journal_head *jh, void *mapped_data,
1318 struct jbd2_buffer_trigger_type *triggers)
1319{
1320 struct buffer_head *bh = jh2bh(jh);
1321
1322 if (!triggers || !triggers->t_frozen)
1323 return;
1324
1325 triggers->t_frozen(triggers, bh, mapped_data, bh->b_size);
1326}
1327
1328void jbd2_buffer_abort_trigger(struct journal_head *jh,
1329 struct jbd2_buffer_trigger_type *triggers)
1330{
1331 if (!triggers || !triggers->t_abort)
1332 return;
1333
1334 triggers->t_abort(triggers, jh2bh(jh));
1335}
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh)
1361{
1362 transaction_t *transaction = handle->h_transaction;
1363 journal_t *journal;
1364 struct journal_head *jh;
1365 int ret = 0;
1366
1367 if (is_handle_aborted(handle))
1368 return -EROFS;
1369 if (!buffer_jbd(bh))
1370 return -EUCLEAN;
1371
1372
1373
1374
1375
1376 jh = bh2jh(bh);
1377 jbd_debug(5, "journal_head %p\n", jh);
1378 JBUFFER_TRACE(jh, "entry");
1379
1380
1381
1382
1383
1384
1385
1386 if (jh->b_transaction != transaction &&
1387 jh->b_next_transaction != transaction) {
1388 jbd_lock_bh_state(bh);
1389 J_ASSERT_JH(jh, jh->b_transaction == transaction ||
1390 jh->b_next_transaction == transaction);
1391 jbd_unlock_bh_state(bh);
1392 }
1393 if (jh->b_modified == 1) {
1394
1395 if (jh->b_transaction == transaction &&
1396 jh->b_jlist != BJ_Metadata) {
1397 jbd_lock_bh_state(bh);
1398 if (jh->b_transaction == transaction &&
1399 jh->b_jlist != BJ_Metadata)
1400 pr_err("JBD2: assertion failure: h_type=%u "
1401 "h_line_no=%u block_no=%llu jlist=%u\n",
1402 handle->h_type, handle->h_line_no,
1403 (unsigned long long) bh->b_blocknr,
1404 jh->b_jlist);
1405 J_ASSERT_JH(jh, jh->b_transaction != transaction ||
1406 jh->b_jlist == BJ_Metadata);
1407 jbd_unlock_bh_state(bh);
1408 }
1409 goto out;
1410 }
1411
1412 journal = transaction->t_journal;
1413 jbd_lock_bh_state(bh);
1414
1415 if (jh->b_modified == 0) {
1416
1417
1418
1419
1420
1421 if (handle->h_buffer_credits <= 0) {
1422 ret = -ENOSPC;
1423 goto out_unlock_bh;
1424 }
1425 jh->b_modified = 1;
1426 handle->h_buffer_credits--;
1427 }
1428
1429
1430
1431
1432
1433
1434
1435
1436 if (jh->b_transaction == transaction && jh->b_jlist == BJ_Metadata) {
1437 JBUFFER_TRACE(jh, "fastpath");
1438 if (unlikely(jh->b_transaction !=
1439 journal->j_running_transaction)) {
1440 printk(KERN_ERR "JBD2: %s: "
1441 "jh->b_transaction (%llu, %p, %u) != "
1442 "journal->j_running_transaction (%p, %u)\n",
1443 journal->j_devname,
1444 (unsigned long long) bh->b_blocknr,
1445 jh->b_transaction,
1446 jh->b_transaction ? jh->b_transaction->t_tid : 0,
1447 journal->j_running_transaction,
1448 journal->j_running_transaction ?
1449 journal->j_running_transaction->t_tid : 0);
1450 ret = -EINVAL;
1451 }
1452 goto out_unlock_bh;
1453 }
1454
1455 set_buffer_jbddirty(bh);
1456
1457
1458
1459
1460
1461
1462
1463 if (jh->b_transaction != transaction) {
1464 JBUFFER_TRACE(jh, "already on other transaction");
1465 if (unlikely(((jh->b_transaction !=
1466 journal->j_committing_transaction)) ||
1467 (jh->b_next_transaction != transaction))) {
1468 printk(KERN_ERR "jbd2_journal_dirty_metadata: %s: "
1469 "bad jh for block %llu: "
1470 "transaction (%p, %u), "
1471 "jh->b_transaction (%p, %u), "
1472 "jh->b_next_transaction (%p, %u), jlist %u\n",
1473 journal->j_devname,
1474 (unsigned long long) bh->b_blocknr,
1475 transaction, transaction->t_tid,
1476 jh->b_transaction,
1477 jh->b_transaction ?
1478 jh->b_transaction->t_tid : 0,
1479 jh->b_next_transaction,
1480 jh->b_next_transaction ?
1481 jh->b_next_transaction->t_tid : 0,
1482 jh->b_jlist);
1483 WARN_ON(1);
1484 ret = -EINVAL;
1485 }
1486
1487
1488 goto out_unlock_bh;
1489 }
1490
1491
1492 J_ASSERT_JH(jh, jh->b_frozen_data == NULL);
1493
1494 JBUFFER_TRACE(jh, "file as BJ_Metadata");
1495 spin_lock(&journal->j_list_lock);
1496 __jbd2_journal_file_buffer(jh, transaction, BJ_Metadata);
1497 spin_unlock(&journal->j_list_lock);
1498out_unlock_bh:
1499 jbd_unlock_bh_state(bh);
1500out:
1501 JBUFFER_TRACE(jh, "exit");
1502 return ret;
1503}
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh)
1523{
1524 transaction_t *transaction = handle->h_transaction;
1525 journal_t *journal;
1526 struct journal_head *jh;
1527 int drop_reserve = 0;
1528 int err = 0;
1529 int was_modified = 0;
1530
1531 if (is_handle_aborted(handle))
1532 return -EROFS;
1533 journal = transaction->t_journal;
1534
1535 BUFFER_TRACE(bh, "entry");
1536
1537 jbd_lock_bh_state(bh);
1538
1539 if (!buffer_jbd(bh))
1540 goto not_jbd;
1541 jh = bh2jh(bh);
1542
1543
1544
1545 if (!J_EXPECT_JH(jh, !jh->b_committed_data,
1546 "inconsistent data on disk")) {
1547 err = -EIO;
1548 goto not_jbd;
1549 }
1550
1551
1552 was_modified = jh->b_modified;
1553
1554
1555
1556
1557
1558 jh->b_modified = 0;
1559
1560 if (jh->b_transaction == transaction) {
1561 J_ASSERT_JH(jh, !jh->b_frozen_data);
1562
1563
1564
1565
1566 clear_buffer_dirty(bh);
1567 clear_buffer_jbddirty(bh);
1568
1569 JBUFFER_TRACE(jh, "belongs to current transaction: unfile");
1570
1571
1572
1573
1574
1575 if (was_modified)
1576 drop_reserve = 1;
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590 spin_lock(&journal->j_list_lock);
1591 if (jh->b_cp_transaction) {
1592 __jbd2_journal_temp_unlink_buffer(jh);
1593 __jbd2_journal_file_buffer(jh, transaction, BJ_Forget);
1594 } else {
1595 __jbd2_journal_unfile_buffer(jh);
1596 if (!buffer_jbd(bh)) {
1597 spin_unlock(&journal->j_list_lock);
1598 goto not_jbd;
1599 }
1600 }
1601 spin_unlock(&journal->j_list_lock);
1602 } else if (jh->b_transaction) {
1603 J_ASSERT_JH(jh, (jh->b_transaction ==
1604 journal->j_committing_transaction));
1605
1606
1607 JBUFFER_TRACE(jh, "belongs to older transaction");
1608
1609
1610
1611
1612
1613
1614
1615 set_buffer_freed(bh);
1616
1617 if (!jh->b_next_transaction) {
1618 spin_lock(&journal->j_list_lock);
1619 jh->b_next_transaction = transaction;
1620 spin_unlock(&journal->j_list_lock);
1621 } else {
1622 J_ASSERT(jh->b_next_transaction == transaction);
1623
1624
1625
1626
1627
1628 if (was_modified)
1629 drop_reserve = 1;
1630 }
1631 } else {
1632
1633
1634
1635
1636
1637 spin_lock(&journal->j_list_lock);
1638 if (!jh->b_cp_transaction) {
1639 JBUFFER_TRACE(jh, "belongs to none transaction");
1640 spin_unlock(&journal->j_list_lock);
1641 goto not_jbd;
1642 }
1643
1644
1645
1646
1647
1648 if (!buffer_dirty(bh)) {
1649 __jbd2_journal_remove_checkpoint(jh);
1650 spin_unlock(&journal->j_list_lock);
1651 goto not_jbd;
1652 }
1653
1654
1655
1656
1657
1658
1659
1660 clear_buffer_dirty(bh);
1661 __jbd2_journal_file_buffer(jh, transaction, BJ_Forget);
1662 spin_unlock(&journal->j_list_lock);
1663 }
1664
1665 jbd_unlock_bh_state(bh);
1666 __brelse(bh);
1667drop:
1668 if (drop_reserve) {
1669
1670 handle->h_buffer_credits++;
1671 }
1672 return err;
1673
1674not_jbd:
1675 jbd_unlock_bh_state(bh);
1676 __bforget(bh);
1677 goto drop;
1678}
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696int jbd2_journal_stop(handle_t *handle)
1697{
1698 transaction_t *transaction = handle->h_transaction;
1699 journal_t *journal;
1700 int err = 0, wait_for_commit = 0;
1701 tid_t tid;
1702 pid_t pid;
1703
1704 if (!transaction) {
1705
1706
1707
1708
1709
1710 if (--handle->h_ref > 0) {
1711 jbd_debug(4, "h_ref %d -> %d\n", handle->h_ref + 1,
1712 handle->h_ref);
1713 return err;
1714 } else {
1715 if (handle->h_rsv_handle)
1716 jbd2_free_handle(handle->h_rsv_handle);
1717 goto free_and_exit;
1718 }
1719 }
1720 journal = transaction->t_journal;
1721
1722 J_ASSERT(journal_current_handle() == handle);
1723
1724 if (is_handle_aborted(handle))
1725 err = -EIO;
1726 else
1727 J_ASSERT(atomic_read(&transaction->t_updates) > 0);
1728
1729 if (--handle->h_ref > 0) {
1730 jbd_debug(4, "h_ref %d -> %d\n", handle->h_ref + 1,
1731 handle->h_ref);
1732 return err;
1733 }
1734
1735 jbd_debug(4, "Handle %p going down\n", handle);
1736 trace_jbd2_handle_stats(journal->j_fs_dev->bd_dev,
1737 transaction->t_tid,
1738 handle->h_type, handle->h_line_no,
1739 jiffies - handle->h_start_jiffies,
1740 handle->h_sync, handle->h_requested_credits,
1741 (handle->h_requested_credits -
1742 handle->h_buffer_credits));
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773 pid = current->pid;
1774 if (handle->h_sync && journal->j_last_sync_writer != pid &&
1775 journal->j_max_batch_time) {
1776 u64 commit_time, trans_time;
1777
1778 journal->j_last_sync_writer = pid;
1779
1780 read_lock(&journal->j_state_lock);
1781 commit_time = journal->j_average_commit_time;
1782 read_unlock(&journal->j_state_lock);
1783
1784 trans_time = ktime_to_ns(ktime_sub(ktime_get(),
1785 transaction->t_start_time));
1786
1787 commit_time = max_t(u64, commit_time,
1788 1000*journal->j_min_batch_time);
1789 commit_time = min_t(u64, commit_time,
1790 1000*journal->j_max_batch_time);
1791
1792 if (trans_time < commit_time) {
1793 ktime_t expires = ktime_add_ns(ktime_get(),
1794 commit_time);
1795 set_current_state(TASK_UNINTERRUPTIBLE);
1796 schedule_hrtimeout(&expires, HRTIMER_MODE_ABS);
1797 }
1798 }
1799
1800 if (handle->h_sync)
1801 transaction->t_synchronous_commit = 1;
1802 current->journal_info = NULL;
1803 atomic_sub(handle->h_buffer_credits,
1804 &transaction->t_outstanding_credits);
1805
1806
1807
1808
1809
1810
1811
1812 if (handle->h_sync ||
1813 (atomic_read(&transaction->t_outstanding_credits) >
1814 journal->j_max_transaction_buffers) ||
1815 time_after_eq(jiffies, transaction->t_expires)) {
1816
1817
1818
1819
1820 jbd_debug(2, "transaction too old, requesting commit for "
1821 "handle %p\n", handle);
1822
1823 jbd2_log_start_commit(journal, transaction->t_tid);
1824
1825
1826
1827
1828
1829 if (handle->h_sync && !(current->flags & PF_MEMALLOC))
1830 wait_for_commit = 1;
1831 }
1832
1833
1834
1835
1836
1837
1838
1839 tid = transaction->t_tid;
1840 if (atomic_dec_and_test(&transaction->t_updates)) {
1841 wake_up(&journal->j_wait_updates);
1842 if (journal->j_barrier_count)
1843 wake_up(&journal->j_wait_transaction_locked);
1844 }
1845
1846 rwsem_release(&journal->j_trans_commit_map, 1, _THIS_IP_);
1847
1848 if (wait_for_commit)
1849 err = jbd2_log_wait_commit(journal, tid);
1850
1851 if (handle->h_rsv_handle)
1852 jbd2_journal_free_reserved(handle->h_rsv_handle);
1853free_and_exit:
1854
1855
1856
1857
1858 memalloc_nofs_restore(handle->saved_alloc_context);
1859 jbd2_free_handle(handle);
1860 return err;
1861}
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879static inline void
1880__blist_add_buffer(struct journal_head **list, struct journal_head *jh)
1881{
1882 if (!*list) {
1883 jh->b_tnext = jh->b_tprev = jh;
1884 *list = jh;
1885 } else {
1886
1887 struct journal_head *first = *list, *last = first->b_tprev;
1888 jh->b_tprev = last;
1889 jh->b_tnext = first;
1890 last->b_tnext = first->b_tprev = jh;
1891 }
1892}
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903static inline void
1904__blist_del_buffer(struct journal_head **list, struct journal_head *jh)
1905{
1906 if (*list == jh) {
1907 *list = jh->b_tnext;
1908 if (*list == jh)
1909 *list = NULL;
1910 }
1911 jh->b_tprev->b_tnext = jh->b_tnext;
1912 jh->b_tnext->b_tprev = jh->b_tprev;
1913}
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926static void __jbd2_journal_temp_unlink_buffer(struct journal_head *jh)
1927{
1928 struct journal_head **list = NULL;
1929 transaction_t *transaction;
1930 struct buffer_head *bh = jh2bh(jh);
1931
1932 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh));
1933 transaction = jh->b_transaction;
1934 if (transaction)
1935 assert_spin_locked(&transaction->t_journal->j_list_lock);
1936
1937 J_ASSERT_JH(jh, jh->b_jlist < BJ_Types);
1938 if (jh->b_jlist != BJ_None)
1939 J_ASSERT_JH(jh, transaction != NULL);
1940
1941 switch (jh->b_jlist) {
1942 case BJ_None:
1943 return;
1944 case BJ_Metadata:
1945 transaction->t_nr_buffers--;
1946 J_ASSERT_JH(jh, transaction->t_nr_buffers >= 0);
1947 list = &transaction->t_buffers;
1948 break;
1949 case BJ_Forget:
1950 list = &transaction->t_forget;
1951 break;
1952 case BJ_Shadow:
1953 list = &transaction->t_shadow_list;
1954 break;
1955 case BJ_Reserved:
1956 list = &transaction->t_reserved_list;
1957 break;
1958 }
1959
1960 __blist_del_buffer(list, jh);
1961 jh->b_jlist = BJ_None;
1962 if (transaction && is_journal_aborted(transaction->t_journal))
1963 clear_buffer_jbddirty(bh);
1964 else if (test_clear_buffer_jbddirty(bh))
1965 mark_buffer_dirty(bh);
1966}
1967
1968
1969
1970
1971
1972
1973
1974
1975static void __jbd2_journal_unfile_buffer(struct journal_head *jh)
1976{
1977 __jbd2_journal_temp_unlink_buffer(jh);
1978 jh->b_transaction = NULL;
1979 jbd2_journal_put_journal_head(jh);
1980}
1981
1982void jbd2_journal_unfile_buffer(journal_t *journal, struct journal_head *jh)
1983{
1984 struct buffer_head *bh = jh2bh(jh);
1985
1986
1987 get_bh(bh);
1988 jbd_lock_bh_state(bh);
1989 spin_lock(&journal->j_list_lock);
1990 __jbd2_journal_unfile_buffer(jh);
1991 spin_unlock(&journal->j_list_lock);
1992 jbd_unlock_bh_state(bh);
1993 __brelse(bh);
1994}
1995
1996
1997
1998
1999
2000
2001static void
2002__journal_try_to_free_buffer(journal_t *journal, struct buffer_head *bh)
2003{
2004 struct journal_head *jh;
2005
2006 jh = bh2jh(bh);
2007
2008 if (buffer_locked(bh) || buffer_dirty(bh))
2009 goto out;
2010
2011 if (jh->b_next_transaction != NULL || jh->b_transaction != NULL)
2012 goto out;
2013
2014 spin_lock(&journal->j_list_lock);
2015 if (jh->b_cp_transaction != NULL) {
2016
2017 JBUFFER_TRACE(jh, "remove from checkpoint list");
2018 __jbd2_journal_remove_checkpoint(jh);
2019 }
2020 spin_unlock(&journal->j_list_lock);
2021out:
2022 return;
2023}
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063int jbd2_journal_try_to_free_buffers(journal_t *journal,
2064 struct page *page, gfp_t gfp_mask)
2065{
2066 struct buffer_head *head;
2067 struct buffer_head *bh;
2068 int ret = 0;
2069
2070 J_ASSERT(PageLocked(page));
2071
2072 head = page_buffers(page);
2073 bh = head;
2074 do {
2075 struct journal_head *jh;
2076
2077
2078
2079
2080
2081
2082 jh = jbd2_journal_grab_journal_head(bh);
2083 if (!jh)
2084 continue;
2085
2086 jbd_lock_bh_state(bh);
2087 __journal_try_to_free_buffer(journal, bh);
2088 jbd2_journal_put_journal_head(jh);
2089 jbd_unlock_bh_state(bh);
2090 if (buffer_jbd(bh))
2091 goto busy;
2092 } while ((bh = bh->b_this_page) != head);
2093
2094 ret = try_to_free_buffers(page);
2095
2096busy:
2097 return ret;
2098}
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112static int __dispose_buffer(struct journal_head *jh, transaction_t *transaction)
2113{
2114 int may_free = 1;
2115 struct buffer_head *bh = jh2bh(jh);
2116
2117 if (jh->b_cp_transaction) {
2118 JBUFFER_TRACE(jh, "on running+cp transaction");
2119 __jbd2_journal_temp_unlink_buffer(jh);
2120
2121
2122
2123
2124
2125 clear_buffer_dirty(bh);
2126 __jbd2_journal_file_buffer(jh, transaction, BJ_Forget);
2127 may_free = 0;
2128 } else {
2129 JBUFFER_TRACE(jh, "on running transaction");
2130 __jbd2_journal_unfile_buffer(jh);
2131 }
2132 return may_free;
2133}
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh,
2183 int partial_page)
2184{
2185 transaction_t *transaction;
2186 struct journal_head *jh;
2187 int may_free = 1;
2188
2189 BUFFER_TRACE(bh, "entry");
2190
2191
2192
2193
2194
2195
2196
2197 if (!buffer_jbd(bh))
2198 goto zap_buffer_unlocked;
2199
2200
2201 write_lock(&journal->j_state_lock);
2202 jbd_lock_bh_state(bh);
2203 spin_lock(&journal->j_list_lock);
2204
2205 jh = jbd2_journal_grab_journal_head(bh);
2206 if (!jh)
2207 goto zap_buffer_no_jh;
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232 transaction = jh->b_transaction;
2233 if (transaction == NULL) {
2234
2235
2236
2237
2238 if (!jh->b_cp_transaction) {
2239 JBUFFER_TRACE(jh, "not on any transaction: zap");
2240 goto zap_buffer;
2241 }
2242
2243 if (!buffer_dirty(bh)) {
2244
2245 __jbd2_journal_remove_checkpoint(jh);
2246 goto zap_buffer;
2247 }
2248
2249
2250
2251
2252
2253 if (journal->j_running_transaction) {
2254
2255
2256
2257 JBUFFER_TRACE(jh, "checkpointed: add to BJ_Forget");
2258 may_free = __dispose_buffer(jh,
2259 journal->j_running_transaction);
2260 goto zap_buffer;
2261 } else {
2262
2263
2264
2265
2266 if (journal->j_committing_transaction) {
2267 JBUFFER_TRACE(jh, "give to committing trans");
2268 may_free = __dispose_buffer(jh,
2269 journal->j_committing_transaction);
2270 goto zap_buffer;
2271 } else {
2272
2273
2274 clear_buffer_jbddirty(bh);
2275 __jbd2_journal_remove_checkpoint(jh);
2276 goto zap_buffer;
2277 }
2278 }
2279 } else if (transaction == journal->j_committing_transaction) {
2280 JBUFFER_TRACE(jh, "on committing transaction");
2281
2282
2283
2284
2285
2286 if (partial_page) {
2287 jbd2_journal_put_journal_head(jh);
2288 spin_unlock(&journal->j_list_lock);
2289 jbd_unlock_bh_state(bh);
2290 write_unlock(&journal->j_state_lock);
2291 return -EBUSY;
2292 }
2293
2294
2295
2296
2297
2298
2299 set_buffer_freed(bh);
2300 if (journal->j_running_transaction && buffer_jbddirty(bh))
2301 jh->b_next_transaction = journal->j_running_transaction;
2302 jbd2_journal_put_journal_head(jh);
2303 spin_unlock(&journal->j_list_lock);
2304 jbd_unlock_bh_state(bh);
2305 write_unlock(&journal->j_state_lock);
2306 return 0;
2307 } else {
2308
2309
2310
2311
2312
2313
2314 J_ASSERT_JH(jh, transaction == journal->j_running_transaction);
2315 JBUFFER_TRACE(jh, "on running transaction");
2316 may_free = __dispose_buffer(jh, transaction);
2317 }
2318
2319zap_buffer:
2320
2321
2322
2323
2324
2325
2326
2327
2328 jh->b_modified = 0;
2329 jbd2_journal_put_journal_head(jh);
2330zap_buffer_no_jh:
2331 spin_unlock(&journal->j_list_lock);
2332 jbd_unlock_bh_state(bh);
2333 write_unlock(&journal->j_state_lock);
2334zap_buffer_unlocked:
2335 clear_buffer_dirty(bh);
2336 J_ASSERT_BH(bh, !buffer_jbddirty(bh));
2337 clear_buffer_mapped(bh);
2338 clear_buffer_req(bh);
2339 clear_buffer_new(bh);
2340 clear_buffer_delay(bh);
2341 clear_buffer_unwritten(bh);
2342 bh->b_bdev = NULL;
2343 return may_free;
2344}
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358int jbd2_journal_invalidatepage(journal_t *journal,
2359 struct page *page,
2360 unsigned int offset,
2361 unsigned int length)
2362{
2363 struct buffer_head *head, *bh, *next;
2364 unsigned int stop = offset + length;
2365 unsigned int curr_off = 0;
2366 int partial_page = (offset || length < PAGE_SIZE);
2367 int may_free = 1;
2368 int ret = 0;
2369
2370 if (!PageLocked(page))
2371 BUG();
2372 if (!page_has_buffers(page))
2373 return 0;
2374
2375 BUG_ON(stop > PAGE_SIZE || stop < length);
2376
2377
2378
2379
2380
2381 head = bh = page_buffers(page);
2382 do {
2383 unsigned int next_off = curr_off + bh->b_size;
2384 next = bh->b_this_page;
2385
2386 if (next_off > stop)
2387 return 0;
2388
2389 if (offset <= curr_off) {
2390
2391 lock_buffer(bh);
2392 ret = journal_unmap_buffer(journal, bh, partial_page);
2393 unlock_buffer(bh);
2394 if (ret < 0)
2395 return ret;
2396 may_free &= ret;
2397 }
2398 curr_off = next_off;
2399 bh = next;
2400
2401 } while (bh != head);
2402
2403 if (!partial_page) {
2404 if (may_free && try_to_free_buffers(page))
2405 J_ASSERT(!page_has_buffers(page));
2406 }
2407 return 0;
2408}
2409
2410
2411
2412
2413void __jbd2_journal_file_buffer(struct journal_head *jh,
2414 transaction_t *transaction, int jlist)
2415{
2416 struct journal_head **list = NULL;
2417 int was_dirty = 0;
2418 struct buffer_head *bh = jh2bh(jh);
2419
2420 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh));
2421 assert_spin_locked(&transaction->t_journal->j_list_lock);
2422
2423 J_ASSERT_JH(jh, jh->b_jlist < BJ_Types);
2424 J_ASSERT_JH(jh, jh->b_transaction == transaction ||
2425 jh->b_transaction == NULL);
2426
2427 if (jh->b_transaction && jh->b_jlist == jlist)
2428 return;
2429
2430 if (jlist == BJ_Metadata || jlist == BJ_Reserved ||
2431 jlist == BJ_Shadow || jlist == BJ_Forget) {
2432
2433
2434
2435
2436
2437
2438
2439 if (buffer_dirty(bh))
2440 warn_dirty_buffer(bh);
2441 if (test_clear_buffer_dirty(bh) ||
2442 test_clear_buffer_jbddirty(bh))
2443 was_dirty = 1;
2444 }
2445
2446 if (jh->b_transaction)
2447 __jbd2_journal_temp_unlink_buffer(jh);
2448 else
2449 jbd2_journal_grab_journal_head(bh);
2450 jh->b_transaction = transaction;
2451
2452 switch (jlist) {
2453 case BJ_None:
2454 J_ASSERT_JH(jh, !jh->b_committed_data);
2455 J_ASSERT_JH(jh, !jh->b_frozen_data);
2456 return;
2457 case BJ_Metadata:
2458 transaction->t_nr_buffers++;
2459 list = &transaction->t_buffers;
2460 break;
2461 case BJ_Forget:
2462 list = &transaction->t_forget;
2463 break;
2464 case BJ_Shadow:
2465 list = &transaction->t_shadow_list;
2466 break;
2467 case BJ_Reserved:
2468 list = &transaction->t_reserved_list;
2469 break;
2470 }
2471
2472 __blist_add_buffer(list, jh);
2473 jh->b_jlist = jlist;
2474
2475 if (was_dirty)
2476 set_buffer_jbddirty(bh);
2477}
2478
2479void jbd2_journal_file_buffer(struct journal_head *jh,
2480 transaction_t *transaction, int jlist)
2481{
2482 jbd_lock_bh_state(jh2bh(jh));
2483 spin_lock(&transaction->t_journal->j_list_lock);
2484 __jbd2_journal_file_buffer(jh, transaction, jlist);
2485 spin_unlock(&transaction->t_journal->j_list_lock);
2486 jbd_unlock_bh_state(jh2bh(jh));
2487}
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500void __jbd2_journal_refile_buffer(struct journal_head *jh)
2501{
2502 int was_dirty, jlist;
2503 struct buffer_head *bh = jh2bh(jh);
2504
2505 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh));
2506 if (jh->b_transaction)
2507 assert_spin_locked(&jh->b_transaction->t_journal->j_list_lock);
2508
2509
2510 if (jh->b_next_transaction == NULL) {
2511 __jbd2_journal_unfile_buffer(jh);
2512 return;
2513 }
2514
2515
2516
2517
2518
2519
2520 was_dirty = test_clear_buffer_jbddirty(bh);
2521 __jbd2_journal_temp_unlink_buffer(jh);
2522
2523
2524
2525
2526
2527 jh->b_transaction = jh->b_next_transaction;
2528 jh->b_next_transaction = NULL;
2529 if (buffer_freed(bh))
2530 jlist = BJ_Forget;
2531 else if (jh->b_modified)
2532 jlist = BJ_Metadata;
2533 else
2534 jlist = BJ_Reserved;
2535 __jbd2_journal_file_buffer(jh, jh->b_transaction, jlist);
2536 J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING);
2537
2538 if (was_dirty)
2539 set_buffer_jbddirty(bh);
2540}
2541
2542
2543
2544
2545
2546
2547
2548void jbd2_journal_refile_buffer(journal_t *journal, struct journal_head *jh)
2549{
2550 struct buffer_head *bh = jh2bh(jh);
2551
2552
2553 get_bh(bh);
2554 jbd_lock_bh_state(bh);
2555 spin_lock(&journal->j_list_lock);
2556 __jbd2_journal_refile_buffer(jh);
2557 jbd_unlock_bh_state(bh);
2558 spin_unlock(&journal->j_list_lock);
2559 __brelse(bh);
2560}
2561
2562
2563
2564
2565static int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode,
2566 unsigned long flags)
2567{
2568 transaction_t *transaction = handle->h_transaction;
2569 journal_t *journal;
2570
2571 if (is_handle_aborted(handle))
2572 return -EROFS;
2573 journal = transaction->t_journal;
2574
2575 jbd_debug(4, "Adding inode %lu, tid:%d\n", jinode->i_vfs_inode->i_ino,
2576 transaction->t_tid);
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591 if ((jinode->i_transaction == transaction ||
2592 jinode->i_next_transaction == transaction) &&
2593 (jinode->i_flags & flags) == flags)
2594 return 0;
2595
2596 spin_lock(&journal->j_list_lock);
2597 jinode->i_flags |= flags;
2598
2599 if (jinode->i_transaction == transaction ||
2600 jinode->i_next_transaction == transaction)
2601 goto done;
2602
2603
2604
2605
2606
2607
2608 if (!transaction->t_need_data_flush)
2609 transaction->t_need_data_flush = 1;
2610
2611
2612 if (jinode->i_transaction) {
2613 J_ASSERT(jinode->i_next_transaction == NULL);
2614 J_ASSERT(jinode->i_transaction ==
2615 journal->j_committing_transaction);
2616 jinode->i_next_transaction = transaction;
2617 goto done;
2618 }
2619
2620 J_ASSERT(!jinode->i_next_transaction);
2621 jinode->i_transaction = transaction;
2622 list_add(&jinode->i_list, &transaction->t_inode_list);
2623done:
2624 spin_unlock(&journal->j_list_lock);
2625
2626 return 0;
2627}
2628
2629int jbd2_journal_inode_add_write(handle_t *handle, struct jbd2_inode *jinode)
2630{
2631 return jbd2_journal_file_inode(handle, jinode,
2632 JI_WRITE_DATA | JI_WAIT_DATA);
2633}
2634
2635int jbd2_journal_inode_add_wait(handle_t *handle, struct jbd2_inode *jinode)
2636{
2637 return jbd2_journal_file_inode(handle, jinode, JI_WAIT_DATA);
2638}
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660int jbd2_journal_begin_ordered_truncate(journal_t *journal,
2661 struct jbd2_inode *jinode,
2662 loff_t new_size)
2663{
2664 transaction_t *inode_trans, *commit_trans;
2665 int ret = 0;
2666
2667
2668 if (!jinode->i_transaction)
2669 goto out;
2670
2671
2672
2673 read_lock(&journal->j_state_lock);
2674 commit_trans = journal->j_committing_transaction;
2675 read_unlock(&journal->j_state_lock);
2676 spin_lock(&journal->j_list_lock);
2677 inode_trans = jinode->i_transaction;
2678 spin_unlock(&journal->j_list_lock);
2679 if (inode_trans == commit_trans) {
2680 ret = filemap_fdatawrite_range(jinode->i_vfs_inode->i_mapping,
2681 new_size, LLONG_MAX);
2682 if (ret)
2683 jbd2_journal_abort(journal, ret);
2684 }
2685out:
2686 return ret;
2687}
2688