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