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