1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef _LINUX_JBD_H
17#define _LINUX_JBD_H
18
19
20#ifndef __KERNEL__
21#include "jfs_compat.h"
22#define JFS_DEBUG
23#define jfs_debug jbd_debug
24#else
25
26#include <linux/types.h>
27#include <linux/buffer_head.h>
28#include <linux/journal-head.h>
29#include <linux/stddef.h>
30#include <linux/bit_spinlock.h>
31#include <linux/mutex.h>
32#include <linux/timer.h>
33#include <linux/lockdep.h>
34
35#define journal_oom_retry 1
36
37
38
39
40
41
42
43
44#undef JBD_PARANOID_IOFAIL
45
46
47
48
49#define JBD_DEFAULT_MAX_COMMIT_AGE 5
50
51#ifdef CONFIG_JBD_DEBUG
52
53
54
55
56
57#define JBD_EXPENSIVE_CHECKING
58extern u8 journal_enable_debug;
59
60#define jbd_debug(n, f, a...) \
61 do { \
62 if ((n) <= journal_enable_debug) { \
63 printk (KERN_DEBUG "(%s, %d): %s: ", \
64 __FILE__, __LINE__, __func__); \
65 printk (f, ## a); \
66 } \
67 } while (0)
68#else
69#define jbd_debug(f, a...)
70#endif
71
72static inline void *jbd_alloc(size_t size, gfp_t flags)
73{
74 return (void *)__get_free_pages(flags, get_order(size));
75}
76
77static inline void jbd_free(void *ptr, size_t size)
78{
79 free_pages((unsigned long)ptr, get_order(size));
80};
81
82#define JFS_MIN_JOURNAL_BLOCKS 1024
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102typedef struct handle_s handle_t;
103
104
105
106
107
108
109
110
111
112
113
114
115
116typedef struct journal_s journal_t;
117#endif
118
119
120
121
122
123#define JFS_MAGIC_NUMBER 0xc03b3998U
124
125
126
127
128
129
130
131
132
133#define JFS_DESCRIPTOR_BLOCK 1
134#define JFS_COMMIT_BLOCK 2
135#define JFS_SUPERBLOCK_V1 3
136#define JFS_SUPERBLOCK_V2 4
137#define JFS_REVOKE_BLOCK 5
138
139
140
141
142typedef struct journal_header_s
143{
144 __be32 h_magic;
145 __be32 h_blocktype;
146 __be32 h_sequence;
147} journal_header_t;
148
149
150
151
152
153typedef struct journal_block_tag_s
154{
155 __be32 t_blocknr;
156 __be32 t_flags;
157} journal_block_tag_t;
158
159
160
161
162
163typedef struct journal_revoke_header_s
164{
165 journal_header_t r_header;
166 __be32 r_count;
167} journal_revoke_header_t;
168
169
170
171#define JFS_FLAG_ESCAPE 1
172#define JFS_FLAG_SAME_UUID 2
173#define JFS_FLAG_DELETED 4
174#define JFS_FLAG_LAST_TAG 8
175
176
177
178
179
180typedef struct journal_superblock_s
181{
182
183 journal_header_t s_header;
184
185
186
187 __be32 s_blocksize;
188 __be32 s_maxlen;
189 __be32 s_first;
190
191
192
193 __be32 s_sequence;
194 __be32 s_start;
195
196
197
198 __be32 s_errno;
199
200
201
202 __be32 s_feature_compat;
203 __be32 s_feature_incompat;
204 __be32 s_feature_ro_compat;
205
206 __u8 s_uuid[16];
207
208
209 __be32 s_nr_users;
210
211 __be32 s_dynsuper;
212
213
214 __be32 s_max_transaction;
215 __be32 s_max_trans_data;
216
217
218 __u32 s_padding[44];
219
220
221 __u8 s_users[16*48];
222
223} journal_superblock_t;
224
225#define JFS_HAS_COMPAT_FEATURE(j,mask) \
226 ((j)->j_format_version >= 2 && \
227 ((j)->j_superblock->s_feature_compat & cpu_to_be32((mask))))
228#define JFS_HAS_RO_COMPAT_FEATURE(j,mask) \
229 ((j)->j_format_version >= 2 && \
230 ((j)->j_superblock->s_feature_ro_compat & cpu_to_be32((mask))))
231#define JFS_HAS_INCOMPAT_FEATURE(j,mask) \
232 ((j)->j_format_version >= 2 && \
233 ((j)->j_superblock->s_feature_incompat & cpu_to_be32((mask))))
234
235#define JFS_FEATURE_INCOMPAT_REVOKE 0x00000001
236
237
238#define JFS_KNOWN_COMPAT_FEATURES 0
239#define JFS_KNOWN_ROCOMPAT_FEATURES 0
240#define JFS_KNOWN_INCOMPAT_FEATURES JFS_FEATURE_INCOMPAT_REVOKE
241
242#ifdef __KERNEL__
243
244#include <linux/fs.h>
245#include <linux/sched.h>
246
247#define J_ASSERT(assert) BUG_ON(!(assert))
248
249#if defined(CONFIG_BUFFER_DEBUG)
250void buffer_assertion_failure(struct buffer_head *bh);
251#define J_ASSERT_BH(bh, expr) \
252 do { \
253 if (!(expr)) \
254 buffer_assertion_failure(bh); \
255 J_ASSERT(expr); \
256 } while (0)
257#define J_ASSERT_JH(jh, expr) J_ASSERT_BH(jh2bh(jh), expr)
258#else
259#define J_ASSERT_BH(bh, expr) J_ASSERT(expr)
260#define J_ASSERT_JH(jh, expr) J_ASSERT(expr)
261#endif
262
263#if defined(JBD_PARANOID_IOFAIL)
264#define J_EXPECT(expr, why...) J_ASSERT(expr)
265#define J_EXPECT_BH(bh, expr, why...) J_ASSERT_BH(bh, expr)
266#define J_EXPECT_JH(jh, expr, why...) J_ASSERT_JH(jh, expr)
267#else
268#define __journal_expect(expr, why...) \
269 ({ \
270 int val = (expr); \
271 if (!val) { \
272 printk(KERN_ERR \
273 "EXT3-fs unexpected failure: %s;\n",# expr); \
274 printk(KERN_ERR why "\n"); \
275 } \
276 val; \
277 })
278#define J_EXPECT(expr, why...) __journal_expect(expr, ## why)
279#define J_EXPECT_BH(bh, expr, why...) __journal_expect(expr, ## why)
280#define J_EXPECT_JH(jh, expr, why...) __journal_expect(expr, ## why)
281#endif
282
283enum jbd_state_bits {
284 BH_JBD
285 = BH_PrivateStart,
286 BH_JWrite,
287 BH_Freed,
288 BH_Revoked,
289 BH_RevokeValid,
290 BH_JBDDirty,
291 BH_State,
292 BH_JournalHead,
293 BH_Unshadow,
294};
295
296BUFFER_FNS(JBD, jbd)
297BUFFER_FNS(JWrite, jwrite)
298BUFFER_FNS(JBDDirty, jbddirty)
299TAS_BUFFER_FNS(JBDDirty, jbddirty)
300BUFFER_FNS(Revoked, revoked)
301TAS_BUFFER_FNS(Revoked, revoked)
302BUFFER_FNS(RevokeValid, revokevalid)
303TAS_BUFFER_FNS(RevokeValid, revokevalid)
304BUFFER_FNS(Freed, freed)
305
306static inline struct buffer_head *jh2bh(struct journal_head *jh)
307{
308 return jh->b_bh;
309}
310
311static inline struct journal_head *bh2jh(struct buffer_head *bh)
312{
313 return bh->b_private;
314}
315
316static inline void jbd_lock_bh_state(struct buffer_head *bh)
317{
318 bit_spin_lock(BH_State, &bh->b_state);
319}
320
321static inline int jbd_trylock_bh_state(struct buffer_head *bh)
322{
323 return bit_spin_trylock(BH_State, &bh->b_state);
324}
325
326static inline int jbd_is_locked_bh_state(struct buffer_head *bh)
327{
328 return bit_spin_is_locked(BH_State, &bh->b_state);
329}
330
331static inline void jbd_unlock_bh_state(struct buffer_head *bh)
332{
333 bit_spin_unlock(BH_State, &bh->b_state);
334}
335
336static inline void jbd_lock_bh_journal_head(struct buffer_head *bh)
337{
338 bit_spin_lock(BH_JournalHead, &bh->b_state);
339}
340
341static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh)
342{
343 bit_spin_unlock(BH_JournalHead, &bh->b_state);
344}
345
346struct jbd_revoke_table_s;
347
348
349
350
351
352
353
354
355
356
357
358
359struct handle_s
360{
361
362 transaction_t *h_transaction;
363
364
365 int h_buffer_credits;
366
367
368 int h_ref;
369
370
371
372 int h_err;
373
374
375 unsigned int h_sync: 1;
376 unsigned int h_jdata: 1;
377 unsigned int h_aborted: 1;
378
379#ifdef CONFIG_DEBUG_LOCK_ALLOC
380 struct lockdep_map h_lockdep_map;
381#endif
382};
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421struct transaction_s
422{
423
424 journal_t *t_journal;
425
426
427 tid_t t_tid;
428
429
430
431
432
433
434
435
436
437 enum {
438 T_RUNNING,
439 T_LOCKED,
440 T_RUNDOWN,
441 T_FLUSH,
442 T_COMMIT,
443 T_FINISHED
444 } t_state;
445
446
447
448
449 unsigned int t_log_start;
450
451
452 int t_nr_buffers;
453
454
455
456
457
458 struct journal_head *t_reserved_list;
459
460
461
462
463
464 struct journal_head *t_locked_list;
465
466
467
468
469
470 struct journal_head *t_buffers;
471
472
473
474
475
476 struct journal_head *t_sync_datalist;
477
478
479
480
481
482
483 struct journal_head *t_forget;
484
485
486
487
488
489 struct journal_head *t_checkpoint_list;
490
491
492
493
494
495 struct journal_head *t_checkpoint_io_list;
496
497
498
499
500
501 struct journal_head *t_iobuf_list;
502
503
504
505
506
507
508 struct journal_head *t_shadow_list;
509
510
511
512
513
514 struct journal_head *t_log_list;
515
516
517
518
519 spinlock_t t_handle_lock;
520
521
522
523
524
525 int t_updates;
526
527
528
529
530
531 int t_outstanding_credits;
532
533
534
535
536
537 transaction_t *t_cpnext, *t_cpprev;
538
539
540
541
542
543 unsigned long t_expires;
544
545
546
547
548 ktime_t t_start_time;
549
550
551
552
553 int t_handle_count;
554
555
556
557
558
559 unsigned int t_synchronous_commit:1;
560};
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627struct journal_s
628{
629
630 unsigned long j_flags;
631
632
633
634
635
636 int j_errno;
637
638
639 struct buffer_head *j_sb_buffer;
640 journal_superblock_t *j_superblock;
641
642
643 int j_format_version;
644
645
646
647
648 spinlock_t j_state_lock;
649
650
651
652
653 int j_barrier_count;
654
655
656 struct mutex j_barrier;
657
658
659
660
661
662 transaction_t *j_running_transaction;
663
664
665
666
667
668 transaction_t *j_committing_transaction;
669
670
671
672
673
674 transaction_t *j_checkpoint_transactions;
675
676
677
678
679
680 wait_queue_head_t j_wait_transaction_locked;
681
682
683 wait_queue_head_t j_wait_logspace;
684
685
686 wait_queue_head_t j_wait_done_commit;
687
688
689 wait_queue_head_t j_wait_checkpoint;
690
691
692 wait_queue_head_t j_wait_commit;
693
694
695 wait_queue_head_t j_wait_updates;
696
697
698 struct mutex j_checkpoint_mutex;
699
700
701
702
703
704 unsigned int j_head;
705
706
707
708
709
710 unsigned int j_tail;
711
712
713
714
715
716 unsigned int j_free;
717
718
719
720
721
722 unsigned int j_first;
723 unsigned int j_last;
724
725
726
727
728
729 struct block_device *j_dev;
730 int j_blocksize;
731 unsigned int j_blk_offset;
732
733
734
735
736
737 struct block_device *j_fs_dev;
738
739
740 unsigned int j_maxlen;
741
742
743
744
745 spinlock_t j_list_lock;
746
747
748
749
750 struct inode *j_inode;
751
752
753
754
755 tid_t j_tail_sequence;
756
757
758
759
760 tid_t j_transaction_sequence;
761
762
763
764
765
766 tid_t j_commit_sequence;
767
768
769
770
771
772 tid_t j_commit_request;
773
774
775
776
777
778
779
780 __u8 j_uuid[16];
781
782
783 struct task_struct *j_task;
784
785
786
787
788
789 int j_max_transaction_buffers;
790
791
792
793
794 unsigned long j_commit_interval;
795
796
797 struct timer_list j_commit_timer;
798
799
800
801
802
803 spinlock_t j_revoke_lock;
804 struct jbd_revoke_table_s *j_revoke;
805 struct jbd_revoke_table_s *j_revoke_table[2];
806
807
808
809
810 struct buffer_head **j_wbuf;
811 int j_wbufsize;
812
813
814
815
816
817 pid_t j_last_sync_writer;
818
819
820
821
822
823 u64 j_average_commit_time;
824
825
826
827
828
829 void *j_private;
830};
831
832
833
834
835#define JFS_UNMOUNT 0x001
836#define JFS_ABORT 0x002
837#define JFS_ACK_ERR 0x004
838#define JFS_FLUSHED 0x008
839#define JFS_LOADED 0x010
840#define JFS_BARRIER 0x020
841#define JFS_ABORT_ON_SYNCDATA_ERR 0x040
842
843
844
845
846
847
848
849
850
851extern void journal_unfile_buffer(journal_t *, struct journal_head *);
852extern void __journal_unfile_buffer(struct journal_head *);
853extern void __journal_refile_buffer(struct journal_head *);
854extern void journal_refile_buffer(journal_t *, struct journal_head *);
855extern void __journal_file_buffer(struct journal_head *, transaction_t *, int);
856extern void __journal_free_buffer(struct journal_head *bh);
857extern void journal_file_buffer(struct journal_head *, transaction_t *, int);
858extern void __journal_clean_data_list(transaction_t *transaction);
859
860
861extern struct journal_head * journal_get_descriptor_buffer(journal_t *);
862int journal_next_log_block(journal_t *, unsigned int *);
863
864
865extern void journal_commit_transaction(journal_t *);
866
867
868int __journal_clean_checkpoint_list(journal_t *journal);
869int __journal_remove_checkpoint(struct journal_head *);
870void __journal_insert_checkpoint(struct journal_head *, transaction_t *);
871
872
873extern int
874journal_write_metadata_buffer(transaction_t *transaction,
875 struct journal_head *jh_in,
876 struct journal_head **jh_out,
877 unsigned int blocknr);
878
879
880extern void __wait_on_journal (journal_t *);
881
882
883
884
885
886
887
888
889
890
891
892
893static inline handle_t *journal_current_handle(void)
894{
895 return current->journal_info;
896}
897
898
899
900
901
902
903
904extern handle_t *journal_start(journal_t *, int nblocks);
905extern int journal_restart (handle_t *, int nblocks);
906extern int journal_extend (handle_t *, int nblocks);
907extern int journal_get_write_access(handle_t *, struct buffer_head *);
908extern int journal_get_create_access (handle_t *, struct buffer_head *);
909extern int journal_get_undo_access(handle_t *, struct buffer_head *);
910extern int journal_dirty_data (handle_t *, struct buffer_head *);
911extern int journal_dirty_metadata (handle_t *, struct buffer_head *);
912extern void journal_release_buffer (handle_t *, struct buffer_head *);
913extern int journal_forget (handle_t *, struct buffer_head *);
914extern void journal_sync_buffer (struct buffer_head *);
915extern void journal_invalidatepage(journal_t *,
916 struct page *, unsigned long);
917extern int journal_try_to_free_buffers(journal_t *, struct page *, gfp_t);
918extern int journal_stop(handle_t *);
919extern int journal_flush (journal_t *);
920extern void journal_lock_updates (journal_t *);
921extern void journal_unlock_updates (journal_t *);
922
923extern journal_t * journal_init_dev(struct block_device *bdev,
924 struct block_device *fs_dev,
925 int start, int len, int bsize);
926extern journal_t * journal_init_inode (struct inode *);
927extern int journal_update_format (journal_t *);
928extern int journal_check_used_features
929 (journal_t *, unsigned long, unsigned long, unsigned long);
930extern int journal_check_available_features
931 (journal_t *, unsigned long, unsigned long, unsigned long);
932extern int journal_set_features
933 (journal_t *, unsigned long, unsigned long, unsigned long);
934extern int journal_create (journal_t *);
935extern int journal_load (journal_t *journal);
936extern int journal_destroy (journal_t *);
937extern int journal_recover (journal_t *journal);
938extern int journal_wipe (journal_t *, int);
939extern int journal_skip_recovery (journal_t *);
940extern void journal_update_superblock (journal_t *, int);
941extern void journal_abort (journal_t *, int);
942extern int journal_errno (journal_t *);
943extern void journal_ack_err (journal_t *);
944extern int journal_clear_err (journal_t *);
945extern int journal_bmap(journal_t *, unsigned int, unsigned int *);
946extern int journal_force_commit(journal_t *);
947
948
949
950
951struct journal_head *journal_add_journal_head(struct buffer_head *bh);
952struct journal_head *journal_grab_journal_head(struct buffer_head *bh);
953void journal_remove_journal_head(struct buffer_head *bh);
954void journal_put_journal_head(struct journal_head *jh);
955
956
957
958
959extern struct kmem_cache *jbd_handle_cache;
960
961static inline handle_t *jbd_alloc_handle(gfp_t gfp_flags)
962{
963 return kmem_cache_alloc(jbd_handle_cache, gfp_flags);
964}
965
966static inline void jbd_free_handle(handle_t *handle)
967{
968 kmem_cache_free(jbd_handle_cache, handle);
969}
970
971
972#define JOURNAL_REVOKE_DEFAULT_HASH 256
973extern int journal_init_revoke(journal_t *, int);
974extern void journal_destroy_revoke_caches(void);
975extern int journal_init_revoke_caches(void);
976
977extern void journal_destroy_revoke(journal_t *);
978extern int journal_revoke (handle_t *,
979 unsigned int, struct buffer_head *);
980extern int journal_cancel_revoke(handle_t *, struct journal_head *);
981extern void journal_write_revoke_records(journal_t *,
982 transaction_t *, int);
983
984
985extern int journal_set_revoke(journal_t *, unsigned int, tid_t);
986extern int journal_test_revoke(journal_t *, unsigned int, tid_t);
987extern void journal_clear_revoke(journal_t *);
988extern void journal_switch_revoke_table(journal_t *journal);
989
990
991
992
993
994
995
996
997int __log_space_left(journal_t *);
998int log_start_commit(journal_t *journal, tid_t tid);
999int __log_start_commit(journal_t *journal, tid_t tid);
1000int journal_start_commit(journal_t *journal, tid_t *tid);
1001int journal_force_commit_nested(journal_t *journal);
1002int log_wait_commit(journal_t *journal, tid_t tid);
1003int log_do_checkpoint(journal_t *journal);
1004
1005void __log_wait_for_space(journal_t *journal);
1006extern void __journal_drop_transaction(journal_t *, transaction_t *);
1007extern int cleanup_journal_tail(journal_t *);
1008
1009
1010
1011#define jbd_ENOSYS() \
1012do { \
1013 printk (KERN_ERR "JBD unimplemented function %s\n", __func__); \
1014 current->state = TASK_UNINTERRUPTIBLE; \
1015 schedule(); \
1016} while (1)
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028static inline int is_journal_aborted(journal_t *journal)
1029{
1030 return journal->j_flags & JFS_ABORT;
1031}
1032
1033static inline int is_handle_aborted(handle_t *handle)
1034{
1035 if (handle->h_aborted)
1036 return 1;
1037 return is_journal_aborted(handle->h_transaction->t_journal);
1038}
1039
1040static inline void journal_abort_handle(handle_t *handle)
1041{
1042 handle->h_aborted = 1;
1043}
1044
1045#endif
1046
1047
1048
1049
1050static inline int tid_gt(tid_t x, tid_t y)
1051{
1052 int difference = (x - y);
1053 return (difference > 0);
1054}
1055
1056static inline int tid_geq(tid_t x, tid_t y)
1057{
1058 int difference = (x - y);
1059 return (difference >= 0);
1060}
1061
1062extern int journal_blocks_per_page(struct inode *inode);
1063
1064
1065
1066
1067
1068static inline int jbd_space_needed(journal_t *journal)
1069{
1070 int nblocks = journal->j_max_transaction_buffers;
1071 if (journal->j_committing_transaction)
1072 nblocks += journal->j_committing_transaction->
1073 t_outstanding_credits;
1074 return nblocks;
1075}
1076
1077
1078
1079
1080
1081
1082#define BJ_None 0
1083#define BJ_SyncData 1
1084#define BJ_Metadata 2
1085#define BJ_Forget 3
1086#define BJ_IO 4
1087#define BJ_Shadow 5
1088#define BJ_LogCtl 6
1089#define BJ_Reserved 7
1090#define BJ_Locked 8
1091#define BJ_Types 9
1092
1093extern int jbd_blocks_per_page(struct inode *inode);
1094
1095#ifdef __KERNEL__
1096
1097#define buffer_trace_init(bh) do {} while (0)
1098#define print_buffer_fields(bh) do {} while (0)
1099#define print_buffer_trace(bh) do {} while (0)
1100#define BUFFER_TRACE(bh, info) do {} while (0)
1101#define BUFFER_TRACE2(bh, bh2, info) do {} while (0)
1102#define JBUFFER_TRACE(jh, info) do {} while (0)
1103
1104#endif
1105
1106#endif
1107