0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef _LINUX_JBD2_H
0014 #define _LINUX_JBD2_H
0015
0016
0017 #ifndef __KERNEL__
0018 #include "jfs_compat.h"
0019 #define JBD2_DEBUG
0020 #else
0021
0022 #include <linux/types.h>
0023 #include <linux/buffer_head.h>
0024 #include <linux/journal-head.h>
0025 #include <linux/stddef.h>
0026 #include <linux/mutex.h>
0027 #include <linux/timer.h>
0028 #include <linux/slab.h>
0029 #include <linux/bit_spinlock.h>
0030 #include <linux/blkdev.h>
0031 #include <crypto/hash.h>
0032 #endif
0033
0034 #define journal_oom_retry 1
0035
0036
0037
0038
0039
0040
0041
0042
0043 #undef JBD2_PARANOID_IOFAIL
0044
0045
0046
0047
0048 #define JBD2_DEFAULT_MAX_COMMIT_AGE 5
0049
0050 #ifdef CONFIG_JBD2_DEBUG
0051
0052
0053
0054
0055
0056 #define JBD2_EXPENSIVE_CHECKING
0057 void __jbd2_debug(int level, const char *file, const char *func,
0058 unsigned int line, const char *fmt, ...);
0059
0060 #define jbd2_debug(n, fmt, a...) \
0061 __jbd2_debug((n), __FILE__, __func__, __LINE__, (fmt), ##a)
0062 #else
0063 #define jbd2_debug(n, fmt, a...) no_printk(fmt, ##a)
0064 #endif
0065
0066 extern void *jbd2_alloc(size_t size, gfp_t flags);
0067 extern void jbd2_free(void *ptr, size_t size);
0068
0069 #define JBD2_MIN_JOURNAL_BLOCKS 1024
0070 #define JBD2_DEFAULT_FAST_COMMIT_BLOCKS 256
0071
0072 #ifdef __KERNEL__
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091 typedef struct jbd2_journal_handle handle_t;
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105 typedef struct journal_s journal_t;
0106 #endif
0107
0108
0109
0110
0111
0112 #define JBD2_MAGIC_NUMBER 0xc03b3998U
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122 #define JBD2_DESCRIPTOR_BLOCK 1
0123 #define JBD2_COMMIT_BLOCK 2
0124 #define JBD2_SUPERBLOCK_V1 3
0125 #define JBD2_SUPERBLOCK_V2 4
0126 #define JBD2_REVOKE_BLOCK 5
0127
0128
0129
0130
0131 typedef struct journal_header_s
0132 {
0133 __be32 h_magic;
0134 __be32 h_blocktype;
0135 __be32 h_sequence;
0136 } journal_header_t;
0137
0138
0139
0140
0141 #define JBD2_CRC32_CHKSUM 1
0142 #define JBD2_MD5_CHKSUM 2
0143 #define JBD2_SHA1_CHKSUM 3
0144 #define JBD2_CRC32C_CHKSUM 4
0145
0146 #define JBD2_CRC32_CHKSUM_SIZE 4
0147
0148 #define JBD2_CHECKSUM_BYTES (32 / sizeof(u32))
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167 struct commit_header {
0168 __be32 h_magic;
0169 __be32 h_blocktype;
0170 __be32 h_sequence;
0171 unsigned char h_chksum_type;
0172 unsigned char h_chksum_size;
0173 unsigned char h_padding[2];
0174 __be32 h_chksum[JBD2_CHECKSUM_BYTES];
0175 __be64 h_commit_sec;
0176 __be32 h_commit_nsec;
0177 };
0178
0179
0180
0181
0182
0183
0184
0185 typedef struct journal_block_tag3_s
0186 {
0187 __be32 t_blocknr;
0188 __be32 t_flags;
0189 __be32 t_blocknr_high;
0190 __be32 t_checksum;
0191 } journal_block_tag3_t;
0192
0193 typedef struct journal_block_tag_s
0194 {
0195 __be32 t_blocknr;
0196 __be16 t_checksum;
0197 __be16 t_flags;
0198 __be32 t_blocknr_high;
0199 } journal_block_tag_t;
0200
0201
0202 struct jbd2_journal_block_tail {
0203 __be32 t_checksum;
0204 };
0205
0206
0207
0208
0209
0210 typedef struct jbd2_journal_revoke_header_s
0211 {
0212 journal_header_t r_header;
0213 __be32 r_count;
0214 } jbd2_journal_revoke_header_t;
0215
0216
0217 #define JBD2_FLAG_ESCAPE 1
0218 #define JBD2_FLAG_SAME_UUID 2
0219 #define JBD2_FLAG_DELETED 4
0220 #define JBD2_FLAG_LAST_TAG 8
0221
0222
0223
0224
0225
0226 typedef struct journal_superblock_s
0227 {
0228
0229 journal_header_t s_header;
0230
0231
0232
0233 __be32 s_blocksize;
0234 __be32 s_maxlen;
0235 __be32 s_first;
0236
0237
0238
0239 __be32 s_sequence;
0240 __be32 s_start;
0241
0242
0243
0244 __be32 s_errno;
0245
0246
0247
0248 __be32 s_feature_compat;
0249 __be32 s_feature_incompat;
0250 __be32 s_feature_ro_compat;
0251
0252 __u8 s_uuid[16];
0253
0254
0255 __be32 s_nr_users;
0256
0257 __be32 s_dynsuper;
0258
0259
0260 __be32 s_max_transaction;
0261 __be32 s_max_trans_data;
0262
0263
0264 __u8 s_checksum_type;
0265 __u8 s_padding2[3];
0266
0267 __be32 s_num_fc_blks;
0268
0269 __u32 s_padding[41];
0270 __be32 s_checksum;
0271
0272
0273 __u8 s_users[16*48];
0274
0275 } journal_superblock_t;
0276
0277
0278 #define JBD2_HAS_COMPAT_FEATURE(j,mask) \
0279 ((j)->j_format_version >= 2 && \
0280 ((j)->j_superblock->s_feature_compat & cpu_to_be32((mask))))
0281 #define JBD2_HAS_RO_COMPAT_FEATURE(j,mask) \
0282 ((j)->j_format_version >= 2 && \
0283 ((j)->j_superblock->s_feature_ro_compat & cpu_to_be32((mask))))
0284 #define JBD2_HAS_INCOMPAT_FEATURE(j,mask) \
0285 ((j)->j_format_version >= 2 && \
0286 ((j)->j_superblock->s_feature_incompat & cpu_to_be32((mask))))
0287
0288 #define JBD2_FEATURE_COMPAT_CHECKSUM 0x00000001
0289
0290 #define JBD2_FEATURE_INCOMPAT_REVOKE 0x00000001
0291 #define JBD2_FEATURE_INCOMPAT_64BIT 0x00000002
0292 #define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004
0293 #define JBD2_FEATURE_INCOMPAT_CSUM_V2 0x00000008
0294 #define JBD2_FEATURE_INCOMPAT_CSUM_V3 0x00000010
0295 #define JBD2_FEATURE_INCOMPAT_FAST_COMMIT 0x00000020
0296
0297
0298
0299
0300 #define JBD2_KNOWN_COMPAT_FEATURES JBD2_FEATURE_COMPAT_CHECKSUM
0301 #define JBD2_KNOWN_ROCOMPAT_FEATURES 0
0302 #define JBD2_KNOWN_INCOMPAT_FEATURES (JBD2_FEATURE_INCOMPAT_REVOKE | \
0303 JBD2_FEATURE_INCOMPAT_64BIT | \
0304 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT | \
0305 JBD2_FEATURE_INCOMPAT_CSUM_V2 | \
0306 JBD2_FEATURE_INCOMPAT_CSUM_V3 | \
0307 JBD2_FEATURE_INCOMPAT_FAST_COMMIT)
0308
0309 #ifdef __KERNEL__
0310
0311 #include <linux/fs.h>
0312 #include <linux/sched.h>
0313
0314 enum jbd_state_bits {
0315 BH_JBD
0316 = BH_PrivateStart,
0317 BH_JWrite,
0318 BH_Freed,
0319 BH_Revoked,
0320 BH_RevokeValid,
0321 BH_JBDDirty,
0322 BH_JournalHead,
0323 BH_Shadow,
0324 BH_Verified,
0325 BH_JBDPrivateStart,
0326 };
0327
0328 BUFFER_FNS(JBD, jbd)
0329 BUFFER_FNS(JWrite, jwrite)
0330 BUFFER_FNS(JBDDirty, jbddirty)
0331 TAS_BUFFER_FNS(JBDDirty, jbddirty)
0332 BUFFER_FNS(Revoked, revoked)
0333 TAS_BUFFER_FNS(Revoked, revoked)
0334 BUFFER_FNS(RevokeValid, revokevalid)
0335 TAS_BUFFER_FNS(RevokeValid, revokevalid)
0336 BUFFER_FNS(Freed, freed)
0337 BUFFER_FNS(Shadow, shadow)
0338 BUFFER_FNS(Verified, verified)
0339
0340 static inline struct buffer_head *jh2bh(struct journal_head *jh)
0341 {
0342 return jh->b_bh;
0343 }
0344
0345 static inline struct journal_head *bh2jh(struct buffer_head *bh)
0346 {
0347 return bh->b_private;
0348 }
0349
0350 static inline void jbd_lock_bh_journal_head(struct buffer_head *bh)
0351 {
0352 bit_spin_lock(BH_JournalHead, &bh->b_state);
0353 }
0354
0355 static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh)
0356 {
0357 bit_spin_unlock(BH_JournalHead, &bh->b_state);
0358 }
0359
0360 #define J_ASSERT(assert) BUG_ON(!(assert))
0361
0362 #define J_ASSERT_BH(bh, expr) J_ASSERT(expr)
0363 #define J_ASSERT_JH(jh, expr) J_ASSERT(expr)
0364
0365 #if defined(JBD2_PARANOID_IOFAIL)
0366 #define J_EXPECT(expr, why...) J_ASSERT(expr)
0367 #define J_EXPECT_BH(bh, expr, why...) J_ASSERT_BH(bh, expr)
0368 #define J_EXPECT_JH(jh, expr, why...) J_ASSERT_JH(jh, expr)
0369 #else
0370 #define __journal_expect(expr, why...) \
0371 ({ \
0372 int val = (expr); \
0373 if (!val) { \
0374 printk(KERN_ERR \
0375 "JBD2 unexpected failure: %s: %s;\n", \
0376 __func__, #expr); \
0377 printk(KERN_ERR why "\n"); \
0378 } \
0379 val; \
0380 })
0381 #define J_EXPECT(expr, why...) __journal_expect(expr, ## why)
0382 #define J_EXPECT_BH(bh, expr, why...) __journal_expect(expr, ## why)
0383 #define J_EXPECT_JH(jh, expr, why...) __journal_expect(expr, ## why)
0384 #endif
0385
0386
0387 #define __JI_COMMIT_RUNNING 0
0388 #define __JI_WRITE_DATA 1
0389 #define __JI_WAIT_DATA 2
0390
0391
0392
0393
0394
0395
0396 #define JI_COMMIT_RUNNING (1 << __JI_COMMIT_RUNNING)
0397
0398 #define JI_WRITE_DATA (1 << __JI_WRITE_DATA)
0399
0400 #define JI_WAIT_DATA (1 << __JI_WAIT_DATA)
0401
0402
0403
0404
0405
0406 struct jbd2_inode {
0407
0408
0409
0410
0411
0412
0413 transaction_t *i_transaction;
0414
0415
0416
0417
0418
0419
0420
0421 transaction_t *i_next_transaction;
0422
0423
0424
0425
0426 struct list_head i_list;
0427
0428
0429
0430
0431
0432
0433 struct inode *i_vfs_inode;
0434
0435
0436
0437
0438 unsigned long i_flags;
0439
0440
0441
0442
0443
0444
0445
0446 loff_t i_dirty_start;
0447
0448
0449
0450
0451
0452
0453
0454 loff_t i_dirty_end;
0455 };
0456
0457 struct jbd2_revoke_table_s;
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486 struct jbd2_journal_handle
0487 {
0488 union {
0489 transaction_t *h_transaction;
0490
0491 journal_t *h_journal;
0492 };
0493
0494 handle_t *h_rsv_handle;
0495 int h_total_credits;
0496 int h_revoke_credits;
0497 int h_revoke_credits_requested;
0498 int h_ref;
0499 int h_err;
0500
0501
0502 unsigned int h_sync: 1;
0503 unsigned int h_jdata: 1;
0504 unsigned int h_reserved: 1;
0505 unsigned int h_aborted: 1;
0506 unsigned int h_type: 8;
0507 unsigned int h_line_no: 16;
0508
0509 unsigned long h_start_jiffies;
0510 unsigned int h_requested_credits;
0511
0512 unsigned int saved_alloc_context;
0513 };
0514
0515
0516
0517
0518
0519 struct transaction_chp_stats_s {
0520 unsigned long cs_chp_time;
0521 __u32 cs_forced_to_close;
0522 __u32 cs_written;
0523 __u32 cs_dropped;
0524 };
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560 struct transaction_s
0561 {
0562
0563 journal_t *t_journal;
0564
0565
0566 tid_t t_tid;
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576 enum {
0577 T_RUNNING,
0578 T_LOCKED,
0579 T_SWITCH,
0580 T_FLUSH,
0581 T_COMMIT,
0582 T_COMMIT_DFLUSH,
0583 T_COMMIT_JFLUSH,
0584 T_COMMIT_CALLBACK,
0585 T_FINISHED
0586 } t_state;
0587
0588
0589
0590
0591 unsigned long t_log_start;
0592
0593
0594
0595
0596
0597 int t_nr_buffers;
0598
0599
0600
0601
0602
0603
0604 struct journal_head *t_reserved_list;
0605
0606
0607
0608
0609
0610 struct journal_head *t_buffers;
0611
0612
0613
0614
0615
0616
0617 struct journal_head *t_forget;
0618
0619
0620
0621
0622
0623 struct journal_head *t_checkpoint_list;
0624
0625
0626
0627
0628
0629 struct journal_head *t_checkpoint_io_list;
0630
0631
0632
0633
0634
0635
0636
0637
0638 struct journal_head *t_shadow_list;
0639
0640
0641
0642
0643
0644
0645
0646 struct list_head t_inode_list;
0647
0648
0649
0650
0651 spinlock_t t_handle_lock;
0652
0653
0654
0655
0656 unsigned long t_max_wait;
0657
0658
0659
0660
0661 unsigned long t_start;
0662
0663
0664
0665
0666 unsigned long t_requested;
0667
0668
0669
0670
0671 struct transaction_chp_stats_s t_chp_stats;
0672
0673
0674
0675
0676
0677 atomic_t t_updates;
0678
0679
0680
0681
0682
0683
0684
0685 atomic_t t_outstanding_credits;
0686
0687
0688
0689
0690
0691 atomic_t t_outstanding_revokes;
0692
0693
0694
0695
0696 atomic_t t_handle_count;
0697
0698
0699
0700
0701
0702 transaction_t *t_cpnext, *t_cpprev;
0703
0704
0705
0706
0707
0708 unsigned long t_expires;
0709
0710
0711
0712
0713 ktime_t t_start_time;
0714
0715
0716
0717
0718
0719 unsigned int t_synchronous_commit:1;
0720
0721
0722 int t_need_data_flush;
0723
0724
0725
0726
0727
0728 struct list_head t_private_list;
0729 };
0730
0731 struct transaction_run_stats_s {
0732 unsigned long rs_wait;
0733 unsigned long rs_request_delay;
0734 unsigned long rs_running;
0735 unsigned long rs_locked;
0736 unsigned long rs_flushing;
0737 unsigned long rs_logging;
0738
0739 __u32 rs_handle_count;
0740 __u32 rs_blocks;
0741 __u32 rs_blocks_logged;
0742 };
0743
0744 struct transaction_stats_s {
0745 unsigned long ts_tid;
0746 unsigned long ts_requested;
0747 struct transaction_run_stats_s run;
0748 };
0749
0750 static inline unsigned long
0751 jbd2_time_diff(unsigned long start, unsigned long end)
0752 {
0753 if (end >= start)
0754 return end - start;
0755
0756 return end + (MAX_JIFFY_OFFSET - start);
0757 }
0758
0759 #define JBD2_NR_BATCH 64
0760
0761 enum passtype {PASS_SCAN, PASS_REVOKE, PASS_REPLAY};
0762
0763 #define JBD2_FC_REPLAY_STOP 0
0764 #define JBD2_FC_REPLAY_CONTINUE 1
0765
0766
0767
0768
0769
0770 struct journal_s
0771 {
0772
0773
0774
0775
0776 unsigned long j_flags;
0777
0778
0779
0780
0781 unsigned long j_atomic_flags;
0782
0783
0784
0785
0786
0787
0788
0789 int j_errno;
0790
0791
0792
0793
0794 struct mutex j_abort_mutex;
0795
0796
0797
0798
0799 struct buffer_head *j_sb_buffer;
0800
0801
0802
0803
0804 journal_superblock_t *j_superblock;
0805
0806
0807
0808
0809 int j_format_version;
0810
0811
0812
0813
0814 rwlock_t j_state_lock;
0815
0816
0817
0818
0819
0820
0821
0822 int j_barrier_count;
0823
0824
0825
0826
0827 struct mutex j_barrier;
0828
0829
0830
0831
0832
0833
0834
0835
0836 transaction_t *j_running_transaction;
0837
0838
0839
0840
0841
0842
0843
0844 transaction_t *j_committing_transaction;
0845
0846
0847
0848
0849
0850
0851
0852 transaction_t *j_checkpoint_transactions;
0853
0854
0855
0856
0857
0858
0859
0860 wait_queue_head_t j_wait_transaction_locked;
0861
0862
0863
0864
0865 wait_queue_head_t j_wait_done_commit;
0866
0867
0868
0869
0870 wait_queue_head_t j_wait_commit;
0871
0872
0873
0874
0875 wait_queue_head_t j_wait_updates;
0876
0877
0878
0879
0880
0881
0882 wait_queue_head_t j_wait_reserved;
0883
0884
0885
0886
0887
0888
0889 wait_queue_head_t j_fc_wait;
0890
0891
0892
0893
0894
0895
0896 struct mutex j_checkpoint_mutex;
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906 struct buffer_head *j_chkpt_bhs[JBD2_NR_BATCH];
0907
0908
0909
0910
0911
0912
0913
0914 struct shrinker j_shrinker;
0915
0916
0917
0918
0919
0920
0921 struct percpu_counter j_checkpoint_jh_count;
0922
0923
0924
0925
0926
0927
0928
0929 transaction_t *j_shrink_transaction;
0930
0931
0932
0933
0934
0935
0936
0937 unsigned long j_head;
0938
0939
0940
0941
0942
0943
0944
0945 unsigned long j_tail;
0946
0947
0948
0949
0950
0951
0952
0953 unsigned long j_free;
0954
0955
0956
0957
0958
0959
0960
0961 unsigned long j_first;
0962
0963
0964
0965
0966
0967
0968
0969 unsigned long j_last;
0970
0971
0972
0973
0974
0975
0976
0977 unsigned long j_fc_first;
0978
0979
0980
0981
0982
0983
0984
0985
0986 unsigned long j_fc_off;
0987
0988
0989
0990
0991
0992
0993
0994 unsigned long j_fc_last;
0995
0996
0997
0998
0999 struct block_device *j_dev;
1000
1001
1002
1003
1004 int j_blocksize;
1005
1006
1007
1008
1009
1010
1011 unsigned long long j_blk_offset;
1012
1013
1014
1015
1016 char j_devname[BDEVNAME_SIZE+24];
1017
1018
1019
1020
1021
1022
1023
1024 struct block_device *j_fs_dev;
1025
1026
1027
1028
1029 unsigned int j_total_len;
1030
1031
1032
1033
1034
1035
1036 atomic_t j_reserved_credits;
1037
1038
1039
1040
1041 spinlock_t j_list_lock;
1042
1043
1044
1045
1046
1047
1048
1049 struct inode *j_inode;
1050
1051
1052
1053
1054
1055
1056 tid_t j_tail_sequence;
1057
1058
1059
1060
1061
1062
1063 tid_t j_transaction_sequence;
1064
1065
1066
1067
1068
1069
1070
1071 tid_t j_commit_sequence;
1072
1073
1074
1075
1076
1077
1078
1079 tid_t j_commit_request;
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089 __u8 j_uuid[16];
1090
1091
1092
1093
1094 struct task_struct *j_task;
1095
1096
1097
1098
1099
1100
1101
1102 int j_max_transaction_buffers;
1103
1104
1105
1106
1107
1108
1109 int j_revoke_records_per_block;
1110
1111
1112
1113
1114
1115
1116 unsigned long j_commit_interval;
1117
1118
1119
1120
1121 struct timer_list j_commit_timer;
1122
1123
1124
1125
1126 spinlock_t j_revoke_lock;
1127
1128
1129
1130
1131
1132
1133
1134 struct jbd2_revoke_table_s *j_revoke;
1135
1136
1137
1138
1139 struct jbd2_revoke_table_s *j_revoke_table[2];
1140
1141
1142
1143
1144 struct buffer_head **j_wbuf;
1145
1146
1147
1148
1149
1150
1151 struct buffer_head **j_fc_wbuf;
1152
1153
1154
1155
1156
1157
1158 int j_wbufsize;
1159
1160
1161
1162
1163
1164
1165 int j_fc_wbufsize;
1166
1167
1168
1169
1170
1171
1172
1173 pid_t j_last_sync_writer;
1174
1175
1176
1177
1178
1179
1180
1181 u64 j_average_commit_time;
1182
1183
1184
1185
1186
1187
1188
1189 u32 j_min_batch_time;
1190
1191
1192
1193
1194
1195
1196
1197 u32 j_max_batch_time;
1198
1199
1200
1201
1202
1203
1204 void (*j_commit_callback)(journal_t *,
1205 transaction_t *);
1206
1207
1208
1209
1210
1211
1212
1213
1214 int (*j_submit_inode_data_buffers)
1215 (struct jbd2_inode *);
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225 int (*j_finish_inode_data_buffers)
1226 (struct jbd2_inode *);
1227
1228
1229
1230
1231
1232
1233
1234
1235 spinlock_t j_history_lock;
1236
1237
1238
1239
1240 struct proc_dir_entry *j_proc_entry;
1241
1242
1243
1244
1245 struct transaction_stats_s j_stats;
1246
1247
1248
1249
1250 unsigned int j_failed_commit;
1251
1252
1253
1254
1255
1256
1257
1258 void *j_private;
1259
1260
1261
1262
1263
1264
1265 struct crypto_shash *j_chksum_driver;
1266
1267
1268
1269
1270
1271
1272 __u32 j_csum_seed;
1273
1274 #ifdef CONFIG_DEBUG_LOCK_ALLOC
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285 struct lockdep_map j_trans_commit_map;
1286 #endif
1287
1288
1289
1290
1291
1292
1293
1294 void (*j_fc_cleanup_callback)(struct journal_s *journal, int full, tid_t tid);
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307 int (*j_fc_replay_callback)(struct journal_s *journal,
1308 struct buffer_head *bh,
1309 enum passtype pass, int off,
1310 tid_t expected_commit_id);
1311 };
1312
1313 #define jbd2_might_wait_for_commit(j) \
1314 do { \
1315 rwsem_acquire(&j->j_trans_commit_map, 0, 0, _THIS_IP_); \
1316 rwsem_release(&j->j_trans_commit_map, _THIS_IP_); \
1317 } while (0)
1318
1319
1320 #define JBD2_FEATURE_COMPAT_FUNCS(name, flagname) \
1321 static inline bool jbd2_has_feature_##name(journal_t *j) \
1322 { \
1323 return ((j)->j_format_version >= 2 && \
1324 ((j)->j_superblock->s_feature_compat & \
1325 cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname)) != 0); \
1326 } \
1327 static inline void jbd2_set_feature_##name(journal_t *j) \
1328 { \
1329 (j)->j_superblock->s_feature_compat |= \
1330 cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname); \
1331 } \
1332 static inline void jbd2_clear_feature_##name(journal_t *j) \
1333 { \
1334 (j)->j_superblock->s_feature_compat &= \
1335 ~cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname); \
1336 }
1337
1338 #define JBD2_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
1339 static inline bool jbd2_has_feature_##name(journal_t *j) \
1340 { \
1341 return ((j)->j_format_version >= 2 && \
1342 ((j)->j_superblock->s_feature_ro_compat & \
1343 cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname)) != 0); \
1344 } \
1345 static inline void jbd2_set_feature_##name(journal_t *j) \
1346 { \
1347 (j)->j_superblock->s_feature_ro_compat |= \
1348 cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname); \
1349 } \
1350 static inline void jbd2_clear_feature_##name(journal_t *j) \
1351 { \
1352 (j)->j_superblock->s_feature_ro_compat &= \
1353 ~cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname); \
1354 }
1355
1356 #define JBD2_FEATURE_INCOMPAT_FUNCS(name, flagname) \
1357 static inline bool jbd2_has_feature_##name(journal_t *j) \
1358 { \
1359 return ((j)->j_format_version >= 2 && \
1360 ((j)->j_superblock->s_feature_incompat & \
1361 cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname)) != 0); \
1362 } \
1363 static inline void jbd2_set_feature_##name(journal_t *j) \
1364 { \
1365 (j)->j_superblock->s_feature_incompat |= \
1366 cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname); \
1367 } \
1368 static inline void jbd2_clear_feature_##name(journal_t *j) \
1369 { \
1370 (j)->j_superblock->s_feature_incompat &= \
1371 ~cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname); \
1372 }
1373
1374 JBD2_FEATURE_COMPAT_FUNCS(checksum, CHECKSUM)
1375
1376 JBD2_FEATURE_INCOMPAT_FUNCS(revoke, REVOKE)
1377 JBD2_FEATURE_INCOMPAT_FUNCS(64bit, 64BIT)
1378 JBD2_FEATURE_INCOMPAT_FUNCS(async_commit, ASYNC_COMMIT)
1379 JBD2_FEATURE_INCOMPAT_FUNCS(csum2, CSUM_V2)
1380 JBD2_FEATURE_INCOMPAT_FUNCS(csum3, CSUM_V3)
1381 JBD2_FEATURE_INCOMPAT_FUNCS(fast_commit, FAST_COMMIT)
1382
1383
1384
1385
1386 #define JBD2_UNMOUNT 0x001
1387 #define JBD2_ABORT 0x002
1388 #define JBD2_ACK_ERR 0x004
1389 #define JBD2_FLUSHED 0x008
1390 #define JBD2_LOADED 0x010
1391 #define JBD2_BARRIER 0x020
1392 #define JBD2_ABORT_ON_SYNCDATA_ERR 0x040
1393
1394
1395 #define JBD2_FAST_COMMIT_ONGOING 0x100
1396 #define JBD2_FULL_COMMIT_ONGOING 0x200
1397 #define JBD2_JOURNAL_FLUSH_DISCARD 0x0001
1398 #define JBD2_JOURNAL_FLUSH_ZEROOUT 0x0002
1399 #define JBD2_JOURNAL_FLUSH_VALID (JBD2_JOURNAL_FLUSH_DISCARD | \
1400 JBD2_JOURNAL_FLUSH_ZEROOUT)
1401
1402
1403
1404
1405 #define JBD2_CHECKPOINT_IO_ERROR 0x001
1406
1407
1408
1409
1410
1411
1412
1413
1414 extern void jbd2_journal_unfile_buffer(journal_t *, struct journal_head *);
1415 extern bool __jbd2_journal_refile_buffer(struct journal_head *);
1416 extern void jbd2_journal_refile_buffer(journal_t *, struct journal_head *);
1417 extern void __jbd2_journal_file_buffer(struct journal_head *, transaction_t *, int);
1418 extern void jbd2_journal_file_buffer(struct journal_head *, transaction_t *, int);
1419 static inline void jbd2_file_log_bh(struct list_head *head, struct buffer_head *bh)
1420 {
1421 list_add_tail(&bh->b_assoc_buffers, head);
1422 }
1423 static inline void jbd2_unfile_log_bh(struct buffer_head *bh)
1424 {
1425 list_del_init(&bh->b_assoc_buffers);
1426 }
1427
1428
1429 struct buffer_head *jbd2_journal_get_descriptor_buffer(transaction_t *, int);
1430 void jbd2_descriptor_block_csum_set(journal_t *, struct buffer_head *);
1431 int jbd2_journal_next_log_block(journal_t *, unsigned long long *);
1432 int jbd2_journal_get_log_tail(journal_t *journal, tid_t *tid,
1433 unsigned long *block);
1434 int __jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block);
1435 void jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block);
1436
1437
1438 extern void jbd2_journal_commit_transaction(journal_t *);
1439
1440
1441 void __jbd2_journal_clean_checkpoint_list(journal_t *journal, bool destroy);
1442 unsigned long jbd2_journal_shrink_checkpoint_list(journal_t *journal, unsigned long *nr_to_scan);
1443 int __jbd2_journal_remove_checkpoint(struct journal_head *);
1444 void jbd2_journal_destroy_checkpoint(journal_t *journal);
1445 void __jbd2_journal_insert_checkpoint(struct journal_head *, transaction_t *);
1446
1447
1448
1449
1450
1451
1452 struct jbd2_buffer_trigger_type {
1453
1454
1455
1456
1457
1458
1459 void (*t_frozen)(struct jbd2_buffer_trigger_type *type,
1460 struct buffer_head *bh, void *mapped_data,
1461 size_t size);
1462
1463
1464
1465
1466
1467 void (*t_abort)(struct jbd2_buffer_trigger_type *type,
1468 struct buffer_head *bh);
1469 };
1470
1471 extern void jbd2_buffer_frozen_trigger(struct journal_head *jh,
1472 void *mapped_data,
1473 struct jbd2_buffer_trigger_type *triggers);
1474 extern void jbd2_buffer_abort_trigger(struct journal_head *jh,
1475 struct jbd2_buffer_trigger_type *triggers);
1476
1477
1478 extern int jbd2_journal_write_metadata_buffer(transaction_t *transaction,
1479 struct journal_head *jh_in,
1480 struct buffer_head **bh_out,
1481 sector_t blocknr);
1482
1483
1484 extern void jbd2_journal_destroy_transaction_cache(void);
1485 extern int __init jbd2_journal_init_transaction_cache(void);
1486 extern void jbd2_journal_free_transaction(transaction_t *);
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499 static inline handle_t *journal_current_handle(void)
1500 {
1501 return current->journal_info;
1502 }
1503
1504
1505
1506
1507
1508
1509
1510 extern handle_t *jbd2_journal_start(journal_t *, int nblocks);
1511 extern handle_t *jbd2__journal_start(journal_t *, int blocks, int rsv_blocks,
1512 int revoke_records, gfp_t gfp_mask,
1513 unsigned int type, unsigned int line_no);
1514 extern int jbd2_journal_restart(handle_t *, int nblocks);
1515 extern int jbd2__journal_restart(handle_t *, int nblocks,
1516 int revoke_records, gfp_t gfp_mask);
1517 extern int jbd2_journal_start_reserved(handle_t *handle,
1518 unsigned int type, unsigned int line_no);
1519 extern void jbd2_journal_free_reserved(handle_t *handle);
1520 extern int jbd2_journal_extend(handle_t *handle, int nblocks,
1521 int revoke_records);
1522 extern int jbd2_journal_get_write_access(handle_t *, struct buffer_head *);
1523 extern int jbd2_journal_get_create_access (handle_t *, struct buffer_head *);
1524 extern int jbd2_journal_get_undo_access(handle_t *, struct buffer_head *);
1525 void jbd2_journal_set_triggers(struct buffer_head *,
1526 struct jbd2_buffer_trigger_type *type);
1527 extern int jbd2_journal_dirty_metadata (handle_t *, struct buffer_head *);
1528 extern int jbd2_journal_forget (handle_t *, struct buffer_head *);
1529 int jbd2_journal_invalidate_folio(journal_t *, struct folio *,
1530 size_t offset, size_t length);
1531 bool jbd2_journal_try_to_free_buffers(journal_t *journal, struct folio *folio);
1532 extern int jbd2_journal_stop(handle_t *);
1533 extern int jbd2_journal_flush(journal_t *journal, unsigned int flags);
1534 extern void jbd2_journal_lock_updates (journal_t *);
1535 extern void jbd2_journal_unlock_updates (journal_t *);
1536
1537 void jbd2_journal_wait_updates(journal_t *);
1538
1539 extern journal_t * jbd2_journal_init_dev(struct block_device *bdev,
1540 struct block_device *fs_dev,
1541 unsigned long long start, int len, int bsize);
1542 extern journal_t * jbd2_journal_init_inode (struct inode *);
1543 extern int jbd2_journal_update_format (journal_t *);
1544 extern int jbd2_journal_check_used_features
1545 (journal_t *, unsigned long, unsigned long, unsigned long);
1546 extern int jbd2_journal_check_available_features
1547 (journal_t *, unsigned long, unsigned long, unsigned long);
1548 extern int jbd2_journal_set_features
1549 (journal_t *, unsigned long, unsigned long, unsigned long);
1550 extern void jbd2_journal_clear_features
1551 (journal_t *, unsigned long, unsigned long, unsigned long);
1552 extern int jbd2_journal_load (journal_t *journal);
1553 extern int jbd2_journal_destroy (journal_t *);
1554 extern int jbd2_journal_recover (journal_t *journal);
1555 extern int jbd2_journal_wipe (journal_t *, int);
1556 extern int jbd2_journal_skip_recovery (journal_t *);
1557 extern void jbd2_journal_update_sb_errno(journal_t *);
1558 extern int jbd2_journal_update_sb_log_tail (journal_t *, tid_t,
1559 unsigned long, blk_opf_t);
1560 extern void jbd2_journal_abort (journal_t *, int);
1561 extern int jbd2_journal_errno (journal_t *);
1562 extern void jbd2_journal_ack_err (journal_t *);
1563 extern int jbd2_journal_clear_err (journal_t *);
1564 extern int jbd2_journal_bmap(journal_t *, unsigned long, unsigned long long *);
1565 extern int jbd2_journal_force_commit(journal_t *);
1566 extern int jbd2_journal_force_commit_nested(journal_t *);
1567 extern int jbd2_journal_inode_ranged_write(handle_t *handle,
1568 struct jbd2_inode *inode, loff_t start_byte,
1569 loff_t length);
1570 extern int jbd2_journal_inode_ranged_wait(handle_t *handle,
1571 struct jbd2_inode *inode, loff_t start_byte,
1572 loff_t length);
1573 extern int jbd2_journal_submit_inode_data_buffers(
1574 struct jbd2_inode *jinode);
1575 extern int jbd2_journal_finish_inode_data_buffers(
1576 struct jbd2_inode *jinode);
1577 extern int jbd2_journal_begin_ordered_truncate(journal_t *journal,
1578 struct jbd2_inode *inode, loff_t new_size);
1579 extern void jbd2_journal_init_jbd_inode(struct jbd2_inode *jinode, struct inode *inode);
1580 extern void jbd2_journal_release_jbd_inode(journal_t *journal, struct jbd2_inode *jinode);
1581
1582
1583
1584
1585 struct journal_head *jbd2_journal_add_journal_head(struct buffer_head *bh);
1586 struct journal_head *jbd2_journal_grab_journal_head(struct buffer_head *bh);
1587 void jbd2_journal_put_journal_head(struct journal_head *jh);
1588
1589
1590
1591
1592 extern struct kmem_cache *jbd2_handle_cache;
1593
1594 static inline handle_t *jbd2_alloc_handle(gfp_t gfp_flags)
1595 {
1596 return kmem_cache_zalloc(jbd2_handle_cache, gfp_flags);
1597 }
1598
1599 static inline void jbd2_free_handle(handle_t *handle)
1600 {
1601 kmem_cache_free(jbd2_handle_cache, handle);
1602 }
1603
1604
1605
1606
1607
1608 extern struct kmem_cache *jbd2_inode_cache;
1609
1610 static inline struct jbd2_inode *jbd2_alloc_inode(gfp_t gfp_flags)
1611 {
1612 return kmem_cache_alloc(jbd2_inode_cache, gfp_flags);
1613 }
1614
1615 static inline void jbd2_free_inode(struct jbd2_inode *jinode)
1616 {
1617 kmem_cache_free(jbd2_inode_cache, jinode);
1618 }
1619
1620
1621 #define JOURNAL_REVOKE_DEFAULT_HASH 256
1622 extern int jbd2_journal_init_revoke(journal_t *, int);
1623 extern void jbd2_journal_destroy_revoke_record_cache(void);
1624 extern void jbd2_journal_destroy_revoke_table_cache(void);
1625 extern int __init jbd2_journal_init_revoke_record_cache(void);
1626 extern int __init jbd2_journal_init_revoke_table_cache(void);
1627
1628 extern void jbd2_journal_destroy_revoke(journal_t *);
1629 extern int jbd2_journal_revoke (handle_t *, unsigned long long, struct buffer_head *);
1630 extern int jbd2_journal_cancel_revoke(handle_t *, struct journal_head *);
1631 extern void jbd2_journal_write_revoke_records(transaction_t *transaction,
1632 struct list_head *log_bufs);
1633
1634
1635 extern int jbd2_journal_set_revoke(journal_t *, unsigned long long, tid_t);
1636 extern int jbd2_journal_test_revoke(journal_t *, unsigned long long, tid_t);
1637 extern void jbd2_journal_clear_revoke(journal_t *);
1638 extern void jbd2_journal_switch_revoke_table(journal_t *journal);
1639 extern void jbd2_clear_buffer_revoked_flags(journal_t *journal);
1640
1641
1642
1643
1644
1645
1646
1647
1648 int jbd2_log_start_commit(journal_t *journal, tid_t tid);
1649 int jbd2_journal_start_commit(journal_t *journal, tid_t *tid);
1650 int jbd2_log_wait_commit(journal_t *journal, tid_t tid);
1651 int jbd2_transaction_committed(journal_t *journal, tid_t tid);
1652 int jbd2_complete_transaction(journal_t *journal, tid_t tid);
1653 int jbd2_log_do_checkpoint(journal_t *journal);
1654 int jbd2_trans_will_send_data_barrier(journal_t *journal, tid_t tid);
1655
1656 void __jbd2_log_wait_for_space(journal_t *journal);
1657 extern void __jbd2_journal_drop_transaction(journal_t *, transaction_t *);
1658 extern int jbd2_cleanup_journal_tail(journal_t *);
1659
1660
1661 int jbd2_fc_begin_commit(journal_t *journal, tid_t tid);
1662 int jbd2_fc_end_commit(journal_t *journal);
1663 int jbd2_fc_end_commit_fallback(journal_t *journal);
1664 int jbd2_fc_get_buf(journal_t *journal, struct buffer_head **bh_out);
1665 int jbd2_submit_inode_data(struct jbd2_inode *jinode);
1666 int jbd2_wait_inode_data(journal_t *journal, struct jbd2_inode *jinode);
1667 int jbd2_fc_wait_bufs(journal_t *journal, int num_blks);
1668 int jbd2_fc_release_bufs(journal_t *journal);
1669
1670 static inline int jbd2_journal_get_max_txn_bufs(journal_t *journal)
1671 {
1672 return (journal->j_total_len - journal->j_fc_wbufsize) / 4;
1673 }
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685 static inline int is_journal_aborted(journal_t *journal)
1686 {
1687 return journal->j_flags & JBD2_ABORT;
1688 }
1689
1690 static inline int is_handle_aborted(handle_t *handle)
1691 {
1692 if (handle->h_aborted || !handle->h_transaction)
1693 return 1;
1694 return is_journal_aborted(handle->h_transaction->t_journal);
1695 }
1696
1697 static inline void jbd2_journal_abort_handle(handle_t *handle)
1698 {
1699 handle->h_aborted = 1;
1700 }
1701
1702 #endif
1703
1704
1705
1706
1707 static inline int tid_gt(tid_t x, tid_t y)
1708 {
1709 int difference = (x - y);
1710 return (difference > 0);
1711 }
1712
1713 static inline int tid_geq(tid_t x, tid_t y)
1714 {
1715 int difference = (x - y);
1716 return (difference >= 0);
1717 }
1718
1719 extern int jbd2_journal_blocks_per_page(struct inode *inode);
1720 extern size_t journal_tag_bytes(journal_t *journal);
1721
1722 static inline bool jbd2_journal_has_csum_v2or3_feature(journal_t *j)
1723 {
1724 return jbd2_has_feature_csum2(j) || jbd2_has_feature_csum3(j);
1725 }
1726
1727 static inline int jbd2_journal_has_csum_v2or3(journal_t *journal)
1728 {
1729 WARN_ON_ONCE(jbd2_journal_has_csum_v2or3_feature(journal) &&
1730 journal->j_chksum_driver == NULL);
1731
1732 return journal->j_chksum_driver != NULL;
1733 }
1734
1735 static inline int jbd2_journal_get_num_fc_blks(journal_superblock_t *jsb)
1736 {
1737 int num_fc_blocks = be32_to_cpu(jsb->s_num_fc_blks);
1738
1739 return num_fc_blocks ? num_fc_blocks : JBD2_DEFAULT_FAST_COMMIT_BLOCKS;
1740 }
1741
1742
1743
1744
1745 static inline unsigned long jbd2_log_space_left(journal_t *journal)
1746 {
1747
1748 long free = journal->j_free - 32;
1749
1750 if (journal->j_committing_transaction) {
1751 free -= atomic_read(&journal->
1752 j_committing_transaction->t_outstanding_credits);
1753 }
1754 return max_t(long, free, 0);
1755 }
1756
1757
1758
1759
1760
1761
1762 #define BJ_None 0
1763 #define BJ_Metadata 1
1764 #define BJ_Forget 2
1765 #define BJ_Shadow 3
1766 #define BJ_Reserved 4
1767 #define BJ_Types 5
1768
1769
1770 #define JBD_MAX_CHECKSUM_SIZE 4
1771
1772 static inline u32 jbd2_chksum(journal_t *journal, u32 crc,
1773 const void *address, unsigned int length)
1774 {
1775 struct {
1776 struct shash_desc shash;
1777 char ctx[JBD_MAX_CHECKSUM_SIZE];
1778 } desc;
1779 int err;
1780
1781 BUG_ON(crypto_shash_descsize(journal->j_chksum_driver) >
1782 JBD_MAX_CHECKSUM_SIZE);
1783
1784 desc.shash.tfm = journal->j_chksum_driver;
1785 *(u32 *)desc.ctx = crc;
1786
1787 err = crypto_shash_update(&desc.shash, address, length);
1788 BUG_ON(err);
1789
1790 return *(u32 *)desc.ctx;
1791 }
1792
1793
1794 static inline tid_t jbd2_get_latest_transaction(journal_t *journal)
1795 {
1796 tid_t tid;
1797
1798 read_lock(&journal->j_state_lock);
1799 tid = journal->j_commit_request;
1800 if (journal->j_running_transaction)
1801 tid = journal->j_running_transaction->t_tid;
1802 read_unlock(&journal->j_state_lock);
1803 return tid;
1804 }
1805
1806 static inline int jbd2_handle_buffer_credits(handle_t *handle)
1807 {
1808 journal_t *journal;
1809
1810 if (!handle->h_reserved)
1811 journal = handle->h_transaction->t_journal;
1812 else
1813 journal = handle->h_journal;
1814
1815 return handle->h_total_credits -
1816 DIV_ROUND_UP(handle->h_revoke_credits_requested,
1817 journal->j_revoke_records_per_block);
1818 }
1819
1820 #ifdef __KERNEL__
1821
1822 #define buffer_trace_init(bh) do {} while (0)
1823 #define print_buffer_fields(bh) do {} while (0)
1824 #define print_buffer_trace(bh) do {} while (0)
1825 #define BUFFER_TRACE(bh, info) do {} while (0)
1826 #define BUFFER_TRACE2(bh, bh2, info) do {} while (0)
1827 #define JBUFFER_TRACE(jh, info) do {} while (0)
1828
1829 #endif
1830
1831 #define EFSBADCRC EBADMSG
1832 #define EFSCORRUPTED EUCLEAN
1833
1834 #endif