1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef _LINUX_JBD2_H
17#define _LINUX_JBD2_H
18
19
20#ifndef __KERNEL__
21#include "jfs_compat.h"
22#define JBD2_DEBUG
23#else
24
25#include <linux/types.h>
26#include <linux/buffer_head.h>
27#include <linux/journal-head.h>
28#include <linux/stddef.h>
29#include <linux/mutex.h>
30#include <linux/timer.h>
31#include <linux/slab.h>
32#include <linux/bit_spinlock.h>
33#include <crypto/hash.h>
34#endif
35
36#define journal_oom_retry 1
37
38
39
40
41
42
43
44
45#undef JBD2_PARANOID_IOFAIL
46
47
48
49
50#define JBD2_DEFAULT_MAX_COMMIT_AGE 5
51
52#ifdef CONFIG_JBD2_DEBUG
53
54
55
56
57
58#define JBD2_EXPENSIVE_CHECKING
59extern ushort jbd2_journal_enable_debug;
60void __jbd2_debug(int level, const char *file, const char *func,
61 unsigned int line, const char *fmt, ...);
62
63#define jbd_debug(n, fmt, a...) \
64 __jbd2_debug((n), __FILE__, __func__, __LINE__, (fmt), ##a)
65#else
66#define jbd_debug(n, fmt, a...)
67#endif
68
69extern void *jbd2_alloc(size_t size, gfp_t flags);
70extern void jbd2_free(void *ptr, size_t size);
71
72#define JBD2_MIN_JOURNAL_BLOCKS 1024
73
74#ifdef __KERNEL__
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93typedef struct jbd2_journal_handle handle_t;
94
95
96
97
98
99
100
101
102
103
104
105
106
107typedef struct journal_s journal_t;
108#endif
109
110
111
112
113
114#define JBD2_MAGIC_NUMBER 0xc03b3998U
115
116
117
118
119
120
121
122
123
124#define JBD2_DESCRIPTOR_BLOCK 1
125#define JBD2_COMMIT_BLOCK 2
126#define JBD2_SUPERBLOCK_V1 3
127#define JBD2_SUPERBLOCK_V2 4
128#define JBD2_REVOKE_BLOCK 5
129
130
131
132
133typedef struct journal_header_s
134{
135 __be32 h_magic;
136 __be32 h_blocktype;
137 __be32 h_sequence;
138} journal_header_t;
139
140
141
142
143#define JBD2_CRC32_CHKSUM 1
144#define JBD2_MD5_CHKSUM 2
145#define JBD2_SHA1_CHKSUM 3
146#define JBD2_CRC32C_CHKSUM 4
147
148#define JBD2_CRC32_CHKSUM_SIZE 4
149
150#define JBD2_CHECKSUM_BYTES (32 / sizeof(u32))
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169struct commit_header {
170 __be32 h_magic;
171 __be32 h_blocktype;
172 __be32 h_sequence;
173 unsigned char h_chksum_type;
174 unsigned char h_chksum_size;
175 unsigned char h_padding[2];
176 __be32 h_chksum[JBD2_CHECKSUM_BYTES];
177 __be64 h_commit_sec;
178 __be32 h_commit_nsec;
179};
180
181
182
183
184
185
186
187typedef struct journal_block_tag3_s
188{
189 __be32 t_blocknr;
190 __be32 t_flags;
191 __be32 t_blocknr_high;
192 __be32 t_checksum;
193} journal_block_tag3_t;
194
195typedef struct journal_block_tag_s
196{
197 __be32 t_blocknr;
198 __be16 t_checksum;
199 __be16 t_flags;
200 __be32 t_blocknr_high;
201} journal_block_tag_t;
202
203
204struct jbd2_journal_block_tail {
205 __be32 t_checksum;
206};
207
208
209
210
211
212typedef struct jbd2_journal_revoke_header_s
213{
214 journal_header_t r_header;
215 __be32 r_count;
216} jbd2_journal_revoke_header_t;
217
218
219#define JBD2_FLAG_ESCAPE 1
220#define JBD2_FLAG_SAME_UUID 2
221#define JBD2_FLAG_DELETED 4
222#define JBD2_FLAG_LAST_TAG 8
223
224
225
226
227
228typedef struct journal_superblock_s
229{
230
231 journal_header_t s_header;
232
233
234
235 __be32 s_blocksize;
236 __be32 s_maxlen;
237 __be32 s_first;
238
239
240
241 __be32 s_sequence;
242 __be32 s_start;
243
244
245
246 __be32 s_errno;
247
248
249
250 __be32 s_feature_compat;
251 __be32 s_feature_incompat;
252 __be32 s_feature_ro_compat;
253
254 __u8 s_uuid[16];
255
256
257 __be32 s_nr_users;
258
259 __be32 s_dynsuper;
260
261
262 __be32 s_max_transaction;
263 __be32 s_max_trans_data;
264
265
266 __u8 s_checksum_type;
267 __u8 s_padding2[3];
268 __u32 s_padding[42];
269 __be32 s_checksum;
270
271
272 __u8 s_users[16*48];
273
274} journal_superblock_t;
275
276
277#define JBD2_HAS_COMPAT_FEATURE(j,mask) \
278 ((j)->j_format_version >= 2 && \
279 ((j)->j_superblock->s_feature_compat & cpu_to_be32((mask))))
280#define JBD2_HAS_RO_COMPAT_FEATURE(j,mask) \
281 ((j)->j_format_version >= 2 && \
282 ((j)->j_superblock->s_feature_ro_compat & cpu_to_be32((mask))))
283#define JBD2_HAS_INCOMPAT_FEATURE(j,mask) \
284 ((j)->j_format_version >= 2 && \
285 ((j)->j_superblock->s_feature_incompat & cpu_to_be32((mask))))
286
287#define JBD2_FEATURE_COMPAT_CHECKSUM 0x00000001
288
289#define JBD2_FEATURE_INCOMPAT_REVOKE 0x00000001
290#define JBD2_FEATURE_INCOMPAT_64BIT 0x00000002
291#define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004
292#define JBD2_FEATURE_INCOMPAT_CSUM_V2 0x00000008
293#define JBD2_FEATURE_INCOMPAT_CSUM_V3 0x00000010
294
295
296
297
298#define JBD2_KNOWN_COMPAT_FEATURES JBD2_FEATURE_COMPAT_CHECKSUM
299#define JBD2_KNOWN_ROCOMPAT_FEATURES 0
300#define JBD2_KNOWN_INCOMPAT_FEATURES (JBD2_FEATURE_INCOMPAT_REVOKE | \
301 JBD2_FEATURE_INCOMPAT_64BIT | \
302 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT | \
303 JBD2_FEATURE_INCOMPAT_CSUM_V2 | \
304 JBD2_FEATURE_INCOMPAT_CSUM_V3)
305
306#ifdef __KERNEL__
307
308#include <linux/fs.h>
309#include <linux/sched.h>
310
311enum jbd_state_bits {
312 BH_JBD
313 = BH_PrivateStart,
314 BH_JWrite,
315 BH_Freed,
316 BH_Revoked,
317 BH_RevokeValid,
318 BH_JBDDirty,
319 BH_State,
320 BH_JournalHead,
321 BH_Shadow,
322 BH_Verified,
323 BH_JBDPrivateStart,
324};
325
326BUFFER_FNS(JBD, jbd)
327BUFFER_FNS(JWrite, jwrite)
328BUFFER_FNS(JBDDirty, jbddirty)
329TAS_BUFFER_FNS(JBDDirty, jbddirty)
330BUFFER_FNS(Revoked, revoked)
331TAS_BUFFER_FNS(Revoked, revoked)
332BUFFER_FNS(RevokeValid, revokevalid)
333TAS_BUFFER_FNS(RevokeValid, revokevalid)
334BUFFER_FNS(Freed, freed)
335BUFFER_FNS(Shadow, shadow)
336BUFFER_FNS(Verified, verified)
337
338static inline struct buffer_head *jh2bh(struct journal_head *jh)
339{
340 return jh->b_bh;
341}
342
343static inline struct journal_head *bh2jh(struct buffer_head *bh)
344{
345 return bh->b_private;
346}
347
348static inline void jbd_lock_bh_state(struct buffer_head *bh)
349{
350 bit_spin_lock(BH_State, &bh->b_state);
351}
352
353static inline int jbd_trylock_bh_state(struct buffer_head *bh)
354{
355 return bit_spin_trylock(BH_State, &bh->b_state);
356}
357
358static inline int jbd_is_locked_bh_state(struct buffer_head *bh)
359{
360 return bit_spin_is_locked(BH_State, &bh->b_state);
361}
362
363static inline void jbd_unlock_bh_state(struct buffer_head *bh)
364{
365 bit_spin_unlock(BH_State, &bh->b_state);
366}
367
368static inline void jbd_lock_bh_journal_head(struct buffer_head *bh)
369{
370 bit_spin_lock(BH_JournalHead, &bh->b_state);
371}
372
373static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh)
374{
375 bit_spin_unlock(BH_JournalHead, &bh->b_state);
376}
377
378#define J_ASSERT(assert) BUG_ON(!(assert))
379
380#define J_ASSERT_BH(bh, expr) J_ASSERT(expr)
381#define J_ASSERT_JH(jh, expr) J_ASSERT(expr)
382
383#if defined(JBD2_PARANOID_IOFAIL)
384#define J_EXPECT(expr, why...) J_ASSERT(expr)
385#define J_EXPECT_BH(bh, expr, why...) J_ASSERT_BH(bh, expr)
386#define J_EXPECT_JH(jh, expr, why...) J_ASSERT_JH(jh, expr)
387#else
388#define __journal_expect(expr, why...) \
389 ({ \
390 int val = (expr); \
391 if (!val) { \
392 printk(KERN_ERR \
393 "JBD2 unexpected failure: %s: %s;\n", \
394 __func__, #expr); \
395 printk(KERN_ERR why "\n"); \
396 } \
397 val; \
398 })
399#define J_EXPECT(expr, why...) __journal_expect(expr, ## why)
400#define J_EXPECT_BH(bh, expr, why...) __journal_expect(expr, ## why)
401#define J_EXPECT_JH(jh, expr, why...) __journal_expect(expr, ## why)
402#endif
403
404
405#define __JI_COMMIT_RUNNING 0
406#define __JI_WRITE_DATA 1
407#define __JI_WAIT_DATA 2
408
409
410
411
412
413
414#define JI_COMMIT_RUNNING (1 << __JI_COMMIT_RUNNING)
415
416#define JI_WRITE_DATA (1 << __JI_WRITE_DATA)
417
418#define JI_WAIT_DATA (1 << __JI_WAIT_DATA)
419
420
421
422
423
424struct jbd2_inode {
425
426
427 transaction_t *i_transaction;
428
429
430
431 transaction_t *i_next_transaction;
432
433
434 struct list_head i_list;
435
436
437
438 struct inode *i_vfs_inode;
439
440
441 unsigned long i_flags;
442};
443
444struct jbd2_revoke_table_s;
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462struct jbd2_journal_handle
463{
464 union {
465
466 transaction_t *h_transaction;
467
468 journal_t *h_journal;
469 };
470
471
472 handle_t *h_rsv_handle;
473
474
475 int h_buffer_credits;
476
477
478 int h_ref;
479
480
481
482 int h_err;
483
484
485 unsigned int h_sync: 1;
486 unsigned int h_jdata: 1;
487 unsigned int h_reserved: 1;
488 unsigned int h_aborted: 1;
489 unsigned int h_type: 8;
490 unsigned int h_line_no: 16;
491
492 unsigned long h_start_jiffies;
493 unsigned int h_requested_credits;
494
495 unsigned int saved_alloc_context;
496};
497
498
499
500
501
502struct transaction_chp_stats_s {
503 unsigned long cs_chp_time;
504 __u32 cs_forced_to_close;
505 __u32 cs_written;
506 __u32 cs_dropped;
507};
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545struct transaction_s
546{
547
548 journal_t *t_journal;
549
550
551 tid_t t_tid;
552
553
554
555
556
557
558
559
560
561 enum {
562 T_RUNNING,
563 T_LOCKED,
564 T_FLUSH,
565 T_COMMIT,
566 T_COMMIT_DFLUSH,
567 T_COMMIT_JFLUSH,
568 T_COMMIT_CALLBACK,
569 T_FINISHED
570 } t_state;
571
572
573
574
575 unsigned long t_log_start;
576
577
578 int t_nr_buffers;
579
580
581
582
583
584 struct journal_head *t_reserved_list;
585
586
587
588
589
590 struct journal_head *t_buffers;
591
592
593
594
595
596
597 struct journal_head *t_forget;
598
599
600
601
602
603 struct journal_head *t_checkpoint_list;
604
605
606
607
608
609 struct journal_head *t_checkpoint_io_list;
610
611
612
613
614
615
616 struct journal_head *t_shadow_list;
617
618
619
620
621
622 struct list_head t_inode_list;
623
624
625
626
627 spinlock_t t_handle_lock;
628
629
630
631
632 unsigned long t_max_wait;
633
634
635
636
637 unsigned long t_start;
638
639
640
641
642 unsigned long t_requested;
643
644
645
646
647 struct transaction_chp_stats_s t_chp_stats;
648
649
650
651
652
653 atomic_t t_updates;
654
655
656
657
658
659 atomic_t t_outstanding_credits;
660
661
662
663
664
665 transaction_t *t_cpnext, *t_cpprev;
666
667
668
669
670
671 unsigned long t_expires;
672
673
674
675
676 ktime_t t_start_time;
677
678
679
680
681 atomic_t t_handle_count;
682
683
684
685
686
687 unsigned int t_synchronous_commit:1;
688
689
690 int t_need_data_flush;
691
692
693
694
695
696 struct list_head t_private_list;
697};
698
699struct transaction_run_stats_s {
700 unsigned long rs_wait;
701 unsigned long rs_request_delay;
702 unsigned long rs_running;
703 unsigned long rs_locked;
704 unsigned long rs_flushing;
705 unsigned long rs_logging;
706
707 __u32 rs_handle_count;
708 __u32 rs_blocks;
709 __u32 rs_blocks_logged;
710};
711
712struct transaction_stats_s {
713 unsigned long ts_tid;
714 unsigned long ts_requested;
715 struct transaction_run_stats_s run;
716};
717
718static inline unsigned long
719jbd2_time_diff(unsigned long start, unsigned long end)
720{
721 if (end >= start)
722 return end - start;
723
724 return end + (MAX_JIFFY_OFFSET - start);
725}
726
727#define JBD2_NR_BATCH 64
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797struct journal_s
798{
799
800 unsigned long j_flags;
801
802
803
804
805
806 int j_errno;
807
808
809 struct buffer_head *j_sb_buffer;
810 journal_superblock_t *j_superblock;
811
812
813 int j_format_version;
814
815
816
817
818 rwlock_t j_state_lock;
819
820
821
822
823 int j_barrier_count;
824
825
826 struct mutex j_barrier;
827
828
829
830
831
832 transaction_t *j_running_transaction;
833
834
835
836
837
838 transaction_t *j_committing_transaction;
839
840
841
842
843
844 transaction_t *j_checkpoint_transactions;
845
846
847
848
849
850 wait_queue_head_t j_wait_transaction_locked;
851
852
853 wait_queue_head_t j_wait_done_commit;
854
855
856 wait_queue_head_t j_wait_commit;
857
858
859 wait_queue_head_t j_wait_updates;
860
861
862 wait_queue_head_t j_wait_reserved;
863
864
865 struct mutex j_checkpoint_mutex;
866
867
868
869
870
871
872
873 struct buffer_head *j_chkpt_bhs[JBD2_NR_BATCH];
874
875
876
877
878
879 unsigned long j_head;
880
881
882
883
884
885 unsigned long j_tail;
886
887
888
889
890
891 unsigned long j_free;
892
893
894
895
896
897 unsigned long j_first;
898 unsigned long j_last;
899
900
901
902
903
904 struct block_device *j_dev;
905 int j_blocksize;
906 unsigned long long j_blk_offset;
907 char j_devname[BDEVNAME_SIZE+24];
908
909
910
911
912
913 struct block_device *j_fs_dev;
914
915
916 unsigned int j_maxlen;
917
918
919 atomic_t j_reserved_credits;
920
921
922
923
924 spinlock_t j_list_lock;
925
926
927
928
929 struct inode *j_inode;
930
931
932
933
934 tid_t j_tail_sequence;
935
936
937
938
939 tid_t j_transaction_sequence;
940
941
942
943
944
945 tid_t j_commit_sequence;
946
947
948
949
950
951 tid_t j_commit_request;
952
953
954
955
956
957
958
959 __u8 j_uuid[16];
960
961
962 struct task_struct *j_task;
963
964
965
966
967
968 int j_max_transaction_buffers;
969
970
971
972
973 unsigned long j_commit_interval;
974
975
976 struct timer_list j_commit_timer;
977
978
979
980
981
982 spinlock_t j_revoke_lock;
983 struct jbd2_revoke_table_s *j_revoke;
984 struct jbd2_revoke_table_s *j_revoke_table[2];
985
986
987
988
989 struct buffer_head **j_wbuf;
990 int j_wbufsize;
991
992
993
994
995
996 pid_t j_last_sync_writer;
997
998
999
1000
1001
1002 u64 j_average_commit_time;
1003
1004
1005
1006
1007
1008
1009 u32 j_min_batch_time;
1010 u32 j_max_batch_time;
1011
1012
1013 void (*j_commit_callback)(journal_t *,
1014 transaction_t *);
1015
1016
1017
1018
1019 spinlock_t j_history_lock;
1020 struct proc_dir_entry *j_proc_entry;
1021 struct transaction_stats_s j_stats;
1022
1023
1024 unsigned int j_failed_commit;
1025
1026
1027
1028
1029
1030 void *j_private;
1031
1032
1033 struct crypto_shash *j_chksum_driver;
1034
1035
1036 __u32 j_csum_seed;
1037
1038#ifdef CONFIG_DEBUG_LOCK_ALLOC
1039
1040
1041
1042
1043
1044
1045
1046
1047 struct lockdep_map j_trans_commit_map;
1048#endif
1049};
1050
1051#define jbd2_might_wait_for_commit(j) \
1052 do { \
1053 rwsem_acquire(&j->j_trans_commit_map, 0, 0, _THIS_IP_); \
1054 rwsem_release(&j->j_trans_commit_map, 1, _THIS_IP_); \
1055 } while (0)
1056
1057
1058#define JBD2_FEATURE_COMPAT_FUNCS(name, flagname) \
1059static inline bool jbd2_has_feature_##name(journal_t *j) \
1060{ \
1061 return ((j)->j_format_version >= 2 && \
1062 ((j)->j_superblock->s_feature_compat & \
1063 cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname)) != 0); \
1064} \
1065static inline void jbd2_set_feature_##name(journal_t *j) \
1066{ \
1067 (j)->j_superblock->s_feature_compat |= \
1068 cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname); \
1069} \
1070static inline void jbd2_clear_feature_##name(journal_t *j) \
1071{ \
1072 (j)->j_superblock->s_feature_compat &= \
1073 ~cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname); \
1074}
1075
1076#define JBD2_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
1077static inline bool jbd2_has_feature_##name(journal_t *j) \
1078{ \
1079 return ((j)->j_format_version >= 2 && \
1080 ((j)->j_superblock->s_feature_ro_compat & \
1081 cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname)) != 0); \
1082} \
1083static inline void jbd2_set_feature_##name(journal_t *j) \
1084{ \
1085 (j)->j_superblock->s_feature_ro_compat |= \
1086 cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname); \
1087} \
1088static inline void jbd2_clear_feature_##name(journal_t *j) \
1089{ \
1090 (j)->j_superblock->s_feature_ro_compat &= \
1091 ~cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname); \
1092}
1093
1094#define JBD2_FEATURE_INCOMPAT_FUNCS(name, flagname) \
1095static inline bool jbd2_has_feature_##name(journal_t *j) \
1096{ \
1097 return ((j)->j_format_version >= 2 && \
1098 ((j)->j_superblock->s_feature_incompat & \
1099 cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname)) != 0); \
1100} \
1101static inline void jbd2_set_feature_##name(journal_t *j) \
1102{ \
1103 (j)->j_superblock->s_feature_incompat |= \
1104 cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname); \
1105} \
1106static inline void jbd2_clear_feature_##name(journal_t *j) \
1107{ \
1108 (j)->j_superblock->s_feature_incompat &= \
1109 ~cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname); \
1110}
1111
1112JBD2_FEATURE_COMPAT_FUNCS(checksum, CHECKSUM)
1113
1114JBD2_FEATURE_INCOMPAT_FUNCS(revoke, REVOKE)
1115JBD2_FEATURE_INCOMPAT_FUNCS(64bit, 64BIT)
1116JBD2_FEATURE_INCOMPAT_FUNCS(async_commit, ASYNC_COMMIT)
1117JBD2_FEATURE_INCOMPAT_FUNCS(csum2, CSUM_V2)
1118JBD2_FEATURE_INCOMPAT_FUNCS(csum3, CSUM_V3)
1119
1120
1121
1122
1123#define JBD2_UNMOUNT 0x001
1124#define JBD2_ABORT 0x002
1125#define JBD2_ACK_ERR 0x004
1126#define JBD2_FLUSHED 0x008
1127#define JBD2_LOADED 0x010
1128#define JBD2_BARRIER 0x020
1129#define JBD2_ABORT_ON_SYNCDATA_ERR 0x040
1130
1131
1132#define JBD2_REC_ERR 0x080
1133
1134
1135
1136
1137
1138
1139
1140extern void jbd2_journal_unfile_buffer(journal_t *, struct journal_head *);
1141extern void __jbd2_journal_refile_buffer(struct journal_head *);
1142extern void jbd2_journal_refile_buffer(journal_t *, struct journal_head *);
1143extern void __jbd2_journal_file_buffer(struct journal_head *, transaction_t *, int);
1144extern void __journal_free_buffer(struct journal_head *bh);
1145extern void jbd2_journal_file_buffer(struct journal_head *, transaction_t *, int);
1146extern void __journal_clean_data_list(transaction_t *transaction);
1147static inline void jbd2_file_log_bh(struct list_head *head, struct buffer_head *bh)
1148{
1149 list_add_tail(&bh->b_assoc_buffers, head);
1150}
1151static inline void jbd2_unfile_log_bh(struct buffer_head *bh)
1152{
1153 list_del_init(&bh->b_assoc_buffers);
1154}
1155
1156
1157struct buffer_head *jbd2_journal_get_descriptor_buffer(transaction_t *, int);
1158void jbd2_descriptor_block_csum_set(journal_t *, struct buffer_head *);
1159int jbd2_journal_next_log_block(journal_t *, unsigned long long *);
1160int jbd2_journal_get_log_tail(journal_t *journal, tid_t *tid,
1161 unsigned long *block);
1162int __jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block);
1163void jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block);
1164
1165
1166extern void jbd2_journal_commit_transaction(journal_t *);
1167
1168
1169void __jbd2_journal_clean_checkpoint_list(journal_t *journal, bool destroy);
1170int __jbd2_journal_remove_checkpoint(struct journal_head *);
1171void jbd2_journal_destroy_checkpoint(journal_t *journal);
1172void __jbd2_journal_insert_checkpoint(struct journal_head *, transaction_t *);
1173
1174
1175
1176
1177
1178
1179struct jbd2_buffer_trigger_type {
1180
1181
1182
1183
1184
1185
1186 void (*t_frozen)(struct jbd2_buffer_trigger_type *type,
1187 struct buffer_head *bh, void *mapped_data,
1188 size_t size);
1189
1190
1191
1192
1193
1194 void (*t_abort)(struct jbd2_buffer_trigger_type *type,
1195 struct buffer_head *bh);
1196};
1197
1198extern void jbd2_buffer_frozen_trigger(struct journal_head *jh,
1199 void *mapped_data,
1200 struct jbd2_buffer_trigger_type *triggers);
1201extern void jbd2_buffer_abort_trigger(struct journal_head *jh,
1202 struct jbd2_buffer_trigger_type *triggers);
1203
1204
1205extern int jbd2_journal_write_metadata_buffer(transaction_t *transaction,
1206 struct journal_head *jh_in,
1207 struct buffer_head **bh_out,
1208 sector_t blocknr);
1209
1210
1211extern void __wait_on_journal (journal_t *);
1212
1213
1214extern void jbd2_journal_destroy_transaction_cache(void);
1215extern int jbd2_journal_init_transaction_cache(void);
1216extern void jbd2_journal_free_transaction(transaction_t *);
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229static inline handle_t *journal_current_handle(void)
1230{
1231 return current->journal_info;
1232}
1233
1234
1235
1236
1237
1238
1239
1240extern handle_t *jbd2_journal_start(journal_t *, int nblocks);
1241extern handle_t *jbd2__journal_start(journal_t *, int blocks, int rsv_blocks,
1242 gfp_t gfp_mask, unsigned int type,
1243 unsigned int line_no);
1244extern int jbd2_journal_restart(handle_t *, int nblocks);
1245extern int jbd2__journal_restart(handle_t *, int nblocks, gfp_t gfp_mask);
1246extern int jbd2_journal_start_reserved(handle_t *handle,
1247 unsigned int type, unsigned int line_no);
1248extern void jbd2_journal_free_reserved(handle_t *handle);
1249extern int jbd2_journal_extend (handle_t *, int nblocks);
1250extern int jbd2_journal_get_write_access(handle_t *, struct buffer_head *);
1251extern int jbd2_journal_get_create_access (handle_t *, struct buffer_head *);
1252extern int jbd2_journal_get_undo_access(handle_t *, struct buffer_head *);
1253void jbd2_journal_set_triggers(struct buffer_head *,
1254 struct jbd2_buffer_trigger_type *type);
1255extern int jbd2_journal_dirty_metadata (handle_t *, struct buffer_head *);
1256extern int jbd2_journal_forget (handle_t *, struct buffer_head *);
1257extern void journal_sync_buffer (struct buffer_head *);
1258extern int jbd2_journal_invalidatepage(journal_t *,
1259 struct page *, unsigned int, unsigned int);
1260extern int jbd2_journal_try_to_free_buffers(journal_t *, struct page *, gfp_t);
1261extern int jbd2_journal_stop(handle_t *);
1262extern int jbd2_journal_flush (journal_t *);
1263extern void jbd2_journal_lock_updates (journal_t *);
1264extern void jbd2_journal_unlock_updates (journal_t *);
1265
1266extern journal_t * jbd2_journal_init_dev(struct block_device *bdev,
1267 struct block_device *fs_dev,
1268 unsigned long long start, int len, int bsize);
1269extern journal_t * jbd2_journal_init_inode (struct inode *);
1270extern int jbd2_journal_update_format (journal_t *);
1271extern int jbd2_journal_check_used_features
1272 (journal_t *, unsigned long, unsigned long, unsigned long);
1273extern int jbd2_journal_check_available_features
1274 (journal_t *, unsigned long, unsigned long, unsigned long);
1275extern int jbd2_journal_set_features
1276 (journal_t *, unsigned long, unsigned long, unsigned long);
1277extern void jbd2_journal_clear_features
1278 (journal_t *, unsigned long, unsigned long, unsigned long);
1279extern int jbd2_journal_load (journal_t *journal);
1280extern int jbd2_journal_destroy (journal_t *);
1281extern int jbd2_journal_recover (journal_t *journal);
1282extern int jbd2_journal_wipe (journal_t *, int);
1283extern int jbd2_journal_skip_recovery (journal_t *);
1284extern void jbd2_journal_update_sb_errno(journal_t *);
1285extern int jbd2_journal_update_sb_log_tail (journal_t *, tid_t,
1286 unsigned long, int);
1287extern void __jbd2_journal_abort_hard (journal_t *);
1288extern void jbd2_journal_abort (journal_t *, int);
1289extern int jbd2_journal_errno (journal_t *);
1290extern void jbd2_journal_ack_err (journal_t *);
1291extern int jbd2_journal_clear_err (journal_t *);
1292extern int jbd2_journal_bmap(journal_t *, unsigned long, unsigned long long *);
1293extern int jbd2_journal_force_commit(journal_t *);
1294extern int jbd2_journal_force_commit_nested(journal_t *);
1295extern int jbd2_journal_inode_add_write(handle_t *handle, struct jbd2_inode *inode);
1296extern int jbd2_journal_inode_add_wait(handle_t *handle, struct jbd2_inode *inode);
1297extern int jbd2_journal_begin_ordered_truncate(journal_t *journal,
1298 struct jbd2_inode *inode, loff_t new_size);
1299extern void jbd2_journal_init_jbd_inode(struct jbd2_inode *jinode, struct inode *inode);
1300extern void jbd2_journal_release_jbd_inode(journal_t *journal, struct jbd2_inode *jinode);
1301
1302
1303
1304
1305struct journal_head *jbd2_journal_add_journal_head(struct buffer_head *bh);
1306struct journal_head *jbd2_journal_grab_journal_head(struct buffer_head *bh);
1307void jbd2_journal_put_journal_head(struct journal_head *jh);
1308
1309
1310
1311
1312extern struct kmem_cache *jbd2_handle_cache;
1313
1314static inline handle_t *jbd2_alloc_handle(gfp_t gfp_flags)
1315{
1316 return kmem_cache_zalloc(jbd2_handle_cache, gfp_flags);
1317}
1318
1319static inline void jbd2_free_handle(handle_t *handle)
1320{
1321 kmem_cache_free(jbd2_handle_cache, handle);
1322}
1323
1324
1325
1326
1327
1328extern struct kmem_cache *jbd2_inode_cache;
1329
1330static inline struct jbd2_inode *jbd2_alloc_inode(gfp_t gfp_flags)
1331{
1332 return kmem_cache_alloc(jbd2_inode_cache, gfp_flags);
1333}
1334
1335static inline void jbd2_free_inode(struct jbd2_inode *jinode)
1336{
1337 kmem_cache_free(jbd2_inode_cache, jinode);
1338}
1339
1340
1341#define JOURNAL_REVOKE_DEFAULT_HASH 256
1342extern int jbd2_journal_init_revoke(journal_t *, int);
1343extern void jbd2_journal_destroy_revoke_caches(void);
1344extern int jbd2_journal_init_revoke_caches(void);
1345
1346extern void jbd2_journal_destroy_revoke(journal_t *);
1347extern int jbd2_journal_revoke (handle_t *, unsigned long long, struct buffer_head *);
1348extern int jbd2_journal_cancel_revoke(handle_t *, struct journal_head *);
1349extern void jbd2_journal_write_revoke_records(transaction_t *transaction,
1350 struct list_head *log_bufs);
1351
1352
1353extern int jbd2_journal_set_revoke(journal_t *, unsigned long long, tid_t);
1354extern int jbd2_journal_test_revoke(journal_t *, unsigned long long, tid_t);
1355extern void jbd2_journal_clear_revoke(journal_t *);
1356extern void jbd2_journal_switch_revoke_table(journal_t *journal);
1357extern void jbd2_clear_buffer_revoked_flags(journal_t *journal);
1358
1359
1360
1361
1362
1363
1364
1365
1366int jbd2_log_start_commit(journal_t *journal, tid_t tid);
1367int __jbd2_log_start_commit(journal_t *journal, tid_t tid);
1368int jbd2_journal_start_commit(journal_t *journal, tid_t *tid);
1369int jbd2_log_wait_commit(journal_t *journal, tid_t tid);
1370int jbd2_complete_transaction(journal_t *journal, tid_t tid);
1371int jbd2_log_do_checkpoint(journal_t *journal);
1372int jbd2_trans_will_send_data_barrier(journal_t *journal, tid_t tid);
1373
1374void __jbd2_log_wait_for_space(journal_t *journal);
1375extern void __jbd2_journal_drop_transaction(journal_t *, transaction_t *);
1376extern int jbd2_cleanup_journal_tail(journal_t *);
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388static inline int is_journal_aborted(journal_t *journal)
1389{
1390 return journal->j_flags & JBD2_ABORT;
1391}
1392
1393static inline int is_handle_aborted(handle_t *handle)
1394{
1395 if (handle->h_aborted || !handle->h_transaction)
1396 return 1;
1397 return is_journal_aborted(handle->h_transaction->t_journal);
1398}
1399
1400static inline void jbd2_journal_abort_handle(handle_t *handle)
1401{
1402 handle->h_aborted = 1;
1403}
1404
1405#endif
1406
1407
1408
1409
1410static inline int tid_gt(tid_t x, tid_t y)
1411{
1412 int difference = (x - y);
1413 return (difference > 0);
1414}
1415
1416static inline int tid_geq(tid_t x, tid_t y)
1417{
1418 int difference = (x - y);
1419 return (difference >= 0);
1420}
1421
1422extern int jbd2_journal_blocks_per_page(struct inode *inode);
1423extern size_t journal_tag_bytes(journal_t *journal);
1424
1425static inline bool jbd2_journal_has_csum_v2or3_feature(journal_t *j)
1426{
1427 return jbd2_has_feature_csum2(j) || jbd2_has_feature_csum3(j);
1428}
1429
1430static inline int jbd2_journal_has_csum_v2or3(journal_t *journal)
1431{
1432 WARN_ON_ONCE(jbd2_journal_has_csum_v2or3_feature(journal) &&
1433 journal->j_chksum_driver == NULL);
1434
1435 return journal->j_chksum_driver != NULL;
1436}
1437
1438
1439
1440
1441
1442#define JBD2_CONTROL_BLOCKS_SHIFT 5
1443
1444
1445
1446
1447
1448static inline int jbd2_space_needed(journal_t *journal)
1449{
1450 int nblocks = journal->j_max_transaction_buffers;
1451 return nblocks + (nblocks >> JBD2_CONTROL_BLOCKS_SHIFT);
1452}
1453
1454
1455
1456
1457static inline unsigned long jbd2_log_space_left(journal_t *journal)
1458{
1459
1460 unsigned long free = journal->j_free - 32;
1461
1462 if (journal->j_committing_transaction) {
1463 unsigned long committing = atomic_read(&journal->
1464 j_committing_transaction->t_outstanding_credits);
1465
1466
1467 free -= committing + (committing >> JBD2_CONTROL_BLOCKS_SHIFT);
1468 }
1469 return free;
1470}
1471
1472
1473
1474
1475
1476
1477#define BJ_None 0
1478#define BJ_Metadata 1
1479#define BJ_Forget 2
1480#define BJ_Shadow 3
1481#define BJ_Reserved 4
1482#define BJ_Types 5
1483
1484extern int jbd_blocks_per_page(struct inode *inode);
1485
1486
1487#define JBD_MAX_CHECKSUM_SIZE 4
1488
1489static inline u32 jbd2_chksum(journal_t *journal, u32 crc,
1490 const void *address, unsigned int length)
1491{
1492 struct {
1493 struct shash_desc shash;
1494 char ctx[JBD_MAX_CHECKSUM_SIZE];
1495 } desc;
1496 int err;
1497
1498 BUG_ON(crypto_shash_descsize(journal->j_chksum_driver) >
1499 JBD_MAX_CHECKSUM_SIZE);
1500
1501 desc.shash.tfm = journal->j_chksum_driver;
1502 desc.shash.flags = 0;
1503 *(u32 *)desc.ctx = crc;
1504
1505 err = crypto_shash_update(&desc.shash, address, length);
1506 BUG_ON(err);
1507
1508 return *(u32 *)desc.ctx;
1509}
1510
1511
1512static inline tid_t jbd2_get_latest_transaction(journal_t *journal)
1513{
1514 tid_t tid;
1515
1516 read_lock(&journal->j_state_lock);
1517 tid = journal->j_commit_request;
1518 if (journal->j_running_transaction)
1519 tid = journal->j_running_transaction->t_tid;
1520 read_unlock(&journal->j_state_lock);
1521 return tid;
1522}
1523
1524#ifdef __KERNEL__
1525
1526#define buffer_trace_init(bh) do {} while (0)
1527#define print_buffer_fields(bh) do {} while (0)
1528#define print_buffer_trace(bh) do {} while (0)
1529#define BUFFER_TRACE(bh, info) do {} while (0)
1530#define BUFFER_TRACE2(bh, bh2, info) do {} while (0)
1531#define JBUFFER_TRACE(jh, info) do {} while (0)
1532
1533#endif
1534
1535#define EFSBADCRC EBADMSG
1536#define EFSCORRUPTED EUCLEAN
1537
1538#endif
1539