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