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