xref: /aosp_15_r20/external/e2fsprogs/lib/ext2fs/kernel-jbd.h (revision 6a54128f25917bfc36a8a6e9d722c04a0b4641b6)
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