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__, __FUNCTION__); \
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 long 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 int t_handle_count;
549
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
615struct journal_s
616{
617
618 unsigned long j_flags;
619
620
621
622
623
624 int j_errno;
625
626
627 struct buffer_head *j_sb_buffer;
628 journal_superblock_t *j_superblock;
629
630
631 int j_format_version;
632
633
634
635
636 spinlock_t j_state_lock;
637
638
639
640
641 int j_barrier_count;
642
643
644 struct mutex j_barrier;
645
646
647
648
649
650 transaction_t *j_running_transaction;
651
652
653
654
655
656 transaction_t *j_committing_transaction;
657
658
659
660
661
662 transaction_t *j_checkpoint_transactions;
663
664
665
666
667
668 wait_queue_head_t j_wait_transaction_locked;
669
670
671 wait_queue_head_t j_wait_logspace;
672
673
674 wait_queue_head_t j_wait_done_commit;
675
676
677 wait_queue_head_t j_wait_checkpoint;
678
679
680 wait_queue_head_t j_wait_commit;
681
682
683 wait_queue_head_t j_wait_updates;
684
685
686 struct mutex j_checkpoint_mutex;
687
688
689
690
691
692 unsigned long j_head;
693
694
695
696
697
698 unsigned long j_tail;
699
700
701
702
703
704 unsigned long j_free;
705
706
707
708
709
710 unsigned long j_first;
711 unsigned long j_last;
712
713
714
715
716
717 struct block_device *j_dev;
718 int j_blocksize;
719 unsigned long j_blk_offset;
720
721
722
723
724
725 struct block_device *j_fs_dev;
726
727
728 unsigned int j_maxlen;
729
730
731
732
733 spinlock_t j_list_lock;
734
735
736
737
738 struct inode *j_inode;
739
740
741
742
743 tid_t j_tail_sequence;
744
745
746
747
748 tid_t j_transaction_sequence;
749
750
751
752
753
754 tid_t j_commit_sequence;
755
756
757
758
759
760 tid_t j_commit_request;
761
762
763
764
765
766
767
768 __u8 j_uuid[16];
769
770
771 struct task_struct *j_task;
772
773
774
775
776
777 int j_max_transaction_buffers;
778
779
780
781
782 unsigned long j_commit_interval;
783
784
785 struct timer_list j_commit_timer;
786
787
788
789
790
791 spinlock_t j_revoke_lock;
792 struct jbd_revoke_table_s *j_revoke;
793 struct jbd_revoke_table_s *j_revoke_table[2];
794
795
796
797
798 struct buffer_head **j_wbuf;
799 int j_wbufsize;
800
801 pid_t j_last_sync_writer;
802
803
804
805
806
807 void *j_private;
808};
809
810
811
812
813#define JFS_UNMOUNT 0x001
814#define JFS_ABORT 0x002
815#define JFS_ACK_ERR 0x004
816#define JFS_FLUSHED 0x008
817#define JFS_LOADED 0x010
818#define JFS_BARRIER 0x020
819
820
821
822
823
824
825
826extern void journal_unfile_buffer(journal_t *, struct journal_head *);
827extern void __journal_unfile_buffer(struct journal_head *);
828extern void __journal_refile_buffer(struct journal_head *);
829extern void journal_refile_buffer(journal_t *, struct journal_head *);
830extern void __journal_file_buffer(struct journal_head *, transaction_t *, int);
831extern void __journal_free_buffer(struct journal_head *bh);
832extern void journal_file_buffer(struct journal_head *, transaction_t *, int);
833extern void __journal_clean_data_list(transaction_t *transaction);
834
835
836extern struct journal_head * journal_get_descriptor_buffer(journal_t *);
837int journal_next_log_block(journal_t *, unsigned long *);
838
839
840extern void journal_commit_transaction(journal_t *);
841
842
843int __journal_clean_checkpoint_list(journal_t *journal);
844int __journal_remove_checkpoint(struct journal_head *);
845void __journal_insert_checkpoint(struct journal_head *, transaction_t *);
846
847
848extern int
849journal_write_metadata_buffer(transaction_t *transaction,
850 struct journal_head *jh_in,
851 struct journal_head **jh_out,
852 unsigned long blocknr);
853
854
855extern void __wait_on_journal (journal_t *);
856
857
858
859
860
861
862
863
864
865
866
867
868static inline handle_t *journal_current_handle(void)
869{
870 return current->journal_info;
871}
872
873
874
875
876
877
878
879extern handle_t *journal_start(journal_t *, int nblocks);
880extern int journal_restart (handle_t *, int nblocks);
881extern int journal_extend (handle_t *, int nblocks);
882extern int journal_get_write_access(handle_t *, struct buffer_head *);
883extern int journal_get_create_access (handle_t *, struct buffer_head *);
884extern int journal_get_undo_access(handle_t *, struct buffer_head *);
885extern int journal_dirty_data (handle_t *, struct buffer_head *);
886extern int journal_dirty_metadata (handle_t *, struct buffer_head *);
887extern void journal_release_buffer (handle_t *, struct buffer_head *);
888extern int journal_forget (handle_t *, struct buffer_head *);
889extern void journal_sync_buffer (struct buffer_head *);
890extern void journal_invalidatepage(journal_t *,
891 struct page *, unsigned long);
892extern int journal_try_to_free_buffers(journal_t *, struct page *, gfp_t);
893extern int journal_stop(handle_t *);
894extern int journal_flush (journal_t *);
895extern void journal_lock_updates (journal_t *);
896extern void journal_unlock_updates (journal_t *);
897
898extern journal_t * journal_init_dev(struct block_device *bdev,
899 struct block_device *fs_dev,
900 int start, int len, int bsize);
901extern journal_t * journal_init_inode (struct inode *);
902extern int journal_update_format (journal_t *);
903extern int journal_check_used_features
904 (journal_t *, unsigned long, unsigned long, unsigned long);
905extern int journal_check_available_features
906 (journal_t *, unsigned long, unsigned long, unsigned long);
907extern int journal_set_features
908 (journal_t *, unsigned long, unsigned long, unsigned long);
909extern int journal_create (journal_t *);
910extern int journal_load (journal_t *journal);
911extern void journal_destroy (journal_t *);
912extern int journal_recover (journal_t *journal);
913extern int journal_wipe (journal_t *, int);
914extern int journal_skip_recovery (journal_t *);
915extern void journal_update_superblock (journal_t *, int);
916extern void journal_abort (journal_t *, int);
917extern int journal_errno (journal_t *);
918extern void journal_ack_err (journal_t *);
919extern int journal_clear_err (journal_t *);
920extern int journal_bmap(journal_t *, unsigned long, unsigned long *);
921extern int journal_force_commit(journal_t *);
922
923
924
925
926struct journal_head *journal_add_journal_head(struct buffer_head *bh);
927struct journal_head *journal_grab_journal_head(struct buffer_head *bh);
928void journal_remove_journal_head(struct buffer_head *bh);
929void journal_put_journal_head(struct journal_head *jh);
930
931
932
933
934extern struct kmem_cache *jbd_handle_cache;
935
936static inline handle_t *jbd_alloc_handle(gfp_t gfp_flags)
937{
938 return kmem_cache_alloc(jbd_handle_cache, gfp_flags);
939}
940
941static inline void jbd_free_handle(handle_t *handle)
942{
943 kmem_cache_free(jbd_handle_cache, handle);
944}
945
946
947#define JOURNAL_REVOKE_DEFAULT_HASH 256
948extern int journal_init_revoke(journal_t *, int);
949extern void journal_destroy_revoke_caches(void);
950extern int journal_init_revoke_caches(void);
951
952extern void journal_destroy_revoke(journal_t *);
953extern int journal_revoke (handle_t *,
954 unsigned long, struct buffer_head *);
955extern int journal_cancel_revoke(handle_t *, struct journal_head *);
956extern void journal_write_revoke_records(journal_t *, transaction_t *);
957
958
959extern int journal_set_revoke(journal_t *, unsigned long, tid_t);
960extern int journal_test_revoke(journal_t *, unsigned long, tid_t);
961extern void journal_clear_revoke(journal_t *);
962extern void journal_switch_revoke_table(journal_t *journal);
963
964
965
966
967
968
969
970
971int __log_space_left(journal_t *);
972int log_start_commit(journal_t *journal, tid_t tid);
973int __log_start_commit(journal_t *journal, tid_t tid);
974int journal_start_commit(journal_t *journal, tid_t *tid);
975int journal_force_commit_nested(journal_t *journal);
976int log_wait_commit(journal_t *journal, tid_t tid);
977int log_do_checkpoint(journal_t *journal);
978
979void __log_wait_for_space(journal_t *journal);
980extern void __journal_drop_transaction(journal_t *, transaction_t *);
981extern int cleanup_journal_tail(journal_t *);
982
983
984
985#define jbd_ENOSYS() \
986do { \
987 printk (KERN_ERR "JBD unimplemented function %s\n", __FUNCTION__); \
988 current->state = TASK_UNINTERRUPTIBLE; \
989 schedule(); \
990} while (1)
991
992
993
994
995
996
997
998
999
1000
1001
1002static inline int is_journal_aborted(journal_t *journal)
1003{
1004 return journal->j_flags & JFS_ABORT;
1005}
1006
1007static inline int is_handle_aborted(handle_t *handle)
1008{
1009 if (handle->h_aborted)
1010 return 1;
1011 return is_journal_aborted(handle->h_transaction->t_journal);
1012}
1013
1014static inline void journal_abort_handle(handle_t *handle)
1015{
1016 handle->h_aborted = 1;
1017}
1018
1019#endif
1020
1021
1022
1023
1024static inline int tid_gt(tid_t x, tid_t y)
1025{
1026 int difference = (x - y);
1027 return (difference > 0);
1028}
1029
1030static inline int tid_geq(tid_t x, tid_t y)
1031{
1032 int difference = (x - y);
1033 return (difference >= 0);
1034}
1035
1036extern int journal_blocks_per_page(struct inode *inode);
1037
1038
1039
1040
1041
1042static inline int jbd_space_needed(journal_t *journal)
1043{
1044 int nblocks = journal->j_max_transaction_buffers;
1045 if (journal->j_committing_transaction)
1046 nblocks += journal->j_committing_transaction->
1047 t_outstanding_credits;
1048 return nblocks;
1049}
1050
1051
1052
1053
1054
1055
1056#define BJ_None 0
1057#define BJ_SyncData 1
1058#define BJ_Metadata 2
1059#define BJ_Forget 3
1060#define BJ_IO 4
1061#define BJ_Shadow 5
1062#define BJ_LogCtl 6
1063#define BJ_Reserved 7
1064#define BJ_Locked 8
1065#define BJ_Types 9
1066
1067extern int jbd_blocks_per_page(struct inode *inode);
1068
1069#ifdef __KERNEL__
1070
1071#define buffer_trace_init(bh) do {} while (0)
1072#define print_buffer_fields(bh) do {} while (0)
1073#define print_buffer_trace(bh) do {} while (0)
1074#define BUFFER_TRACE(bh, info) do {} while (0)
1075#define BUFFER_TRACE2(bh, bh2, info) do {} while (0)
1076#define JBUFFER_TRACE(jh, info) do {} while (0)
1077
1078#endif
1079
1080#endif
1081