1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker * linux/include/linux/jbd.h
3*6a54128fSAndroid Build Coastguard Worker *
4*6a54128fSAndroid Build Coastguard Worker * Written by Stephen C. Tweedie <[email protected]>
5*6a54128fSAndroid Build Coastguard Worker *
6*6a54128fSAndroid Build Coastguard Worker * Copyright 1998-2000 Red Hat, Inc --- All Rights Reserved
7*6a54128fSAndroid Build Coastguard Worker *
8*6a54128fSAndroid Build Coastguard Worker * This file is part of the Linux kernel and is made available under
9*6a54128fSAndroid Build Coastguard Worker * the terms of the GNU General Public License, version 2, or at your
10*6a54128fSAndroid Build Coastguard Worker * option, any later version, incorporated herein by reference.
11*6a54128fSAndroid Build Coastguard Worker *
12*6a54128fSAndroid Build Coastguard Worker * Definitions for transaction data structures for the buffer cache
13*6a54128fSAndroid Build Coastguard Worker * filesystem journaling support.
14*6a54128fSAndroid Build Coastguard Worker */
15*6a54128fSAndroid Build Coastguard Worker
16*6a54128fSAndroid Build Coastguard Worker #ifndef _LINUX_JBD_H
17*6a54128fSAndroid Build Coastguard Worker #define _LINUX_JBD_H
18*6a54128fSAndroid Build Coastguard Worker
19*6a54128fSAndroid Build Coastguard Worker #include "jfs_compat.h"
20*6a54128fSAndroid Build Coastguard Worker #define JFS_DEBUG
21*6a54128fSAndroid Build Coastguard Worker #define jfs_debug jbd_debug
22*6a54128fSAndroid Build Coastguard Worker
23*6a54128fSAndroid Build Coastguard Worker #ifndef __GNUC__
24*6a54128fSAndroid Build Coastguard Worker #define __FUNCTION__ ""
25*6a54128fSAndroid Build Coastguard Worker #endif
26*6a54128fSAndroid Build Coastguard Worker
27*6a54128fSAndroid Build Coastguard Worker #define journal_oom_retry 0
28*6a54128fSAndroid Build Coastguard Worker
29*6a54128fSAndroid Build Coastguard Worker #ifdef CONFIG_JBD_DEBUG
30*6a54128fSAndroid Build Coastguard Worker /*
31*6a54128fSAndroid Build Coastguard Worker * Define JBD_EXPENSIVE_CHECKING to enable more expensive internal
32*6a54128fSAndroid Build Coastguard Worker * consistency checks. By default we don't do this unless
33*6a54128fSAndroid Build Coastguard Worker * CONFIG_JBD_DEBUG is on.
34*6a54128fSAndroid Build Coastguard Worker */
35*6a54128fSAndroid Build Coastguard Worker #define JBD_EXPENSIVE_CHECKING
36*6a54128fSAndroid Build Coastguard Worker extern int journal_enable_debug;
37*6a54128fSAndroid Build Coastguard Worker #else
38*6a54128fSAndroid Build Coastguard Worker #define journal_enable_debug (-1)
39*6a54128fSAndroid Build Coastguard Worker #endif /* !CONFIG_JBD_DEBUG */
40*6a54128fSAndroid Build Coastguard Worker
41*6a54128fSAndroid Build Coastguard Worker #ifdef __STDC__
42*6a54128fSAndroid Build Coastguard Worker #define jbd_debug(n, f, a...) \
43*6a54128fSAndroid Build Coastguard Worker do { \
44*6a54128fSAndroid Build Coastguard Worker if ((n) <= journal_enable_debug) { \
45*6a54128fSAndroid Build Coastguard Worker printk (KERN_DEBUG "(%s, %d): %s: ", \
46*6a54128fSAndroid Build Coastguard Worker __FILE__, __LINE__, __FUNCTION__); \
47*6a54128fSAndroid Build Coastguard Worker printk (f, ## a); \
48*6a54128fSAndroid Build Coastguard Worker } \
49*6a54128fSAndroid Build Coastguard Worker } while (0)
50*6a54128fSAndroid Build Coastguard Worker #else
51*6a54128fSAndroid Build Coastguard Worker #define jbd_debug(x) /* AIX doesn't do STDC */
52*6a54128fSAndroid Build Coastguard Worker #endif /* !__STDC__ */
53*6a54128fSAndroid Build Coastguard Worker
54*6a54128fSAndroid Build Coastguard Worker extern void * __jbd_kmalloc (char *where, size_t size, int flags, int retry);
55*6a54128fSAndroid Build Coastguard Worker #define jbd_kmalloc(size, flags) \
56*6a54128fSAndroid Build Coastguard Worker __jbd_kmalloc(__FUNCTION__, (size), (flags), journal_oom_retry)
57*6a54128fSAndroid Build Coastguard Worker #define jbd_rep_kmalloc(size, flags) \
58*6a54128fSAndroid Build Coastguard Worker __jbd_kmalloc(__FUNCTION__, (size), (flags), 1)
59*6a54128fSAndroid Build Coastguard Worker
60*6a54128fSAndroid Build Coastguard Worker #define JBD2_MIN_JOURNAL_BLOCKS 1024
61*6a54128fSAndroid Build Coastguard Worker #define JBD2_DEFAULT_FAST_COMMIT_BLOCKS 256
62*6a54128fSAndroid Build Coastguard Worker
63*6a54128fSAndroid Build Coastguard Worker /*
64*6a54128fSAndroid Build Coastguard Worker * Internal structures used by the logging mechanism:
65*6a54128fSAndroid Build Coastguard Worker */
66*6a54128fSAndroid Build Coastguard Worker
67*6a54128fSAndroid Build Coastguard Worker #define JBD2_MAGIC_NUMBER 0xc03b3998U /* The first 4 bytes of /dev/random! */
68*6a54128fSAndroid Build Coastguard Worker
69*6a54128fSAndroid Build Coastguard Worker /*
70*6a54128fSAndroid Build Coastguard Worker * On-disk structures
71*6a54128fSAndroid Build Coastguard Worker */
72*6a54128fSAndroid Build Coastguard Worker
73*6a54128fSAndroid Build Coastguard Worker /*
74*6a54128fSAndroid Build Coastguard Worker * Descriptor block types:
75*6a54128fSAndroid Build Coastguard Worker */
76*6a54128fSAndroid Build Coastguard Worker
77*6a54128fSAndroid Build Coastguard Worker #define JBD2_DESCRIPTOR_BLOCK 1
78*6a54128fSAndroid Build Coastguard Worker #define JBD2_COMMIT_BLOCK 2
79*6a54128fSAndroid Build Coastguard Worker #define JBD2_SUPERBLOCK_V1 3
80*6a54128fSAndroid Build Coastguard Worker #define JBD2_SUPERBLOCK_V2 4
81*6a54128fSAndroid Build Coastguard Worker #define JBD2_REVOKE_BLOCK 5
82*6a54128fSAndroid Build Coastguard Worker #define JBD2_FC_BLOCK 6
83*6a54128fSAndroid Build Coastguard Worker
84*6a54128fSAndroid Build Coastguard Worker /*
85*6a54128fSAndroid Build Coastguard Worker * Standard header for all descriptor blocks:
86*6a54128fSAndroid Build Coastguard Worker */
87*6a54128fSAndroid Build Coastguard Worker typedef struct journal_header_s
88*6a54128fSAndroid Build Coastguard Worker {
89*6a54128fSAndroid Build Coastguard Worker __be32 h_magic;
90*6a54128fSAndroid Build Coastguard Worker __be32 h_blocktype;
91*6a54128fSAndroid Build Coastguard Worker __be32 h_sequence;
92*6a54128fSAndroid Build Coastguard Worker } journal_header_t;
93*6a54128fSAndroid Build Coastguard Worker
94*6a54128fSAndroid Build Coastguard Worker /*
95*6a54128fSAndroid Build Coastguard Worker * Checksum types.
96*6a54128fSAndroid Build Coastguard Worker */
97*6a54128fSAndroid Build Coastguard Worker #define JBD2_CRC32_CHKSUM 1
98*6a54128fSAndroid Build Coastguard Worker #define JBD2_MD5_CHKSUM 2
99*6a54128fSAndroid Build Coastguard Worker #define JBD2_SHA1_CHKSUM 3
100*6a54128fSAndroid Build Coastguard Worker #define JBD2_CRC32C_CHKSUM 4
101*6a54128fSAndroid Build Coastguard Worker
102*6a54128fSAndroid Build Coastguard Worker #define JBD2_CRC32_CHKSUM_SIZE 4
103*6a54128fSAndroid Build Coastguard Worker
104*6a54128fSAndroid Build Coastguard Worker #define JBD2_CHECKSUM_BYTES (32 / sizeof(__u32))
105*6a54128fSAndroid Build Coastguard Worker /*
106*6a54128fSAndroid Build Coastguard Worker * Commit block header for storing transactional checksums:
107*6a54128fSAndroid Build Coastguard Worker *
108*6a54128fSAndroid Build Coastguard Worker * NOTE: If FEATURE_COMPAT_CHECKSUM (checksum v1) is set, the h_chksum*
109*6a54128fSAndroid Build Coastguard Worker * fields are used to store a checksum of the descriptor and data blocks.
110*6a54128fSAndroid Build Coastguard Worker *
111*6a54128fSAndroid Build Coastguard Worker * If FEATURE_INCOMPAT_CSUM_V2 (checksum v2) is set, then the h_chksum
112*6a54128fSAndroid Build Coastguard Worker * field is used to store crc32c(uuid+commit_block). Each journal metadata
113*6a54128fSAndroid Build Coastguard Worker * block gets its own checksum, and data block checksums are stored in
114*6a54128fSAndroid Build Coastguard Worker * journal_block_tag (in the descriptor). The other h_chksum* fields are
115*6a54128fSAndroid Build Coastguard Worker * not used.
116*6a54128fSAndroid Build Coastguard Worker *
117*6a54128fSAndroid Build Coastguard Worker * If FEATURE_INCOMPAT_CSUM_V3 is set, the descriptor block uses
118*6a54128fSAndroid Build Coastguard Worker * journal_block_tag3_t to store a full 32-bit checksum. Everything else
119*6a54128fSAndroid Build Coastguard Worker * is the same as v2.
120*6a54128fSAndroid Build Coastguard Worker *
121*6a54128fSAndroid Build Coastguard Worker * Checksum v1, v2, and v3 are mutually exclusive features.
122*6a54128fSAndroid Build Coastguard Worker */
123*6a54128fSAndroid Build Coastguard Worker struct commit_header {
124*6a54128fSAndroid Build Coastguard Worker __be32 h_magic;
125*6a54128fSAndroid Build Coastguard Worker __be32 h_blocktype;
126*6a54128fSAndroid Build Coastguard Worker __be32 h_sequence;
127*6a54128fSAndroid Build Coastguard Worker unsigned char h_chksum_type;
128*6a54128fSAndroid Build Coastguard Worker unsigned char h_chksum_size;
129*6a54128fSAndroid Build Coastguard Worker unsigned char h_padding[2];
130*6a54128fSAndroid Build Coastguard Worker __be32 h_chksum[JBD2_CHECKSUM_BYTES];
131*6a54128fSAndroid Build Coastguard Worker __be64 h_commit_sec;
132*6a54128fSAndroid Build Coastguard Worker __be32 h_commit_nsec;
133*6a54128fSAndroid Build Coastguard Worker };
134*6a54128fSAndroid Build Coastguard Worker
135*6a54128fSAndroid Build Coastguard Worker /*
136*6a54128fSAndroid Build Coastguard Worker * The block tag: used to describe a single buffer in the journal
137*6a54128fSAndroid Build Coastguard Worker */
138*6a54128fSAndroid Build Coastguard Worker typedef struct journal_block_tag3_s
139*6a54128fSAndroid Build Coastguard Worker {
140*6a54128fSAndroid Build Coastguard Worker __be32 t_blocknr; /* The on-disk block number */
141*6a54128fSAndroid Build Coastguard Worker __be32 t_flags; /* See below */
142*6a54128fSAndroid Build Coastguard Worker __be32 t_blocknr_high; /* most-significant high 32bits. */
143*6a54128fSAndroid Build Coastguard Worker __be32 t_checksum; /* crc32c(uuid+seq+block) */
144*6a54128fSAndroid Build Coastguard Worker } journal_block_tag3_t;
145*6a54128fSAndroid Build Coastguard Worker
146*6a54128fSAndroid Build Coastguard Worker typedef struct journal_block_tag_s
147*6a54128fSAndroid Build Coastguard Worker {
148*6a54128fSAndroid Build Coastguard Worker __be32 t_blocknr; /* The on-disk block number */
149*6a54128fSAndroid Build Coastguard Worker __be16 t_checksum; /* truncated crc32c(uuid+seq+block) */
150*6a54128fSAndroid Build Coastguard Worker __be16 t_flags; /* See below */
151*6a54128fSAndroid Build Coastguard Worker __be32 t_blocknr_high; /* most-significant high 32bits. */
152*6a54128fSAndroid Build Coastguard Worker } journal_block_tag_t;
153*6a54128fSAndroid Build Coastguard Worker
154*6a54128fSAndroid Build Coastguard Worker /* Tail of descriptor or revoke block, for checksumming */
155*6a54128fSAndroid Build Coastguard Worker struct jbd2_journal_block_tail {
156*6a54128fSAndroid Build Coastguard Worker __be32 t_checksum;
157*6a54128fSAndroid Build Coastguard Worker };
158*6a54128fSAndroid Build Coastguard Worker
159*6a54128fSAndroid Build Coastguard Worker /*
160*6a54128fSAndroid Build Coastguard Worker * The revoke descriptor: used on disk to describe a series of blocks to
161*6a54128fSAndroid Build Coastguard Worker * be revoked from the log
162*6a54128fSAndroid Build Coastguard Worker */
163*6a54128fSAndroid Build Coastguard Worker typedef struct journal_revoke_header_s
164*6a54128fSAndroid Build Coastguard Worker {
165*6a54128fSAndroid Build Coastguard Worker journal_header_t r_header;
166*6a54128fSAndroid Build Coastguard Worker __be32 r_count; /* Count of bytes used in the block */
167*6a54128fSAndroid Build Coastguard Worker } jbd2_journal_revoke_header_t;
168*6a54128fSAndroid Build Coastguard Worker
169*6a54128fSAndroid Build Coastguard Worker /* Definitions for the journal tag flags word: */
170*6a54128fSAndroid Build Coastguard Worker #define JBD2_FLAG_ESCAPE 1 /* on-disk block is escaped */
171*6a54128fSAndroid Build Coastguard Worker #define JBD2_FLAG_SAME_UUID 2 /* block has same uuid as previous */
172*6a54128fSAndroid Build Coastguard Worker #define JBD2_FLAG_DELETED 4 /* block deleted by this transaction */
173*6a54128fSAndroid Build Coastguard Worker #define JBD2_FLAG_LAST_TAG 8 /* last tag in this descriptor block */
174*6a54128fSAndroid Build Coastguard Worker
175*6a54128fSAndroid Build Coastguard Worker
176*6a54128fSAndroid Build Coastguard Worker #define UUID_SIZE 16
177*6a54128fSAndroid Build Coastguard Worker #define JBD2_USERS_MAX 48
178*6a54128fSAndroid Build Coastguard Worker #define JBD2_USERS_SIZE (UUID_SIZE * JBD2_USERS_MAX)
179*6a54128fSAndroid Build Coastguard Worker /*
180*6a54128fSAndroid Build Coastguard Worker * The journal superblock. All fields are in big-endian byte order.
181*6a54128fSAndroid Build Coastguard Worker */
182*6a54128fSAndroid Build Coastguard Worker typedef struct journal_superblock_s
183*6a54128fSAndroid Build Coastguard Worker {
184*6a54128fSAndroid Build Coastguard Worker /* 0x0000 */
185*6a54128fSAndroid Build Coastguard Worker journal_header_t s_header;
186*6a54128fSAndroid Build Coastguard Worker
187*6a54128fSAndroid Build Coastguard Worker /* 0x000C */
188*6a54128fSAndroid Build Coastguard Worker /* Static information describing the journal */
189*6a54128fSAndroid Build Coastguard Worker __be32 s_blocksize; /* journal device blocksize */
190*6a54128fSAndroid Build Coastguard Worker __be32 s_maxlen; /* total blocks in journal file */
191*6a54128fSAndroid Build Coastguard Worker __be32 s_first; /* first block of log information */
192*6a54128fSAndroid Build Coastguard Worker
193*6a54128fSAndroid Build Coastguard Worker /* 0x0018 */
194*6a54128fSAndroid Build Coastguard Worker /* Dynamic information describing the current state of the log */
195*6a54128fSAndroid Build Coastguard Worker __be32 s_sequence; /* first commit ID expected in log */
196*6a54128fSAndroid Build Coastguard Worker __be32 s_start; /* blocknr of start of log */
197*6a54128fSAndroid Build Coastguard Worker
198*6a54128fSAndroid Build Coastguard Worker /* 0x0020 */
199*6a54128fSAndroid Build Coastguard Worker /* Error value, as set by journal_abort(). */
200*6a54128fSAndroid Build Coastguard Worker __s32 s_errno;
201*6a54128fSAndroid Build Coastguard Worker
202*6a54128fSAndroid Build Coastguard Worker /* 0x0024 */
203*6a54128fSAndroid Build Coastguard Worker /* Remaining fields are only valid in a version-2 superblock */
204*6a54128fSAndroid Build Coastguard Worker __be32 s_feature_compat; /* compatible feature set */
205*6a54128fSAndroid Build Coastguard Worker __be32 s_feature_incompat; /* incompatible feature set */
206*6a54128fSAndroid Build Coastguard Worker __be32 s_feature_ro_compat; /* readonly-compatible feature set */
207*6a54128fSAndroid Build Coastguard Worker /* 0x0030 */
208*6a54128fSAndroid Build Coastguard Worker __u8 s_uuid[16]; /* 128-bit uuid for journal */
209*6a54128fSAndroid Build Coastguard Worker
210*6a54128fSAndroid Build Coastguard Worker /* 0x0040 */
211*6a54128fSAndroid Build Coastguard Worker __be32 s_nr_users; /* Nr of filesystems sharing log */
212*6a54128fSAndroid Build Coastguard Worker
213*6a54128fSAndroid Build Coastguard Worker __be32 s_dynsuper; /* Blocknr of dynamic superblock copy*/
214*6a54128fSAndroid Build Coastguard Worker
215*6a54128fSAndroid Build Coastguard Worker /* 0x0048 */
216*6a54128fSAndroid Build Coastguard Worker __be32 s_max_transaction; /* Limit of journal blocks per trans.*/
217*6a54128fSAndroid Build Coastguard Worker __be32 s_max_trans_data; /* Limit of data blocks per trans. */
218*6a54128fSAndroid Build Coastguard Worker
219*6a54128fSAndroid Build Coastguard Worker /* 0x0050 */
220*6a54128fSAndroid Build Coastguard Worker __u8 s_checksum_type; /* checksum type */
221*6a54128fSAndroid Build Coastguard Worker __u8 s_padding2[3];
222*6a54128fSAndroid Build Coastguard Worker /* 0x0054 */
223*6a54128fSAndroid Build Coastguard Worker __be32 s_num_fc_blks; /* Number of fast commit blocks */
224*6a54128fSAndroid Build Coastguard Worker /* 0x0058 */
225*6a54128fSAndroid Build Coastguard Worker __be32 s_padding[41];
226*6a54128fSAndroid Build Coastguard Worker __be32 s_checksum; /* crc32c(superblock) */
227*6a54128fSAndroid Build Coastguard Worker
228*6a54128fSAndroid Build Coastguard Worker /* 0x0100 */
229*6a54128fSAndroid Build Coastguard Worker __u8 s_users[JBD2_USERS_SIZE]; /* ids of all fs'es sharing the log */
230*6a54128fSAndroid Build Coastguard Worker
231*6a54128fSAndroid Build Coastguard Worker /* 0x0400 */
232*6a54128fSAndroid Build Coastguard Worker } journal_superblock_t;
233*6a54128fSAndroid Build Coastguard Worker
234*6a54128fSAndroid Build Coastguard Worker #define JBD2_HAS_COMPAT_FEATURE(j,mask) \
235*6a54128fSAndroid Build Coastguard Worker ((j)->j_format_version >= 2 && \
236*6a54128fSAndroid Build Coastguard Worker ((j)->j_superblock->s_feature_compat & ext2fs_cpu_to_be32((mask))))
237*6a54128fSAndroid Build Coastguard Worker #define JBD2_HAS_RO_COMPAT_FEATURE(j,mask) \
238*6a54128fSAndroid Build Coastguard Worker ((j)->j_format_version >= 2 && \
239*6a54128fSAndroid Build Coastguard Worker ((j)->j_superblock->s_feature_ro_compat & ext2fs_cpu_to_be32((mask))))
240*6a54128fSAndroid Build Coastguard Worker #define JBD2_HAS_INCOMPAT_FEATURE(j,mask) \
241*6a54128fSAndroid Build Coastguard Worker ((j)->j_format_version >= 2 && \
242*6a54128fSAndroid Build Coastguard Worker ((j)->j_superblock->s_feature_incompat & ext2fs_cpu_to_be32((mask))))
243*6a54128fSAndroid Build Coastguard Worker
244*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_COMPAT_CHECKSUM 0x00000001
245*6a54128fSAndroid Build Coastguard Worker
246*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_INCOMPAT_REVOKE 0x00000001
247*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_INCOMPAT_64BIT 0x00000002
248*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004
249*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_INCOMPAT_CSUM_V2 0x00000008
250*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_INCOMPAT_CSUM_V3 0x00000010
251*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_INCOMPAT_FAST_COMMIT 0x00000020
252*6a54128fSAndroid Build Coastguard Worker
253*6a54128fSAndroid Build Coastguard Worker /* Features known to this kernel version: */
254*6a54128fSAndroid Build Coastguard Worker #define JBD2_KNOWN_COMPAT_FEATURES 0
255*6a54128fSAndroid Build Coastguard Worker #define JBD2_KNOWN_ROCOMPAT_FEATURES 0
256*6a54128fSAndroid Build Coastguard Worker #define JBD2_KNOWN_INCOMPAT_FEATURES (JBD2_FEATURE_INCOMPAT_REVOKE|\
257*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT| \
258*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_INCOMPAT_64BIT|\
259*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_INCOMPAT_CSUM_V2| \
260*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_INCOMPAT_CSUM_V3 | \
261*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_INCOMPAT_FAST_COMMIT)
262*6a54128fSAndroid Build Coastguard Worker
263*6a54128fSAndroid Build Coastguard Worker #ifdef NO_INLINE_FUNCS
264*6a54128fSAndroid Build Coastguard Worker extern size_t journal_tag_bytes(journal_t *journal);
265*6a54128fSAndroid Build Coastguard Worker extern int jbd2_journal_has_csum_v2or3(journal_t *journal);
266*6a54128fSAndroid Build Coastguard Worker extern int jbd2_journal_get_num_fc_blks(journal_superblock_t *jsb);
267*6a54128fSAndroid Build Coastguard Worker extern int tid_gt(tid_t x, tid_t y) EXT2FS_ATTR((unused));
268*6a54128fSAndroid Build Coastguard Worker extern int tid_geq(tid_t x, tid_t y) EXT2FS_ATTR((unused));
269*6a54128fSAndroid Build Coastguard Worker #endif
270*6a54128fSAndroid Build Coastguard Worker
271*6a54128fSAndroid Build Coastguard Worker #if (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
272*6a54128fSAndroid Build Coastguard Worker #ifdef E2FSCK_INCLUDE_INLINE_FUNCS
273*6a54128fSAndroid Build Coastguard Worker #if (__STDC_VERSION__ >= 199901L)
274*6a54128fSAndroid Build Coastguard Worker #define _INLINE_ extern inline
275*6a54128fSAndroid Build Coastguard Worker #else
276*6a54128fSAndroid Build Coastguard Worker #define _INLINE_ inline
277*6a54128fSAndroid Build Coastguard Worker #endif
278*6a54128fSAndroid Build Coastguard Worker #else /* !E2FSCK_INCLUDE_INLINE FUNCS */
279*6a54128fSAndroid Build Coastguard Worker #if (__STDC_VERSION__ >= 199901L)
280*6a54128fSAndroid Build Coastguard Worker #define _INLINE_ inline
281*6a54128fSAndroid Build Coastguard Worker #else /* not C99 */
282*6a54128fSAndroid Build Coastguard Worker #ifdef __GNUC__
283*6a54128fSAndroid Build Coastguard Worker #define _INLINE_ extern __inline__
284*6a54128fSAndroid Build Coastguard Worker #else /* For Watcom C */
285*6a54128fSAndroid Build Coastguard Worker #define _INLINE_ extern inline
286*6a54128fSAndroid Build Coastguard Worker #endif /* __GNUC__ */
287*6a54128fSAndroid Build Coastguard Worker #endif /* __STDC_VERSION__ >= 199901L */
288*6a54128fSAndroid Build Coastguard Worker #endif /* INCLUDE_INLINE_FUNCS */
289*6a54128fSAndroid Build Coastguard Worker
290*6a54128fSAndroid Build Coastguard Worker /* journal feature predicate functions */
291*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_COMPAT_FUNCS(name, flagname) \
292*6a54128fSAndroid Build Coastguard Worker _INLINE_ int jbd2_has_feature_##name(journal_t *j); \
293*6a54128fSAndroid Build Coastguard Worker _INLINE_ int jbd2_has_feature_##name(journal_t *j) \
294*6a54128fSAndroid Build Coastguard Worker { \
295*6a54128fSAndroid Build Coastguard Worker return ((j)->j_format_version >= 2 && \
296*6a54128fSAndroid Build Coastguard Worker ((j)->j_superblock->s_feature_compat & \
297*6a54128fSAndroid Build Coastguard Worker ext2fs_cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname)) != 0); \
298*6a54128fSAndroid Build Coastguard Worker } \
299*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_set_feature_##name(journal_t *j); \
300*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_set_feature_##name(journal_t *j) \
301*6a54128fSAndroid Build Coastguard Worker { \
302*6a54128fSAndroid Build Coastguard Worker (j)->j_superblock->s_feature_compat |= \
303*6a54128fSAndroid Build Coastguard Worker ext2fs_cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname); \
304*6a54128fSAndroid Build Coastguard Worker } \
305*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_clear_feature_##name(journal_t *j); \
306*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_clear_feature_##name(journal_t *j) \
307*6a54128fSAndroid Build Coastguard Worker { \
308*6a54128fSAndroid Build Coastguard Worker (j)->j_superblock->s_feature_compat &= \
309*6a54128fSAndroid Build Coastguard Worker ~ext2fs_cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname); \
310*6a54128fSAndroid Build Coastguard Worker }
311*6a54128fSAndroid Build Coastguard Worker
312*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
313*6a54128fSAndroid Build Coastguard Worker _INLINE_ int jbd2_has_feature_##name(journal_t *j); \
314*6a54128fSAndroid Build Coastguard Worker _INLINE_ int jbd2_has_feature_##name(journal_t *j) \
315*6a54128fSAndroid Build Coastguard Worker { \
316*6a54128fSAndroid Build Coastguard Worker return ((j)->j_format_version >= 2 && \
317*6a54128fSAndroid Build Coastguard Worker ((j)->j_superblock->s_feature_ro_compat & \
318*6a54128fSAndroid Build Coastguard Worker ext2fs_cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname)) != 0); \
319*6a54128fSAndroid Build Coastguard Worker } \
320*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_set_feature_##name(journal_t *j); \
321*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_set_feature_##name(journal_t *j) \
322*6a54128fSAndroid Build Coastguard Worker { \
323*6a54128fSAndroid Build Coastguard Worker (j)->j_superblock->s_feature_ro_compat |= \
324*6a54128fSAndroid Build Coastguard Worker ext2fs_cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname); \
325*6a54128fSAndroid Build Coastguard Worker } \
326*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_clear_feature_##name(journal_t *j); \
327*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_clear_feature_##name(journal_t *j) \
328*6a54128fSAndroid Build Coastguard Worker { \
329*6a54128fSAndroid Build Coastguard Worker (j)->j_superblock->s_feature_ro_compat &= \
330*6a54128fSAndroid Build Coastguard Worker ~ext2fs_cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname); \
331*6a54128fSAndroid Build Coastguard Worker }
332*6a54128fSAndroid Build Coastguard Worker
333*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_INCOMPAT_FUNCS(name, flagname) \
334*6a54128fSAndroid Build Coastguard Worker _INLINE_ int jbd2_has_feature_##name(journal_t *j); \
335*6a54128fSAndroid Build Coastguard Worker _INLINE_ int jbd2_has_feature_##name(journal_t *j) \
336*6a54128fSAndroid Build Coastguard Worker { \
337*6a54128fSAndroid Build Coastguard Worker return ((j)->j_format_version >= 2 && \
338*6a54128fSAndroid Build Coastguard Worker ((j)->j_superblock->s_feature_incompat & \
339*6a54128fSAndroid Build Coastguard Worker ext2fs_cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname)) != 0); \
340*6a54128fSAndroid Build Coastguard Worker } \
341*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_set_feature_##name(journal_t *j); \
342*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_set_feature_##name(journal_t *j) \
343*6a54128fSAndroid Build Coastguard Worker { \
344*6a54128fSAndroid Build Coastguard Worker (j)->j_superblock->s_feature_incompat |= \
345*6a54128fSAndroid Build Coastguard Worker ext2fs_cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname); \
346*6a54128fSAndroid Build Coastguard Worker } \
347*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_clear_feature_##name(journal_t *j); \
348*6a54128fSAndroid Build Coastguard Worker _INLINE_ void jbd2_clear_feature_##name(journal_t *j) \
349*6a54128fSAndroid Build Coastguard Worker { \
350*6a54128fSAndroid Build Coastguard Worker (j)->j_superblock->s_feature_incompat &= \
351*6a54128fSAndroid Build Coastguard Worker ~ext2fs_cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname); \
352*6a54128fSAndroid Build Coastguard Worker }
353*6a54128fSAndroid Build Coastguard Worker
354*6a54128fSAndroid Build Coastguard Worker #else
355*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_COMPAT_FUNCS(name, flagname) \
356*6a54128fSAndroid Build Coastguard Worker extern int jbd2_has_feature_##name(journal_t *j); \
357*6a54128fSAndroid Build Coastguard Worker extern void jbd2_set_feature_##name(journal_t *j); \
358*6a54128fSAndroid Build Coastguard Worker extern void jbd2_clear_feature_##name(journal_t *j);
359*6a54128fSAndroid Build Coastguard Worker
360*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
361*6a54128fSAndroid Build Coastguard Worker extern int jbd2_has_feature_##name(journal_t *j); \
362*6a54128fSAndroid Build Coastguard Worker extern void jbd2_set_feature_##name(journal_t *j); \
363*6a54128fSAndroid Build Coastguard Worker extern void jbd2_clear_feature_##name(journal_t *j);
364*6a54128fSAndroid Build Coastguard Worker
365*6a54128fSAndroid Build Coastguard Worker #define JBD2_FEATURE_INCOMPAT_FUNCS(name, flagname) \
366*6a54128fSAndroid Build Coastguard Worker extern int jbd2_has_feature_##name(journal_t *j); \
367*6a54128fSAndroid Build Coastguard Worker extern void jbd2_set_feature_##name(journal_t *j); \
368*6a54128fSAndroid Build Coastguard Worker extern void jbd2_clear_feature_##name(journal_t *j);
369*6a54128fSAndroid Build Coastguard Worker
370*6a54128fSAndroid Build Coastguard Worker #endif /* (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS)) */
371*6a54128fSAndroid Build Coastguard Worker
JBD2_FEATURE_COMPAT_FUNCS(checksum,CHECKSUM)372*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_COMPAT_FUNCS(checksum, CHECKSUM)
373*6a54128fSAndroid Build Coastguard Worker
374*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_INCOMPAT_FUNCS(revoke, REVOKE)
375*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_INCOMPAT_FUNCS(64bit, 64BIT)
376*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_INCOMPAT_FUNCS(async_commit, ASYNC_COMMIT)
377*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_INCOMPAT_FUNCS(csum2, CSUM_V2)
378*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_INCOMPAT_FUNCS(csum3, CSUM_V3)
379*6a54128fSAndroid Build Coastguard Worker JBD2_FEATURE_INCOMPAT_FUNCS(fast_commit, FAST_COMMIT)
380*6a54128fSAndroid Build Coastguard Worker
381*6a54128fSAndroid Build Coastguard Worker #if (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
382*6a54128fSAndroid Build Coastguard Worker /*
383*6a54128fSAndroid Build Coastguard Worker * helper functions to deal with 32 or 64bit block numbers.
384*6a54128fSAndroid Build Coastguard Worker */
385*6a54128fSAndroid Build Coastguard Worker _INLINE_ size_t journal_tag_bytes(journal_t *journal)
386*6a54128fSAndroid Build Coastguard Worker {
387*6a54128fSAndroid Build Coastguard Worker size_t sz;
388*6a54128fSAndroid Build Coastguard Worker
389*6a54128fSAndroid Build Coastguard Worker if (jbd2_has_feature_csum3(journal))
390*6a54128fSAndroid Build Coastguard Worker return sizeof(journal_block_tag3_t);
391*6a54128fSAndroid Build Coastguard Worker
392*6a54128fSAndroid Build Coastguard Worker sz = sizeof(journal_block_tag_t);
393*6a54128fSAndroid Build Coastguard Worker
394*6a54128fSAndroid Build Coastguard Worker if (jbd2_has_feature_csum2(journal))
395*6a54128fSAndroid Build Coastguard Worker sz += sizeof(__u16);
396*6a54128fSAndroid Build Coastguard Worker
397*6a54128fSAndroid Build Coastguard Worker if (jbd2_has_feature_64bit(journal))
398*6a54128fSAndroid Build Coastguard Worker return sz;
399*6a54128fSAndroid Build Coastguard Worker
400*6a54128fSAndroid Build Coastguard Worker return sz - sizeof(__u32);
401*6a54128fSAndroid Build Coastguard Worker }
402*6a54128fSAndroid Build Coastguard Worker
jbd2_journal_has_csum_v2or3(journal_t * journal)403*6a54128fSAndroid Build Coastguard Worker _INLINE_ int jbd2_journal_has_csum_v2or3(journal_t *journal)
404*6a54128fSAndroid Build Coastguard Worker {
405*6a54128fSAndroid Build Coastguard Worker if (jbd2_has_feature_csum2(journal) || jbd2_has_feature_csum3(journal))
406*6a54128fSAndroid Build Coastguard Worker return 1;
407*6a54128fSAndroid Build Coastguard Worker
408*6a54128fSAndroid Build Coastguard Worker return 0;
409*6a54128fSAndroid Build Coastguard Worker }
410*6a54128fSAndroid Build Coastguard Worker
jbd2_journal_get_num_fc_blks(journal_superblock_t * jsb)411*6a54128fSAndroid Build Coastguard Worker _INLINE_ int jbd2_journal_get_num_fc_blks(journal_superblock_t *jsb)
412*6a54128fSAndroid Build Coastguard Worker {
413*6a54128fSAndroid Build Coastguard Worker int num_fc_blocks = be32_to_cpu(jsb->s_num_fc_blks);
414*6a54128fSAndroid Build Coastguard Worker
415*6a54128fSAndroid Build Coastguard Worker return num_fc_blocks ? num_fc_blocks : JBD2_DEFAULT_FAST_COMMIT_BLOCKS;
416*6a54128fSAndroid Build Coastguard Worker }
417*6a54128fSAndroid Build Coastguard Worker
418*6a54128fSAndroid Build Coastguard Worker /* Comparison functions for transaction IDs: perform comparisons using
419*6a54128fSAndroid Build Coastguard Worker * modulo arithmetic so that they work over sequence number wraps. */
420*6a54128fSAndroid Build Coastguard Worker
tid_gt(tid_t x,tid_t y)421*6a54128fSAndroid Build Coastguard Worker _INLINE_ int tid_gt(tid_t x, tid_t y)
422*6a54128fSAndroid Build Coastguard Worker {
423*6a54128fSAndroid Build Coastguard Worker int difference = (x - y);
424*6a54128fSAndroid Build Coastguard Worker return (difference > 0);
425*6a54128fSAndroid Build Coastguard Worker }
426*6a54128fSAndroid Build Coastguard Worker
tid_geq(tid_t x,tid_t y)427*6a54128fSAndroid Build Coastguard Worker _INLINE_ int tid_geq(tid_t x, tid_t y)
428*6a54128fSAndroid Build Coastguard Worker {
429*6a54128fSAndroid Build Coastguard Worker int difference = (x - y);
430*6a54128fSAndroid Build Coastguard Worker return (difference >= 0);
431*6a54128fSAndroid Build Coastguard Worker }
432*6a54128fSAndroid Build Coastguard Worker #endif /* (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS)) */
433*6a54128fSAndroid Build Coastguard Worker
434*6a54128fSAndroid Build Coastguard Worker #undef _INLINE_
435*6a54128fSAndroid Build Coastguard Worker
436*6a54128fSAndroid Build Coastguard Worker extern int journal_blocks_per_page(struct inode *inode);
437*6a54128fSAndroid Build Coastguard Worker
438*6a54128fSAndroid Build Coastguard Worker /*
439*6a54128fSAndroid Build Coastguard Worker * Definitions which augment the buffer_head layer
440*6a54128fSAndroid Build Coastguard Worker */
441*6a54128fSAndroid Build Coastguard Worker
442*6a54128fSAndroid Build Coastguard Worker /* journaling buffer types */
443*6a54128fSAndroid Build Coastguard Worker #define BJ_None 0 /* Not journaled */
444*6a54128fSAndroid Build Coastguard Worker #define BJ_SyncData 1 /* Normal data: flush before commit */
445*6a54128fSAndroid Build Coastguard Worker #define BJ_AsyncData 2 /* writepage data: wait on it before commit */
446*6a54128fSAndroid Build Coastguard Worker #define BJ_Metadata 3 /* Normal journaled metadata */
447*6a54128fSAndroid Build Coastguard Worker #define BJ_Forget 4 /* Buffer superseded by this transaction */
448*6a54128fSAndroid Build Coastguard Worker #define BJ_IO 5 /* Buffer is for temporary IO use */
449*6a54128fSAndroid Build Coastguard Worker #define BJ_Shadow 6 /* Buffer contents being shadowed to the log */
450*6a54128fSAndroid Build Coastguard Worker #define BJ_LogCtl 7 /* Buffer contains log descriptors */
451*6a54128fSAndroid Build Coastguard Worker #define BJ_Reserved 8 /* Buffer is reserved for access by journal */
452*6a54128fSAndroid Build Coastguard Worker #define BJ_Types 9
453*6a54128fSAndroid Build Coastguard Worker
454*6a54128fSAndroid Build Coastguard Worker extern int jbd_blocks_per_page(struct inode *inode);
455*6a54128fSAndroid Build Coastguard Worker
456*6a54128fSAndroid Build Coastguard Worker #endif /* _LINUX_JBD_H */
457