2 * linux/include/linux/jbd.h
4 * Written by Stephen C. Tweedie <sct@redhat.com>
6 * Copyright 1998-2000 Red Hat, Inc --- All Rights Reserved
8 * This file is part of the Linux kernel and is made available under
9 * the terms of the GNU General Public License, version 2, or at your
10 * option, any later version, incorporated herein by reference.
12 * Definitions for transaction data structures for the buffer cache
13 * filesystem journaling support.
19 #include "jfs_compat.h"
21 #define jfs_debug jbd_debug
24 #define __FUNCTION__ ""
27 #define journal_oom_retry 0
30 #ifdef CONFIG_JBD_DEBUG
32 * Define JBD_EXPENSIVE_CHECKING to enable more expensive internal
33 * consistency checks. By default we don't do this unless
34 * CONFIG_JBD_DEBUG is on.
36 #define JBD_EXPENSIVE_CHECKING
37 extern int journal_enable_debug;
39 #define jbd_debug(n, f, a...) \
41 if ((n) <= journal_enable_debug) { \
42 printk (KERN_DEBUG "(%s, %d): %s: ", \
43 __FILE__, __LINE__, __FUNCTION__); \
49 #if defined(__KERNEL__) || !defined(CONFIG_JBD_DEBUG)
50 #define jbd_debug(f, a...) /**/
52 extern int journal_enable_debug;
53 #define jbd_debug(n, f, a...) \
55 if ((n) <= journal_enable_debug) { \
56 printf("(%s, %d): %s: ", \
57 __FILE__, __LINE__, __func__); \
61 #endif /*__KERNEL__ */
63 #define jbd_debug(f, ...) /**/
67 #define jbd_debug(x) /* AIX doesn't do STDC */
70 extern void * __jbd_kmalloc (char *where, size_t size, int flags, int retry);
71 #define jbd_kmalloc(size, flags) \
72 __jbd_kmalloc(__FUNCTION__, (size), (flags), journal_oom_retry)
73 #define jbd_rep_kmalloc(size, flags) \
74 __jbd_kmalloc(__FUNCTION__, (size), (flags), 1)
76 #define JBD2_MIN_JOURNAL_BLOCKS 1024
77 #define JBD2_DEFAULT_FAST_COMMIT_BLOCKS 256
80 * Internal structures used by the logging mechanism:
83 #define JBD2_MAGIC_NUMBER 0xc03b3998U /* The first 4 bytes of /dev/random! */
90 * Descriptor block types:
93 #define JBD2_DESCRIPTOR_BLOCK 1
94 #define JBD2_COMMIT_BLOCK 2
95 #define JBD2_SUPERBLOCK_V1 3
96 #define JBD2_SUPERBLOCK_V2 4
97 #define JBD2_REVOKE_BLOCK 5
98 #define JBD2_FC_BLOCK 6
101 * Standard header for all descriptor blocks:
103 typedef struct journal_header_s
113 #define JBD2_CRC32_CHKSUM 1
114 #define JBD2_MD5_CHKSUM 2
115 #define JBD2_SHA1_CHKSUM 3
116 #define JBD2_CRC32C_CHKSUM 4
118 #define JBD2_CRC32_CHKSUM_SIZE 4
120 #define JBD2_CHECKSUM_BYTES (32 / sizeof(__u32))
122 * Commit block header for storing transactional checksums:
124 * NOTE: If FEATURE_COMPAT_CHECKSUM (checksum v1) is set, the h_chksum*
125 * fields are used to store a checksum of the descriptor and data blocks.
127 * If FEATURE_INCOMPAT_CSUM_V2 (checksum v2) is set, then the h_chksum
128 * field is used to store crc32c(uuid+commit_block). Each journal metadata
129 * block gets its own checksum, and data block checksums are stored in
130 * journal_block_tag (in the descriptor). The other h_chksum* fields are
133 * If FEATURE_INCOMPAT_CSUM_V3 is set, the descriptor block uses
134 * journal_block_tag3_t to store a full 32-bit checksum. Everything else
137 * Checksum v1, v2, and v3 are mutually exclusive features.
139 struct commit_header {
143 unsigned char h_chksum_type;
144 unsigned char h_chksum_size;
145 unsigned char h_padding[2];
146 __be32 h_chksum[JBD2_CHECKSUM_BYTES];
148 __be32 h_commit_nsec;
152 * The block tag: used to describe a single buffer in the journal
154 typedef struct journal_block_tag3_s
156 __be32 t_blocknr; /* The on-disk block number */
157 __be32 t_flags; /* See below */
158 __be32 t_blocknr_high; /* most-significant high 32bits. */
159 __be32 t_checksum; /* crc32c(uuid+seq+block) */
160 } journal_block_tag3_t;
162 typedef struct journal_block_tag_s
164 __be32 t_blocknr; /* The on-disk block number */
165 __be16 t_checksum; /* truncated crc32c(uuid+seq+block) */
166 __be16 t_flags; /* See below */
167 __be32 t_blocknr_high; /* most-significant high 32bits. */
168 } journal_block_tag_t;
170 /* Tail of descriptor or revoke block, for checksumming */
171 struct jbd2_journal_block_tail {
176 * The revoke descriptor: used on disk to describe a series of blocks to
177 * be revoked from the log
179 typedef struct journal_revoke_header_s
181 journal_header_t r_header;
182 __be32 r_count; /* Count of bytes used in the block */
183 } jbd2_journal_revoke_header_t;
185 /* Definitions for the journal tag flags word: */
186 #define JBD2_FLAG_ESCAPE 1 /* on-disk block is escaped */
187 #define JBD2_FLAG_SAME_UUID 2 /* block has same uuid as previous */
188 #define JBD2_FLAG_DELETED 4 /* block deleted by this transaction */
189 #define JBD2_FLAG_LAST_TAG 8 /* last tag in this descriptor block */
193 #define JBD2_USERS_MAX 48
194 #define JBD2_USERS_SIZE (UUID_SIZE * JBD2_USERS_MAX)
196 * The journal superblock. All fields are in big-endian byte order.
198 typedef struct journal_superblock_s
201 journal_header_t s_header;
204 /* Static information describing the journal */
205 __be32 s_blocksize; /* journal device blocksize */
206 __be32 s_maxlen; /* total blocks in journal file */
207 __be32 s_first; /* first block of log information */
210 /* Dynamic information describing the current state of the log */
211 __be32 s_sequence; /* first commit ID expected in log */
212 __be32 s_start; /* blocknr of start of log */
215 /* Error value, as set by journal_abort(). */
219 /* Remaining fields are only valid in a version-2 superblock */
220 __be32 s_feature_compat; /* compatible feature set */
221 __be32 s_feature_incompat; /* incompatible feature set */
222 __be32 s_feature_ro_compat; /* readonly-compatible feature set */
224 __u8 s_uuid[16]; /* 128-bit uuid for journal */
227 __be32 s_nr_users; /* Nr of filesystems sharing log */
229 __be32 s_dynsuper; /* Blocknr of dynamic superblock copy*/
232 __be32 s_max_transaction; /* Limit of journal blocks per trans.*/
233 __be32 s_max_trans_data; /* Limit of data blocks per trans. */
236 __u8 s_checksum_type; /* checksum type */
239 __be32 s_num_fc_blks; /* Number of fast commit blocks */
241 __be32 s_padding[41];
242 __be32 s_checksum; /* crc32c(superblock) */
245 __u8 s_users[JBD2_USERS_SIZE]; /* ids of all fs'es sharing the log */
248 } journal_superblock_t;
250 #define JBD2_HAS_COMPAT_FEATURE(j,mask) \
251 ((j)->j_format_version >= 2 && \
252 ((j)->j_superblock->s_feature_compat & ext2fs_cpu_to_be32((mask))))
253 #define JBD2_HAS_RO_COMPAT_FEATURE(j,mask) \
254 ((j)->j_format_version >= 2 && \
255 ((j)->j_superblock->s_feature_ro_compat & ext2fs_cpu_to_be32((mask))))
256 #define JBD2_HAS_INCOMPAT_FEATURE(j,mask) \
257 ((j)->j_format_version >= 2 && \
258 ((j)->j_superblock->s_feature_incompat & ext2fs_cpu_to_be32((mask))))
260 #define JBD2_FEATURE_COMPAT_CHECKSUM 0x00000001
262 #define JBD2_FEATURE_INCOMPAT_REVOKE 0x00000001
263 #define JBD2_FEATURE_INCOMPAT_64BIT 0x00000002
264 #define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004
265 #define JBD2_FEATURE_INCOMPAT_CSUM_V2 0x00000008
266 #define JBD2_FEATURE_INCOMPAT_CSUM_V3 0x00000010
267 #define JBD2_FEATURE_INCOMPAT_FAST_COMMIT 0x00000020
269 /* Features known to this kernel version: */
270 #define JBD2_KNOWN_COMPAT_FEATURES 0
271 #define JBD2_KNOWN_ROCOMPAT_FEATURES 0
272 #define JBD2_KNOWN_INCOMPAT_FEATURES (JBD2_FEATURE_INCOMPAT_REVOKE|\
273 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT| \
274 JBD2_FEATURE_INCOMPAT_64BIT|\
275 JBD2_FEATURE_INCOMPAT_CSUM_V2| \
276 JBD2_FEATURE_INCOMPAT_CSUM_V3 | \
277 JBD2_FEATURE_INCOMPAT_FAST_COMMIT)
279 #ifdef NO_INLINE_FUNCS
280 extern size_t journal_tag_bytes(journal_t *journal);
281 extern int jbd2_journal_has_csum_v2or3(journal_t *journal);
282 extern int tid_gt(tid_t x, tid_t y) EXT2FS_ATTR((unused));
283 extern int tid_geq(tid_t x, tid_t y) EXT2FS_ATTR((unused));
286 #if (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
287 #ifdef E2FSCK_INCLUDE_INLINE_FUNCS
288 #if (__STDC_VERSION__ >= 199901L)
289 #define _INLINE_ extern inline
291 #define _INLINE_ inline
293 #else /* !E2FSCK_INCLUDE_INLINE FUNCS */
294 #if (__STDC_VERSION__ >= 199901L)
295 #define _INLINE_ inline
298 #define _INLINE_ extern __inline__
299 #else /* For Watcom C */
300 #define _INLINE_ extern inline
301 #endif /* __GNUC__ */
302 #endif /* __STDC_VERSION__ >= 199901L */
303 #endif /* INCLUDE_INLINE_FUNCS */
305 /* journal feature predicate functions */
306 #define JBD2_FEATURE_COMPAT_FUNCS(name, flagname) \
307 _INLINE_ int jbd2_has_feature_##name(journal_t *j); \
308 _INLINE_ int jbd2_has_feature_##name(journal_t *j) \
310 return ((j)->j_format_version >= 2 && \
311 ((j)->j_superblock->s_feature_compat & \
312 ext2fs_cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname)) != 0); \
314 _INLINE_ void jbd2_set_feature_##name(journal_t *j); \
315 _INLINE_ void jbd2_set_feature_##name(journal_t *j) \
317 (j)->j_superblock->s_feature_compat |= \
318 ext2fs_cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname); \
320 _INLINE_ void jbd2_clear_feature_##name(journal_t *j); \
321 _INLINE_ void jbd2_clear_feature_##name(journal_t *j) \
323 (j)->j_superblock->s_feature_compat &= \
324 ~ext2fs_cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname); \
327 #define JBD2_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
328 _INLINE_ int jbd2_has_feature_##name(journal_t *j); \
329 _INLINE_ int jbd2_has_feature_##name(journal_t *j) \
331 return ((j)->j_format_version >= 2 && \
332 ((j)->j_superblock->s_feature_ro_compat & \
333 ext2fs_cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname)) != 0); \
335 _INLINE_ void jbd2_set_feature_##name(journal_t *j); \
336 _INLINE_ void jbd2_set_feature_##name(journal_t *j) \
338 (j)->j_superblock->s_feature_ro_compat |= \
339 ext2fs_cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname); \
341 _INLINE_ void jbd2_clear_feature_##name(journal_t *j); \
342 _INLINE_ void jbd2_clear_feature_##name(journal_t *j) \
344 (j)->j_superblock->s_feature_ro_compat &= \
345 ~ext2fs_cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname); \
348 #define JBD2_FEATURE_INCOMPAT_FUNCS(name, flagname) \
349 _INLINE_ int jbd2_has_feature_##name(journal_t *j); \
350 _INLINE_ int jbd2_has_feature_##name(journal_t *j) \
352 return ((j)->j_format_version >= 2 && \
353 ((j)->j_superblock->s_feature_incompat & \
354 ext2fs_cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname)) != 0); \
356 _INLINE_ void jbd2_set_feature_##name(journal_t *j); \
357 _INLINE_ void jbd2_set_feature_##name(journal_t *j) \
359 (j)->j_superblock->s_feature_incompat |= \
360 ext2fs_cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname); \
362 _INLINE_ void jbd2_clear_feature_##name(journal_t *j); \
363 _INLINE_ void jbd2_clear_feature_##name(journal_t *j) \
365 (j)->j_superblock->s_feature_incompat &= \
366 ~ext2fs_cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname); \
370 #define JBD2_FEATURE_COMPAT_FUNCS(name, flagname) \
371 extern int jbd2_has_feature_##name(journal_t *j); \
372 extern void jbd2_set_feature_##name(journal_t *j); \
373 extern void jbd2_clear_feature_##name(journal_t *j);
375 #define JBD2_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
376 extern int jbd2_has_feature_##name(journal_t *j); \
377 extern void jbd2_set_feature_##name(journal_t *j); \
378 extern void jbd2_clear_feature_##name(journal_t *j);
380 #define JBD2_FEATURE_INCOMPAT_FUNCS(name, flagname) \
381 extern int jbd2_has_feature_##name(journal_t *j); \
382 extern void jbd2_set_feature_##name(journal_t *j); \
383 extern void jbd2_clear_feature_##name(journal_t *j);
385 #endif /* (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS)) */
387 JBD2_FEATURE_COMPAT_FUNCS(checksum, CHECKSUM)
389 JBD2_FEATURE_INCOMPAT_FUNCS(revoke, REVOKE)
390 JBD2_FEATURE_INCOMPAT_FUNCS(64bit, 64BIT)
391 JBD2_FEATURE_INCOMPAT_FUNCS(async_commit, ASYNC_COMMIT)
392 JBD2_FEATURE_INCOMPAT_FUNCS(csum2, CSUM_V2)
393 JBD2_FEATURE_INCOMPAT_FUNCS(csum3, CSUM_V3)
394 JBD2_FEATURE_INCOMPAT_FUNCS(fast_commit, FAST_COMMIT)
396 #if (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
398 * helper functions to deal with 32 or 64bit block numbers.
400 _INLINE_ size_t journal_tag_bytes(journal_t *journal)
404 if (jbd2_has_feature_csum3(journal))
405 return sizeof(journal_block_tag3_t);
407 sz = sizeof(journal_block_tag_t);
409 if (jbd2_has_feature_csum2(journal))
412 if (jbd2_has_feature_64bit(journal))
415 return sz - sizeof(__u32);
418 _INLINE_ int jbd2_journal_has_csum_v2or3(journal_t *journal)
420 if (jbd2_has_feature_csum2(journal) || jbd2_has_feature_csum3(journal))
426 _INLINE_ int jbd2_journal_get_num_fc_blks(journal_superblock_t *jsb)
428 int num_fc_blocks = be32_to_cpu(jsb->s_num_fc_blks);
430 return num_fc_blocks ? num_fc_blocks : JBD2_DEFAULT_FAST_COMMIT_BLOCKS;
433 /* Comparison functions for transaction IDs: perform comparisons using
434 * modulo arithmetic so that they work over sequence number wraps. */
436 _INLINE_ int tid_gt(tid_t x, tid_t y)
438 int difference = (x - y);
439 return (difference > 0);
442 _INLINE_ int tid_geq(tid_t x, tid_t y)
444 int difference = (x - y);
445 return (difference >= 0);
447 #endif /* (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS)) */
451 extern int journal_blocks_per_page(struct inode *inode);
454 * Definitions which augment the buffer_head layer
457 /* journaling buffer types */
458 #define BJ_None 0 /* Not journaled */
459 #define BJ_SyncData 1 /* Normal data: flush before commit */
460 #define BJ_AsyncData 2 /* writepage data: wait on it before commit */
461 #define BJ_Metadata 3 /* Normal journaled metadata */
462 #define BJ_Forget 4 /* Buffer superceded by this transaction */
463 #define BJ_IO 5 /* Buffer is for temporary IO use */
464 #define BJ_Shadow 6 /* Buffer contents being shadowed to the log */
465 #define BJ_LogCtl 7 /* Buffer contains log descriptors */
466 #define BJ_Reserved 8 /* Buffer is reserved for access by journal */
469 extern int jbd_blocks_per_page(struct inode *inode);
471 #endif /* _LINUX_JBD_H */