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 1
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 #define jbd_debug(f, a...) /**/
51 #define jbd_debug(f, ...) /**/
55 #define jbd_debug(x) /* AIX doesn't do STDC */
58 extern void * __jbd_kmalloc (char *where, size_t size, int flags, int retry);
59 #define jbd_kmalloc(size, flags) \
60 __jbd_kmalloc(__FUNCTION__, (size), (flags), journal_oom_retry)
61 #define jbd_rep_kmalloc(size, flags) \
62 __jbd_kmalloc(__FUNCTION__, (size), (flags), 1)
64 #define JFS_MIN_JOURNAL_BLOCKS 1024
67 * Internal structures used by the logging mechanism:
70 #define JFS_MAGIC_NUMBER 0xc03b3998U /* The first 4 bytes of /dev/random! */
77 * Descriptor block types:
80 #define JFS_DESCRIPTOR_BLOCK 1
81 #define JFS_COMMIT_BLOCK 2
82 #define JFS_SUPERBLOCK_V1 3
83 #define JFS_SUPERBLOCK_V2 4
84 #define JFS_REVOKE_BLOCK 5
87 * Standard header for all descriptor blocks:
89 typedef struct journal_header_s
99 #define JBD2_CRC32_CHKSUM 1
100 #define JBD2_MD5_CHKSUM 2
101 #define JBD2_SHA1_CHKSUM 3
102 #define JBD2_CRC32C_CHKSUM 4
104 #define JBD2_CRC32_CHKSUM_SIZE 4
106 #define JBD2_CHECKSUM_BYTES (32 / sizeof(__u32))
108 * Commit block header for storing transactional checksums:
110 * NOTE: If FEATURE_COMPAT_CHECKSUM (checksum v1) is set, the h_chksum*
111 * fields are used to store a checksum of the descriptor and data blocks.
113 * If FEATURE_INCOMPAT_CSUM_V2 (checksum v2) is set, then the h_chksum
114 * field is used to store crc32c(uuid+commit_block). Each journal metadata
115 * block gets its own checksum, and data block checksums are stored in
116 * journal_block_tag (in the descriptor). The other h_chksum* fields are
119 * If FEATURE_INCOMPAT_CSUM_V3 is set, the descriptor block uses
120 * journal_block_tag3_t to store a full 32-bit checksum. Everything else
123 * Checksum v1, v2, and v3 are mutually exclusive features.
125 struct commit_header {
129 unsigned char h_chksum_type;
130 unsigned char h_chksum_size;
131 unsigned char h_padding[2];
132 __u32 h_chksum[JBD2_CHECKSUM_BYTES];
138 * The block tag: used to describe a single buffer in the journal
140 typedef struct journal_block_tag3_s
142 __u32 t_blocknr; /* The on-disk block number */
143 __u32 t_flags; /* See below */
144 __u32 t_blocknr_high; /* most-significant high 32bits. */
145 __u32 t_checksum; /* crc32c(uuid+seq+block) */
146 } journal_block_tag3_t;
148 typedef struct journal_block_tag_s
150 __u32 t_blocknr; /* The on-disk block number */
151 __u16 t_checksum; /* truncated crc32c(uuid+seq+block) */
152 __u16 t_flags; /* See below */
153 __u32 t_blocknr_high; /* most-significant high 32bits. */
154 } journal_block_tag_t;
156 /* Tail of descriptor block, for checksumming */
157 struct journal_block_tail {
162 * The revoke descriptor: used on disk to describe a series of blocks to
163 * be revoked from the log
165 typedef struct journal_revoke_header_s
167 journal_header_t r_header;
168 int r_count; /* Count of bytes used in the block */
169 } journal_revoke_header_t;
171 /* Tail of revoke block, for checksumming */
172 struct journal_revoke_tail {
176 /* Definitions for the journal tag flags word: */
177 #define JFS_FLAG_ESCAPE 1 /* on-disk block is escaped */
178 #define JFS_FLAG_SAME_UUID 2 /* block has same uuid as previous */
179 #define JFS_FLAG_DELETED 4 /* block deleted by this transaction */
180 #define JFS_FLAG_LAST_TAG 8 /* last tag in this descriptor block */
184 #define JFS_USERS_MAX 48
185 #define JFS_USERS_SIZE (UUID_SIZE * JFS_USERS_MAX)
187 * The journal superblock. All fields are in big-endian byte order.
189 typedef struct journal_superblock_s
192 journal_header_t s_header;
195 /* Static information describing the journal */
196 __u32 s_blocksize; /* journal device blocksize */
197 __u32 s_maxlen; /* total blocks in journal file */
198 __u32 s_first; /* first block of log information */
201 /* Dynamic information describing the current state of the log */
202 __u32 s_sequence; /* first commit ID expected in log */
203 __u32 s_start; /* blocknr of start of log */
206 /* Error value, as set by journal_abort(). */
210 /* Remaining fields are only valid in a version-2 superblock */
211 __u32 s_feature_compat; /* compatible feature set */
212 __u32 s_feature_incompat; /* incompatible feature set */
213 __u32 s_feature_ro_compat; /* readonly-compatible feature set */
215 __u8 s_uuid[16]; /* 128-bit uuid for journal */
218 __u32 s_nr_users; /* Nr of filesystems sharing log */
220 __u32 s_dynsuper; /* Blocknr of dynamic superblock copy*/
223 __u32 s_max_transaction; /* Limit of journal blocks per trans.*/
224 __u32 s_max_trans_data; /* Limit of data blocks per trans. */
227 __u8 s_checksum_type; /* checksum type */
230 __u32 s_checksum; /* crc32c(superblock) */
233 __u8 s_users[JFS_USERS_SIZE]; /* ids of all fs'es sharing the log */
236 } journal_superblock_t;
238 #define JFS_HAS_COMPAT_FEATURE(j,mask) \
239 ((j)->j_format_version >= 2 && \
240 ((j)->j_superblock->s_feature_compat & ext2fs_cpu_to_be32((mask))))
241 #define JFS_HAS_RO_COMPAT_FEATURE(j,mask) \
242 ((j)->j_format_version >= 2 && \
243 ((j)->j_superblock->s_feature_ro_compat & ext2fs_cpu_to_be32((mask))))
244 #define JFS_HAS_INCOMPAT_FEATURE(j,mask) \
245 ((j)->j_format_version >= 2 && \
246 ((j)->j_superblock->s_feature_incompat & ext2fs_cpu_to_be32((mask))))
248 #define JFS_FEATURE_COMPAT_CHECKSUM 0x00000001
250 #define JFS_FEATURE_INCOMPAT_REVOKE 0x00000001
251 #define JFS_FEATURE_INCOMPAT_64BIT 0x00000002
252 #define JFS_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004
253 #define JFS_FEATURE_INCOMPAT_CSUM_V2 0x00000008
254 #define JFS_FEATURE_INCOMPAT_CSUM_V3 0x00000010
256 /* journal feature predicate functions */
257 #define JFS_FEATURE_COMPAT_FUNCS(name, flagname) \
258 static inline int jfs_has_feature_##name(journal_t *j) \
260 return ((j)->j_format_version >= 2 && \
261 ((j)->j_superblock->s_feature_compat & \
262 ext2fs_cpu_to_be32(JFS_FEATURE_COMPAT_##flagname)) != 0); \
264 static inline void jfs_set_feature_##name(journal_t *j) \
266 (j)->j_superblock->s_feature_compat |= \
267 ext2fs_cpu_to_be32(JFS_FEATURE_COMPAT_##flagname); \
269 static inline void jfs_clear_feature_##name(journal_t *j) \
271 (j)->j_superblock->s_feature_compat &= \
272 ~ext2fs_cpu_to_be32(JFS_FEATURE_COMPAT_##flagname); \
275 #define JFS_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
276 static inline int jfs_has_feature_##name(journal_t *j) \
278 return ((j)->j_format_version >= 2 && \
279 ((j)->j_superblock->s_feature_ro_compat & \
280 ext2fs_cpu_to_be32(JFS_FEATURE_RO_COMPAT_##flagname)) != 0); \
282 static inline void jfs_set_feature_##name(journal_t *j) \
284 (j)->j_superblock->s_feature_ro_compat |= \
285 ext2fs_cpu_to_be32(JFS_FEATURE_RO_COMPAT_##flagname); \
287 static inline void jfs_clear_feature_##name(journal_t *j) \
289 (j)->j_superblock->s_feature_ro_compat &= \
290 ~ext2fs_cpu_to_be32(JFS_FEATURE_RO_COMPAT_##flagname); \
293 #define JFS_FEATURE_INCOMPAT_FUNCS(name, flagname) \
294 static inline int jfs_has_feature_##name(journal_t *j) \
296 return ((j)->j_format_version >= 2 && \
297 ((j)->j_superblock->s_feature_incompat & \
298 ext2fs_cpu_to_be32(JFS_FEATURE_INCOMPAT_##flagname)) != 0); \
300 static inline void jfs_set_feature_##name(journal_t *j) \
302 (j)->j_superblock->s_feature_incompat |= \
303 ext2fs_cpu_to_be32(JFS_FEATURE_INCOMPAT_##flagname); \
305 static inline void jfs_clear_feature_##name(journal_t *j) \
307 (j)->j_superblock->s_feature_incompat &= \
308 ~ext2fs_cpu_to_be32(JFS_FEATURE_INCOMPAT_##flagname); \
311 JFS_FEATURE_COMPAT_FUNCS(checksum, CHECKSUM)
313 JFS_FEATURE_INCOMPAT_FUNCS(revoke, REVOKE)
314 JFS_FEATURE_INCOMPAT_FUNCS(64bit, 64BIT)
315 JFS_FEATURE_INCOMPAT_FUNCS(async_commit, ASYNC_COMMIT)
316 JFS_FEATURE_INCOMPAT_FUNCS(csum2, CSUM_V2)
317 JFS_FEATURE_INCOMPAT_FUNCS(csum3, CSUM_V3)
319 /* Features known to this kernel version: */
320 #define JFS_KNOWN_COMPAT_FEATURES 0
321 #define JFS_KNOWN_ROCOMPAT_FEATURES 0
322 #define JFS_KNOWN_INCOMPAT_FEATURES (JFS_FEATURE_INCOMPAT_REVOKE|\
323 JFS_FEATURE_INCOMPAT_ASYNC_COMMIT|\
324 JFS_FEATURE_INCOMPAT_64BIT|\
325 JFS_FEATURE_INCOMPAT_CSUM_V2|\
326 JFS_FEATURE_INCOMPAT_CSUM_V3)
328 #if (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
329 #ifdef E2FSCK_INCLUDE_INLINE_FUNCS
330 #if (__STDC_VERSION__ >= 199901L)
331 #define _INLINE_ extern inline
333 #define _INLINE_ inline
335 #else /* !E2FSCK_INCLUDE_INLINE FUNCS */
336 #if (__STDC_VERSION__ >= 199901L)
337 #define _INLINE_ inline
340 #define _INLINE_ extern __inline__
341 #else /* For Watcom C */
342 #define _INLINE_ extern inline
343 #endif /* __GNUC__ */
344 #endif /* __STDC_VERSION__ >= 199901L */
345 #endif /* INCLUDE_INLINE_FUNCS */
348 * helper functions to deal with 32 or 64bit block numbers.
350 static inline size_t journal_tag_bytes(journal_t *journal)
354 if (jfs_has_feature_csum3(journal))
355 return sizeof(journal_block_tag3_t);
357 sz = sizeof(journal_block_tag_t);
359 if (jfs_has_feature_csum2(journal))
362 if (jfs_has_feature_64bit(journal))
365 return sz - sizeof(__u32);
368 static inline int journal_has_csum_v2or3(journal_t *journal)
370 if (jfs_has_feature_csum2(journal) || jfs_has_feature_csum3(journal))
378 static inline int tid_gt(tid_t x, tid_t y) EXT2FS_ATTR((unused));
379 static inline int tid_geq(tid_t x, tid_t y) EXT2FS_ATTR((unused));
381 /* Comparison functions for transaction IDs: perform comparisons using
382 * modulo arithmetic so that they work over sequence number wraps. */
384 static inline int tid_gt(tid_t x, tid_t y)
386 int difference = (x - y);
387 return (difference > 0);
390 static inline int tid_geq(tid_t x, tid_t y)
392 int difference = (x - y);
393 return (difference >= 0);
396 extern int journal_blocks_per_page(struct inode *inode);
399 * Definitions which augment the buffer_head layer
402 /* journaling buffer types */
403 #define BJ_None 0 /* Not journaled */
404 #define BJ_SyncData 1 /* Normal data: flush before commit */
405 #define BJ_AsyncData 2 /* writepage data: wait on it before commit */
406 #define BJ_Metadata 3 /* Normal journaled metadata */
407 #define BJ_Forget 4 /* Buffer superceded by this transaction */
408 #define BJ_IO 5 /* Buffer is for temporary IO use */
409 #define BJ_Shadow 6 /* Buffer contents being shadowed to the log */
410 #define BJ_LogCtl 7 /* Buffer contains log descriptors */
411 #define BJ_Reserved 8 /* Buffer is reserved for access by journal */
414 extern int jbd_blocks_per_page(struct inode *inode);
416 #endif /* _LINUX_JBD_H */