1586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/*
28cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o * linux/include/linux/jbd.h
3efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
4586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * Written by Stephen C. Tweedie <sct@redhat.com>
5586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o *
6586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * Copyright 1998-2000 Red Hat, Inc --- All Rights Reserved
7586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o *
8586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * This file is part of the Linux kernel and is made available under
9586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * the terms of the GNU General Public License, version 2, or at your
10586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * option, any later version, incorporated herein by reference.
11586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o *
12586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * Definitions for transaction data structures for the buffer cache
13586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * filesystem journaling support.
14586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o */
15586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
168cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#ifndef _LINUX_JBD_H
178cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define _LINUX_JBD_H
188cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o
19586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#include "jfs_compat.h"
208cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define JFS_DEBUG
218cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define jfs_debug jbd_debug
22586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
23ed78c021c3b111d8ab9a51aef5d5156e3004083fTheodore Ts'o#ifndef __GNUC__
24ed78c021c3b111d8ab9a51aef5d5156e3004083fTheodore Ts'o#define __FUNCTION__ ""
25ed78c021c3b111d8ab9a51aef5d5156e3004083fTheodore Ts'o#endif
26ed78c021c3b111d8ab9a51aef5d5156e3004083fTheodore Ts'o
278cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define journal_oom_retry 1
288cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o
297d4343d0d05ce69e0a72da5ac34eea415d4c789fTheodore Ts'o#ifdef __STDC__
308cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#ifdef CONFIG_JBD_DEBUG
31586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/*
328cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o * Define JBD_EXPENSIVE_CHECKING to enable more expensive internal
338cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o * consistency checks.  By default we don't do this unless
348cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o * CONFIG_JBD_DEBUG is on.
35586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o */
368cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define JBD_EXPENSIVE_CHECKING
37586187372afea65ae685687505b49b40fc5f3212Theodore Ts'oextern int journal_enable_debug;
38586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
398cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define jbd_debug(n, f, a...)						\
40586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	do {								\
41586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o		if ((n) <= journal_enable_debug) {			\
428cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o			printk (KERN_DEBUG "(%s, %d): %s: ",		\
43586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o				__FILE__, __LINE__, __FUNCTION__);	\
44f13a987afa5b7d12c8da69d1a1c282b0dfc0b5f4Theodore Ts'o		  	printk (f, ## a);				\
45586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o		}							\
46586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	} while (0)
47586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#else
48ed78c021c3b111d8ab9a51aef5d5156e3004083fTheodore Ts'o#ifdef __GNUC__
49f08999053e512771ad20650886b2abb637a02a45Theodore Ts'o#if defined(__KERNEL__) || !defined(CONFIG_JBD_DEBUG)
508cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define jbd_debug(f, a...)	/**/
51ed78c021c3b111d8ab9a51aef5d5156e3004083fTheodore Ts'o#else
521fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'oextern int journal_enable_debug;
531fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o#define jbd_debug(n, f, a...)						\
541fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o	do {								\
551fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o		if ((n) <= journal_enable_debug) {			\
561fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o			printf("(%s, %d): %s: ",			\
571fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o				__FILE__, __LINE__, __func__);		\
581fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o			printf(f, ## a);				\
591fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o		}							\
601fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o	} while (0)
611fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o#endif /*__KERNEL__ */
621fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o#else
63ed78c021c3b111d8ab9a51aef5d5156e3004083fTheodore Ts'o#define jbd_debug(f, ...)	/**/
64efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o#endif
65586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#endif
667d4343d0d05ce69e0a72da5ac34eea415d4c789fTheodore Ts'o#else
677d4343d0d05ce69e0a72da5ac34eea415d4c789fTheodore Ts'o#define jbd_debug(x)		/* AIX doesn't do STDC */
687d4343d0d05ce69e0a72da5ac34eea415d4c789fTheodore Ts'o#endif
69586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
708cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'oextern void * __jbd_kmalloc (char *where, size_t size, int flags, int retry);
718cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define jbd_kmalloc(size, flags) \
728cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o	__jbd_kmalloc(__FUNCTION__, (size), (flags), journal_oom_retry)
738cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define jbd_rep_kmalloc(size, flags) \
748cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o	__jbd_kmalloc(__FUNCTION__, (size), (flags), 1)
758cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o
76586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_MIN_JOURNAL_BLOCKS 1024
77586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
78586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/*
79586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * Internal structures used by the logging mechanism:
80586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o */
81586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
82586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_MAGIC_NUMBER 0xc03b3998U /* The first 4 bytes of /dev/random! */
83586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
84586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/*
85586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * On-disk structures
86586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o */
87586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
88efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o/*
89586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * Descriptor block types:
90586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o */
91586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
92586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_DESCRIPTOR_BLOCK	1
93586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_COMMIT_BLOCK	2
94586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_SUPERBLOCK_V1	3
95586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_SUPERBLOCK_V2	4
96586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_REVOKE_BLOCK	5
97586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
98586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/*
99586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * Standard header for all descriptor blocks:
100586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o */
101586187372afea65ae685687505b49b40fc5f3212Theodore Ts'otypedef struct journal_header_s
102586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o{
103586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32		h_magic;
104586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32		h_blocktype;
105586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32		h_sequence;
106586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o} journal_header_t;
107586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
108185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o/*
109185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o * Checksum types.
110185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o */
111185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o#define JBD2_CRC32_CHKSUM   1
112185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o#define JBD2_MD5_CHKSUM     2
113185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o#define JBD2_SHA1_CHKSUM    3
1142556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong#define JBD2_CRC32C_CHKSUM  4
115185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o
116185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o#define JBD2_CRC32_CHKSUM_SIZE 4
117185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o
118185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o#define JBD2_CHECKSUM_BYTES (32 / sizeof(__u32))
119185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o/*
120185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o * Commit block header for storing transactional checksums:
1212556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong *
1222556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong * NOTE: If FEATURE_COMPAT_CHECKSUM (checksum v1) is set, the h_chksum*
1232556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong * fields are used to store a checksum of the descriptor and data blocks.
1242556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong *
1252556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong * If FEATURE_INCOMPAT_CSUM_V2 (checksum v2) is set, then the h_chksum
1262556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong * field is used to store crc32c(uuid+commit_block).  Each journal metadata
1272556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong * block gets its own checksum, and data block checksums are stored in
1282556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong * journal_block_tag (in the descriptor).  The other h_chksum* fields are
1292556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong * not used.
1302556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong *
13138d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong * If FEATURE_INCOMPAT_CSUM_V3 is set, the descriptor block uses
13238d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong * journal_block_tag3_t to store a full 32-bit checksum.  Everything else
13338d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong * is the same as v2.
13438d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong *
13538d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong * Checksum v1, v2, and v3 are mutually exclusive features.
136185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o */
137185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'ostruct commit_header {
138185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o	__u32		h_magic;
139185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o	__u32		h_blocktype;
140185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o	__u32		h_sequence;
141185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o	unsigned char	h_chksum_type;
142185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o	unsigned char	h_chksum_size;
143185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o	unsigned char	h_padding[2];
144185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o	__u32		h_chksum[JBD2_CHECKSUM_BYTES];
145185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o	__u64		h_commit_sec;
146185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o	__u32		h_commit_nsec;
147185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o};
148586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
149efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o/*
150efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * The block tag: used to describe a single buffer in the journal
151586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o */
15238d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wongtypedef struct journal_block_tag3_s
15338d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong{
15438d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong	__u32		t_blocknr;	/* The on-disk block number */
15538d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong	__u32		t_flags;	/* See below */
15638d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong	__u32		t_blocknr_high; /* most-significant high 32bits. */
15738d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong	__u32		t_checksum;	/* crc32c(uuid+seq+block) */
15838d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong} journal_block_tag3_t;
15938d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong
160586187372afea65ae685687505b49b40fc5f3212Theodore Ts'otypedef struct journal_block_tag_s
161586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o{
162586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32		t_blocknr;	/* The on-disk block number */
1632556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong	__u16		t_checksum;	/* truncated crc32c(uuid+seq+block) */
1642556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong	__u16		t_flags;	/* See below */
165185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o	__u32		t_blocknr_high; /* most-significant high 32bits. */
166586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o} journal_block_tag_t;
167586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
1682556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong/* Tail of descriptor block, for checksumming */
1692556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wongstruct journal_block_tail {
1701224c0d3ea3dd278f5f4e48fa024e0cdb5e656b1Eric Sandeen	__be32		t_checksum;
1712556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong};
1722556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong
173efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o/*
174586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * The revoke descriptor: used on disk to describe a series of blocks to
175efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * be revoked from the log
176586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o */
177586187372afea65ae685687505b49b40fc5f3212Theodore Ts'otypedef struct journal_revoke_header_s
178586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o{
179586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	journal_header_t r_header;
180586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	int		 r_count;	/* Count of bytes used in the block */
181586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o} journal_revoke_header_t;
182586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
1832556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong/* Tail of revoke block, for checksumming */
1842556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wongstruct journal_revoke_tail {
1851224c0d3ea3dd278f5f4e48fa024e0cdb5e656b1Eric Sandeen	__be32		r_checksum;
1862556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong};
187586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
188586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* Definitions for the journal tag flags word: */
189586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_FLAG_ESCAPE		1	/* on-disk block is escaped */
190586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_FLAG_SAME_UUID	2	/* block has same uuid as previous */
191586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_FLAG_DELETED	4	/* block deleted by this transaction */
192586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_FLAG_LAST_TAG	8	/* last tag in this descriptor block */
193586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
194586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
1959c2c1e9a3d12563c68d6817b609bbfec0af149cbAzat Khuzhin#define UUID_SIZE 16
1969c2c1e9a3d12563c68d6817b609bbfec0af149cbAzat Khuzhin#define JFS_USERS_MAX 48
1979c2c1e9a3d12563c68d6817b609bbfec0af149cbAzat Khuzhin#define JFS_USERS_SIZE (UUID_SIZE * JFS_USERS_MAX)
198586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/*
199586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * The journal superblock.  All fields are in big-endian byte order.
200586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o */
201586187372afea65ae685687505b49b40fc5f3212Theodore Ts'otypedef struct journal_superblock_s
202586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o{
203586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* 0x0000 */
204586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	journal_header_t s_header;
205586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
206586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* 0x000C */
207586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	/* Static information describing the journal */
208586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_blocksize;		/* journal device blocksize */
209586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_maxlen;		/* total blocks in journal file */
210586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_first;		/* first block of log information */
211efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
212586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* 0x0018 */
213586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	/* Dynamic information describing the current state of the log */
214586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_sequence;		/* first commit ID expected in log */
215586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_start;		/* blocknr of start of log */
216586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
217586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* 0x0020 */
218586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	/* Error value, as set by journal_abort(). */
219586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__s32	s_errno;
220586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
221586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* 0x0024 */
222586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	/* Remaining fields are only valid in a version-2 superblock */
223586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_feature_compat; 	/* compatible feature set */
224586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_feature_incompat; 	/* incompatible feature set */
225586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_feature_ro_compat; 	/* readonly-compatible feature set */
226586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* 0x0030 */
227586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u8	s_uuid[16];		/* 128-bit uuid for journal */
228586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
229586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* 0x0040 */
230586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_nr_users;		/* Nr of filesystems sharing log */
231efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
232586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_dynsuper;		/* Blocknr of dynamic superblock copy*/
233efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
234586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* 0x0048 */
235586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_max_transaction;	/* Limit of journal blocks per trans.*/
236586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	__u32	s_max_trans_data;	/* Limit of data blocks per trans. */
237586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
238586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* 0x0050 */
2392556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong	__u8	s_checksum_type;	/* checksum type */
2402556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong	__u8	s_padding2[3];
2412556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong	__u32	s_padding[42];
2422556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong	__u32	s_checksum;		/* crc32c(superblock) */
243586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
244586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* 0x0100 */
2459c2c1e9a3d12563c68d6817b609bbfec0af149cbAzat Khuzhin	__u8	s_users[JFS_USERS_SIZE];		/* ids of all fs'es sharing the log */
2469c2c1e9a3d12563c68d6817b609bbfec0af149cbAzat Khuzhin
247586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* 0x0400 */
248586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o} journal_superblock_t;
249586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
250586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_HAS_COMPAT_FEATURE(j,mask)					\
251586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	((j)->j_format_version >= 2 &&					\
252b49d67ddd8af9568bd5eee319af0479f042db4fdTheodore Ts'o	 ((j)->j_superblock->s_feature_compat & ext2fs_cpu_to_be32((mask))))
253586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_HAS_RO_COMPAT_FEATURE(j,mask)				\
254586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	((j)->j_format_version >= 2 &&					\
255b49d67ddd8af9568bd5eee319af0479f042db4fdTheodore Ts'o	 ((j)->j_superblock->s_feature_ro_compat & ext2fs_cpu_to_be32((mask))))
256586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o#define JFS_HAS_INCOMPAT_FEATURE(j,mask)				\
257586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	((j)->j_format_version >= 2 &&					\
258b49d67ddd8af9568bd5eee319af0479f042db4fdTheodore Ts'o	 ((j)->j_superblock->s_feature_incompat & ext2fs_cpu_to_be32((mask))))
259586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
26077b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong#define JFS_FEATURE_COMPAT_CHECKSUM		0x00000001
261185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o
262185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o#define JFS_FEATURE_INCOMPAT_REVOKE		0x00000001
263185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o#define JFS_FEATURE_INCOMPAT_64BIT		0x00000002
264185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o#define JFS_FEATURE_INCOMPAT_ASYNC_COMMIT	0x00000004
2652556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong#define JFS_FEATURE_INCOMPAT_CSUM_V2		0x00000008
26638d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong#define JFS_FEATURE_INCOMPAT_CSUM_V3		0x00000010
267185c4aeaf23d48375e3506218305031663203d0fTheodore Ts'o
26882e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o/* Features known to this kernel version: */
26982e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#define JFS_KNOWN_COMPAT_FEATURES	0
27082e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#define JFS_KNOWN_ROCOMPAT_FEATURES	0
27182e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#define JFS_KNOWN_INCOMPAT_FEATURES	(JFS_FEATURE_INCOMPAT_REVOKE|\
27282e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o					 JFS_FEATURE_INCOMPAT_ASYNC_COMMIT|\
27382e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o					 JFS_FEATURE_INCOMPAT_64BIT|\
27482e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o					 JFS_FEATURE_INCOMPAT_CSUM_V2|\
27582e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o					 JFS_FEATURE_INCOMPAT_CSUM_V3)
27682e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o
277478360f50b68356849813f97db46fd156da5248eTheodore Ts'o#ifdef NO_INLINE_FUNCS
278478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern size_t journal_tag_bytes(journal_t *journal);
279478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern int journal_has_csum_v2or3(journal_t *journal);
280478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern int tid_gt(tid_t x, tid_t y) EXT2FS_ATTR((unused));
281478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern int tid_geq(tid_t x, tid_t y) EXT2FS_ATTR((unused));
282478360f50b68356849813f97db46fd156da5248eTheodore Ts'o#endif
28382e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o
28482e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#if (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
28582e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#ifdef E2FSCK_INCLUDE_INLINE_FUNCS
28682e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#if (__STDC_VERSION__ >= 199901L)
28782e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#define _INLINE_ extern inline
28882e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#else
28982e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#define _INLINE_ inline
29082e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#endif
29182e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#else /* !E2FSCK_INCLUDE_INLINE FUNCS */
29282e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#if (__STDC_VERSION__ >= 199901L)
29382e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#define _INLINE_ inline
29482e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#else /* not C99 */
29582e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#ifdef __GNUC__
29682e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#define _INLINE_ extern __inline__
29782e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#else				/* For Watcom C */
29882e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#define _INLINE_ extern inline
29982e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#endif /* __GNUC__ */
30082e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#endif /* __STDC_VERSION__ >= 199901L */
30182e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#endif /* INCLUDE_INLINE_FUNCS */
30282e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o
30377b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong/* journal feature predicate functions */
30477b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong#define JFS_FEATURE_COMPAT_FUNCS(name, flagname) \
305478360f50b68356849813f97db46fd156da5248eTheodore Ts'o_INLINE_ int jfs_has_feature_##name(journal_t *j); \
30682e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ int jfs_has_feature_##name(journal_t *j) \
30777b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong{ \
30877b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	return ((j)->j_format_version >= 2 && \
30977b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		((j)->j_superblock->s_feature_compat & \
31077b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		 ext2fs_cpu_to_be32(JFS_FEATURE_COMPAT_##flagname)) != 0); \
31177b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong} \
312478360f50b68356849813f97db46fd156da5248eTheodore Ts'o_INLINE_ void jfs_set_feature_##name(journal_t *j); \
31382e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ void jfs_set_feature_##name(journal_t *j) \
31477b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong{ \
31577b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	(j)->j_superblock->s_feature_compat |= \
31677b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		ext2fs_cpu_to_be32(JFS_FEATURE_COMPAT_##flagname); \
31777b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong} \
318478360f50b68356849813f97db46fd156da5248eTheodore Ts'o_INLINE_ void jfs_clear_feature_##name(journal_t *j); \
31982e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ void jfs_clear_feature_##name(journal_t *j) \
32077b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong{ \
32177b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	(j)->j_superblock->s_feature_compat &= \
32277b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		~ext2fs_cpu_to_be32(JFS_FEATURE_COMPAT_##flagname); \
32377b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong}
32477b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong
32577b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong#define JFS_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
326478360f50b68356849813f97db46fd156da5248eTheodore Ts'o_INLINE_ int jfs_has_feature_##name(journal_t *j);	\
327478360f50b68356849813f97db46fd156da5248eTheodore Ts'o_INLINE_ int jfs_has_feature_##name(journal_t *j) \
32877b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong{ \
32977b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	return ((j)->j_format_version >= 2 && \
33077b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		((j)->j_superblock->s_feature_ro_compat & \
33177b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		 ext2fs_cpu_to_be32(JFS_FEATURE_RO_COMPAT_##flagname)) != 0); \
33277b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong} \
333478360f50b68356849813f97db46fd156da5248eTheodore Ts'o_INLINE_ void jfs_set_feature_##name(journal_t *j); \
33482e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ void jfs_set_feature_##name(journal_t *j) \
33577b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong{ \
33677b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	(j)->j_superblock->s_feature_ro_compat |= \
33777b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		ext2fs_cpu_to_be32(JFS_FEATURE_RO_COMPAT_##flagname); \
33877b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong} \
339478360f50b68356849813f97db46fd156da5248eTheodore Ts'o_INLINE_ void jfs_clear_feature_##name(journal_t *j); \
34082e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ void jfs_clear_feature_##name(journal_t *j) \
34177b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong{ \
34277b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	(j)->j_superblock->s_feature_ro_compat &= \
34377b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		~ext2fs_cpu_to_be32(JFS_FEATURE_RO_COMPAT_##flagname); \
34477b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong}
34577b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong
34677b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong#define JFS_FEATURE_INCOMPAT_FUNCS(name, flagname) \
347478360f50b68356849813f97db46fd156da5248eTheodore Ts'o_INLINE_ int jfs_has_feature_##name(journal_t *j); \
34882e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ int jfs_has_feature_##name(journal_t *j) \
34977b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong{ \
35077b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	return ((j)->j_format_version >= 2 && \
35177b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		((j)->j_superblock->s_feature_incompat & \
35277b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		 ext2fs_cpu_to_be32(JFS_FEATURE_INCOMPAT_##flagname)) != 0); \
35377b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong} \
354478360f50b68356849813f97db46fd156da5248eTheodore Ts'o_INLINE_ void jfs_set_feature_##name(journal_t *j); \
35582e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ void jfs_set_feature_##name(journal_t *j) \
35677b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong{ \
35777b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	(j)->j_superblock->s_feature_incompat |= \
35877b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		ext2fs_cpu_to_be32(JFS_FEATURE_INCOMPAT_##flagname); \
35977b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong} \
360478360f50b68356849813f97db46fd156da5248eTheodore Ts'o_INLINE_ void jfs_clear_feature_##name(journal_t *j); \
36182e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ void jfs_clear_feature_##name(journal_t *j) \
36277b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong{ \
36377b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	(j)->j_superblock->s_feature_incompat &= \
36477b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong		~ext2fs_cpu_to_be32(JFS_FEATURE_INCOMPAT_##flagname); \
36577b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong}
36677b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong
367478360f50b68356849813f97db46fd156da5248eTheodore Ts'o#else
368478360f50b68356849813f97db46fd156da5248eTheodore Ts'o#define JFS_FEATURE_COMPAT_FUNCS(name, flagname) \
369478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern int jfs_has_feature_##name(journal_t *j); \
370478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern void jfs_set_feature_##name(journal_t *j); \
371478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern void jfs_clear_feature_##name(journal_t *j);
372478360f50b68356849813f97db46fd156da5248eTheodore Ts'o
373478360f50b68356849813f97db46fd156da5248eTheodore Ts'o#define JFS_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
374478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern int jfs_has_feature_##name(journal_t *j); \
375478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern void jfs_set_feature_##name(journal_t *j); \
376478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern void jfs_clear_feature_##name(journal_t *j);
377478360f50b68356849813f97db46fd156da5248eTheodore Ts'o
378478360f50b68356849813f97db46fd156da5248eTheodore Ts'o#define JFS_FEATURE_INCOMPAT_FUNCS(name, flagname) \
379478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern int jfs_has_feature_##name(journal_t *j); \
380478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern void jfs_set_feature_##name(journal_t *j); \
381478360f50b68356849813f97db46fd156da5248eTheodore Ts'oextern void jfs_clear_feature_##name(journal_t *j);
382478360f50b68356849813f97db46fd156da5248eTheodore Ts'o
383478360f50b68356849813f97db46fd156da5248eTheodore Ts'o#endif /* (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS)) */
384478360f50b68356849813f97db46fd156da5248eTheodore Ts'o
38577b3e9871877fce9908b0696250787fd6ea61af9Darrick J. WongJFS_FEATURE_COMPAT_FUNCS(checksum,		CHECKSUM)
38677b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong
38777b3e9871877fce9908b0696250787fd6ea61af9Darrick J. WongJFS_FEATURE_INCOMPAT_FUNCS(revoke,		REVOKE)
38877b3e9871877fce9908b0696250787fd6ea61af9Darrick J. WongJFS_FEATURE_INCOMPAT_FUNCS(64bit,		64BIT)
38977b3e9871877fce9908b0696250787fd6ea61af9Darrick J. WongJFS_FEATURE_INCOMPAT_FUNCS(async_commit,	ASYNC_COMMIT)
39077b3e9871877fce9908b0696250787fd6ea61af9Darrick J. WongJFS_FEATURE_INCOMPAT_FUNCS(csum2,		CSUM_V2)
39177b3e9871877fce9908b0696250787fd6ea61af9Darrick J. WongJFS_FEATURE_INCOMPAT_FUNCS(csum3,		CSUM_V3)
39277b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong
393478360f50b68356849813f97db46fd156da5248eTheodore Ts'o#if (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
394d920038068bbda80df9060be55da5726a6efe9a4Darrick J. Wong/*
395d920038068bbda80df9060be55da5726a6efe9a4Darrick J. Wong * helper functions to deal with 32 or 64bit block numbers.
396d920038068bbda80df9060be55da5726a6efe9a4Darrick J. Wong */
39782e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ size_t journal_tag_bytes(journal_t *journal)
398d920038068bbda80df9060be55da5726a6efe9a4Darrick J. Wong{
39938d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong	size_t sz;
40038d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong
40177b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	if (jfs_has_feature_csum3(journal))
40238d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong		return sizeof(journal_block_tag3_t);
40338d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong
40438d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong	sz = sizeof(journal_block_tag_t);
405d920038068bbda80df9060be55da5726a6efe9a4Darrick J. Wong
40677b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	if (jfs_has_feature_csum2(journal))
40738d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong		sz += sizeof(__u16);
408d920038068bbda80df9060be55da5726a6efe9a4Darrick J. Wong
40977b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	if (jfs_has_feature_64bit(journal))
41038d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong		return sz;
41138d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong
41238d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong	return sz - sizeof(__u32);
41338d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong}
41438d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong
41582e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ int journal_has_csum_v2or3(journal_t *journal)
41638d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong{
41777b3e9871877fce9908b0696250787fd6ea61af9Darrick J. Wong	if (jfs_has_feature_csum2(journal) || jfs_has_feature_csum3(journal))
41838d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong		return 1;
41938d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong
42038d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong	return 0;
421d920038068bbda80df9060be55da5726a6efe9a4Darrick J. Wong}
422d920038068bbda80df9060be55da5726a6efe9a4Darrick J. Wong
423586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o/* Comparison functions for transaction IDs: perform comparisons using
424586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o * modulo arithmetic so that they work over sequence number wraps. */
425586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
42682e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ int tid_gt(tid_t x, tid_t y)
427586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o{
428586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	int difference = (x - y);
429586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	return (difference > 0);
430586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o}
431586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
43282e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o_INLINE_ int tid_geq(tid_t x, tid_t y)
433586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o{
434586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	int difference = (x - y);
435586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o	return (difference >= 0);
436586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o}
437478360f50b68356849813f97db46fd156da5248eTheodore Ts'o#endif /* (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS)) */
438586187372afea65ae685687505b49b40fc5f3212Theodore Ts'o
43982e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o#undef _INLINE_
44082e48fb1637a2b6d4d789516eae57d27fefb605eTheodore Ts'o
4418cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'oextern int journal_blocks_per_page(struct inode *inode);
4428cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o
4438cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o/*
4448cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o * Definitions which augment the buffer_head layer
4458cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o */
4468cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o
4478cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o/* journaling buffer types */
4488cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define BJ_None		0	/* Not journaled */
4498cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define BJ_SyncData	1	/* Normal data: flush before commit */
4508cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define BJ_AsyncData	2	/* writepage data: wait on it before commit */
4518cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define BJ_Metadata	3	/* Normal journaled metadata */
4528cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define BJ_Forget	4	/* Buffer superceded by this transaction */
4538cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define BJ_IO		5	/* Buffer is for temporary IO use */
4548cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define BJ_Shadow	6	/* Buffer contents being shadowed to the log */
4558cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define BJ_LogCtl	7	/* Buffer contains log descriptors */
4568cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define BJ_Reserved	8	/* Buffer is reserved for access by journal */
4578cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#define BJ_Types	9
458efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
4598cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'oextern int jbd_blocks_per_page(struct inode *inode);
4608cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o
4618cf93332d180e6929d73cd8c855c3a83d6a6648cTheodore Ts'o#endif	/* _LINUX_JBD_H */
462