1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * linux/include/linux/jbd.h 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Written by Stephen C. Tweedie <sct@redhat.com> 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright 1998-2000 Red Hat, Inc --- All Rights Reserved 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This file is part of the Linux kernel and is made available under 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the terms of the GNU General Public License, version 2, or at your 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * option, any later version, incorporated herein by reference. 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Definitions for transaction data structures for the buffer cache 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * filesystem journaling support. 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_JBD_H 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_JBD_H 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Allow this file to be included directly into e2fsprogs */ 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __KERNEL__ 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include "jfs_compat.h" 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_DEBUG 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define jfs_debug jbd_debug 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/types.h> 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/buffer_head.h> 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/journal-head.h> 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/stddef.h> 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/bit_spinlock.h> 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/mutex.h> 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/timer.h> 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/semaphore.h> 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define journal_oom_retry 1 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Define JBD_PARANIOD_IOFAIL to cause a kernel BUG() if ext3 finds 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * certain classes of error which can occur due to failed IOs. Under 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * normal use we want ext3 to continue after such errors, because 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * hardware _can_ fail, but for debugging purposes when running tests on 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * known-good hardware we may want to trap these errors. 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#undef JBD_PARANOID_IOFAIL 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The default maximum commit age, in seconds. 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JBD_DEFAULT_MAX_COMMIT_AGE 5 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_JBD_DEBUG 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Define JBD_EXPENSIVE_CHECKING to enable more expensive internal 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * consistency checks. By default we don't do this unless 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * CONFIG_JBD_DEBUG is on. 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JBD_EXPENSIVE_CHECKING 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_enable_debug; 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define jbd_debug(n, f, a...) \ 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru do { \ 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if ((n) <= journal_enable_debug) { \ 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru printk (KERN_DEBUG "(%s, %d): %s: ", \ 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __FILE__, __LINE__, __FUNCTION__); \ 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru printk (f, ## a); \ 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } while (0) 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define jbd_debug(f, a...) /**/ 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void * __jbd_kmalloc (const char *where, size_t size, gfp_t flags, int retry); 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void * jbd_slab_alloc(size_t size, gfp_t flags); 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void jbd_slab_free(void *ptr, size_t size); 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define jbd_kmalloc(size, flags) \ 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __jbd_kmalloc(__FUNCTION__, (size), (flags), journal_oom_retry) 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define jbd_rep_kmalloc(size, flags) \ 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __jbd_kmalloc(__FUNCTION__, (size), (flags), 1) 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_MIN_JOURNAL_BLOCKS 1024 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * typedef handle_t - The handle_t type represents a single atomic update being performed by some process. 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * All filesystem modifications made by the process go 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * through this handle. Recursive operations (such as quota operations) 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * are gathered into a single update. 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The buffer credits field is used to account for journaled buffers 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * being modified by the running process. To ensure that there is 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * enough log space for all outstanding operations, we need to limit the 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * number of outstanding buffers possible at any time. When the 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * operation completes, any buffer credits not used are credited back to 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the transaction, so that at all times we know how many buffers the 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * outstanding updates on a transaction might possibly touch. 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This is an opaque datatype. 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru **/ 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct handle_s handle_t; /* Atomic operation type */ 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * typedef journal_t - The journal_t maintains all of the journaling state information for a single filesystem. 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * journal_t is linked to from the fs superblock structure. 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * We use the journal_t to keep track of all outstanding transaction 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * activity on the filesystem, and to manage the state of the log 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * writing process. 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This is an opaque datatype. 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru **/ 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct journal_s journal_t; /* Journal control structure */ 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Internal structures used by the logging mechanism: 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_MAGIC_NUMBER 0xc03b3998U /* The first 4 bytes of /dev/random! */ 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * On-disk structures 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Descriptor block types: 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_DESCRIPTOR_BLOCK 1 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_COMMIT_BLOCK 2 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_SUPERBLOCK_V1 3 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_SUPERBLOCK_V2 4 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_REVOKE_BLOCK 5 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Standard header for all descriptor blocks: 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct journal_header_s 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 h_magic; 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 h_blocktype; 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 h_sequence; 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} journal_header_t; 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The block tag: used to describe a single buffer in the journal 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct journal_block_tag_s 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 t_blocknr; /* The on-disk block number */ 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 t_flags; /* See below */ 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} journal_block_tag_t; 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The revoke descriptor: used on disk to describe a series of blocks to 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * be revoked from the log 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct journal_revoke_header_s 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru journal_header_t r_header; 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 r_count; /* Count of bytes used in the block */ 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} journal_revoke_header_t; 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Definitions for the journal tag flags word: */ 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_FLAG_ESCAPE 1 /* on-disk block is escaped */ 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_FLAG_SAME_UUID 2 /* block has same uuid as previous */ 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_FLAG_DELETED 4 /* block deleted by this transaction */ 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_FLAG_LAST_TAG 8 /* last tag in this descriptor block */ 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The journal superblock. All fields are in big-endian byte order. 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct journal_superblock_s 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x0000 */ 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru journal_header_t s_header; 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x000C */ 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Static information describing the journal */ 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_blocksize; /* journal device blocksize */ 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_maxlen; /* total blocks in journal file */ 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_first; /* first block of log information */ 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x0018 */ 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Dynamic information describing the current state of the log */ 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_sequence; /* first commit ID expected in log */ 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_start; /* blocknr of start of log */ 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x0020 */ 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Error value, as set by journal_abort(). */ 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_errno; 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x0024 */ 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Remaining fields are only valid in a version-2 superblock */ 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_feature_compat; /* compatible feature set */ 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_feature_incompat; /* incompatible feature set */ 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_feature_ro_compat; /* readonly-compatible feature set */ 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x0030 */ 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 s_uuid[16]; /* 128-bit uuid for journal */ 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x0040 */ 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_nr_users; /* Nr of filesystems sharing log */ 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_dynsuper; /* Blocknr of dynamic superblock copy*/ 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x0048 */ 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_max_transaction; /* Limit of journal blocks per trans.*/ 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 s_max_trans_data; /* Limit of data blocks per trans. */ 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x0050 */ 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u32 s_padding[44]; 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x0100 */ 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 s_users[16*48]; /* ids of all fs'es sharing the log */ 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x0400 */ 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} journal_superblock_t; 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_HAS_COMPAT_FEATURE(j,mask) \ 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ((j)->j_format_version >= 2 && \ 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ((j)->j_superblock->s_feature_compat & cpu_to_be32((mask)))) 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_HAS_RO_COMPAT_FEATURE(j,mask) \ 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ((j)->j_format_version >= 2 && \ 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ((j)->j_superblock->s_feature_ro_compat & cpu_to_be32((mask)))) 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_HAS_INCOMPAT_FEATURE(j,mask) \ 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ((j)->j_format_version >= 2 && \ 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ((j)->j_superblock->s_feature_incompat & cpu_to_be32((mask)))) 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_FEATURE_INCOMPAT_REVOKE 0x00000001 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Features known to this kernel version: */ 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_KNOWN_COMPAT_FEATURES 0 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_KNOWN_ROCOMPAT_FEATURES 0 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_KNOWN_INCOMPAT_FEATURES JFS_FEATURE_INCOMPAT_REVOKE 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/fs.h> 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/sched.h> 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JBD_ASSERTIONS 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef JBD_ASSERTIONS 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_ASSERT(assert) \ 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!(assert)) { \ 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru printk (KERN_EMERG \ 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "Assertion failure in %s() at %s:%d: \"%s\"\n", \ 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __FUNCTION__, __FILE__, __LINE__, # assert); \ 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BUG(); \ 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(CONFIG_BUFFER_DEBUG) 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid buffer_assertion_failure(struct buffer_head *bh); 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_ASSERT_BH(bh, expr) \ 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru do { \ 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!(expr)) \ 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru buffer_assertion_failure(bh); \ 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru J_ASSERT(expr); \ 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } while (0) 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_ASSERT_JH(jh, expr) J_ASSERT_BH(jh2bh(jh), expr) 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_ASSERT_BH(bh, expr) J_ASSERT(expr) 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_ASSERT_JH(jh, expr) J_ASSERT(expr) 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_ASSERT(assert) do { } while (0) 277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* JBD_ASSERTIONS */ 278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(JBD_PARANOID_IOFAIL) 280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_EXPECT(expr, why...) J_ASSERT(expr) 281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_EXPECT_BH(bh, expr, why...) J_ASSERT_BH(bh, expr) 282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_EXPECT_JH(jh, expr, why...) J_ASSERT_JH(jh, expr) 283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __journal_expect(expr, why...) \ 285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int val = (expr); \ 287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!val) { \ 288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru printk(KERN_ERR \ 289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "EXT3-fs unexpected failure: %s;\n",# expr); \ 290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru printk(KERN_ERR why "\n"); \ 291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru val; \ 293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_EXPECT(expr, why...) __journal_expect(expr, ## why) 295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_EXPECT_BH(bh, expr, why...) __journal_expect(expr, ## why) 296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define J_EXPECT_JH(jh, expr, why...) __journal_expect(expr, ## why) 297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum jbd_state_bits { 300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BH_JBD /* Has an attached ext3 journal_head */ 301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru = BH_PrivateStart, 302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BH_JWrite, /* Being written to log (@@@ DEBUGGING) */ 303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BH_Freed, /* Has been freed (truncated) */ 304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BH_Revoked, /* Has been revoked from the log */ 305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BH_RevokeValid, /* Revoked flag is valid */ 306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BH_JBDDirty, /* Is dirty but journaled */ 307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BH_State, /* Pins most journal_head state */ 308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BH_JournalHead, /* Pins bh->b_private and jh->b_bh */ 309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BH_Unshadow, /* Dummy bit, for BJ_Shadow wakeup filtering */ 310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruBUFFER_FNS(JBD, jbd) 313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruBUFFER_FNS(JWrite, jwrite) 314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruBUFFER_FNS(JBDDirty, jbddirty) 315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruTAS_BUFFER_FNS(JBDDirty, jbddirty) 316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruBUFFER_FNS(Revoked, revoked) 317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruTAS_BUFFER_FNS(Revoked, revoked) 318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruBUFFER_FNS(RevokeValid, revokevalid) 319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruTAS_BUFFER_FNS(RevokeValid, revokevalid) 320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruBUFFER_FNS(Freed, freed) 321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct buffer_head *jh2bh(struct journal_head *jh) 323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return jh->b_bh; 325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct journal_head *bh2jh(struct buffer_head *bh) 328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return bh->b_private; 330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void jbd_lock_bh_state(struct buffer_head *bh) 333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru bit_spin_lock(BH_State, &bh->b_state); 335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int jbd_trylock_bh_state(struct buffer_head *bh) 338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return bit_spin_trylock(BH_State, &bh->b_state); 340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int jbd_is_locked_bh_state(struct buffer_head *bh) 343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return bit_spin_is_locked(BH_State, &bh->b_state); 345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void jbd_unlock_bh_state(struct buffer_head *bh) 348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru bit_spin_unlock(BH_State, &bh->b_state); 350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void jbd_lock_bh_journal_head(struct buffer_head *bh) 353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru bit_spin_lock(BH_JournalHead, &bh->b_state); 355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void jbd_unlock_bh_journal_head(struct buffer_head *bh) 358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru bit_spin_unlock(BH_JournalHead, &bh->b_state); 360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct jbd_revoke_table_s; 363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct handle_s - The handle_s type is the concrete type associated with 366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * handle_t. 367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @h_transaction: Which compound transaction is this update a part of? 368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @h_buffer_credits: Number of remaining buffers we are allowed to dirty. 369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @h_ref: Reference count on this handle 370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @h_err: Field for caller's use to track errors through large fs operations 371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @h_sync: flag for sync-on-close 372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @h_jdata: flag to force data journaling 373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @h_aborted: flag indicating fatal error on handle 374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru **/ 375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Docbook can't yet cope with the bit fields, but will leave the documentation 377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * in so it can be fixed later. 378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct handle_s 381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Which compound transaction is this update a part of? */ 383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru transaction_t *h_transaction; 384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Number of remaining buffers we are allowed to dirty: */ 386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int h_buffer_credits; 387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Reference count on this handle */ 389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int h_ref; 390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Field for caller's use to track errors through large fs */ 392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* operations */ 393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int h_err; 394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Flags [no locking] */ 396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int h_sync: 1; /* sync-on-close */ 397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int h_jdata: 1; /* force data journaling */ 398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int h_aborted: 1; /* fatal error on handle */ 399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 402c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* The transaction_t type is the guts of the journaling mechanism. It 403c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * tracks a compound transaction through its various states: 404c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 405c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * RUNNING: accepting new updates 406c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * LOCKED: Updates still running but we don't accept new ones 407c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * RUNDOWN: Updates are tidying up but have finished requesting 408c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * new buffers to modify (state not used for now) 409c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * FLUSH: All updates complete, but we are still writing to disk 410c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * COMMIT: All data on disk, writing commit record 411c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * FINISHED: We still have to keep the transaction for checkpointing. 412c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 413c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The transaction keeps track of all of the buffers modified by a 414c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * running transaction, and all of the buffers committed but not yet 415c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * flushed to home for finished transactions. 416c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 417c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 418c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 419c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Lock ranking: 420c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 421c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * j_list_lock 422c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ->jbd_lock_bh_journal_head() (This is "innermost") 423c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 424c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * j_state_lock 425c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ->jbd_lock_bh_state() 426c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 427c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * jbd_lock_bh_state() 428c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ->j_list_lock 429c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 430c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * j_state_lock 431c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ->t_handle_lock 432c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 433c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * j_state_lock 434c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ->j_list_lock (journal_unmap_buffer) 435c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 436c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 437c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 438c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct transaction_s 439c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 440c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Pointer to the journal for this transaction. [no locking] */ 441c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru journal_t *t_journal; 442c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 443c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Sequence number for this transaction [no locking] */ 444c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru tid_t t_tid; 445c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 446c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 447c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Transaction's current state 448c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * [no locking - only kjournald alters this] 449c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * FIXME: needs barriers 450c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * KLUDGE: [use j_state_lock] 451c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 452c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru enum { 453c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru T_RUNNING, 454c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru T_LOCKED, 455c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru T_RUNDOWN, 456c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru T_FLUSH, 457c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru T_COMMIT, 458c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru T_FINISHED 459c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } t_state; 460c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 461c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 462c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Where in the log does this transaction's commit start? [no locking] 463c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 464c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long t_log_start; 465c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 466c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Number of buffers on the t_buffers list [j_list_lock] */ 467c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int t_nr_buffers; 468c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 469c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 470c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Doubly-linked circular list of all buffers reserved but not yet 471c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * modified by this transaction [j_list_lock] 472c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 473c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head *t_reserved_list; 474c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 475c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 476c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Doubly-linked circular list of all buffers under writeout during 477c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * commit [j_list_lock] 478c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 479c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head *t_locked_list; 480c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 481c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 482c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Doubly-linked circular list of all metadata buffers owned by this 483c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * transaction [j_list_lock] 484c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 485c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head *t_buffers; 486c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 487c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 488c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Doubly-linked circular list of all data buffers still to be 489c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * flushed before this transaction can be committed [j_list_lock] 490c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 491c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head *t_sync_datalist; 492c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 493c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 494c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Doubly-linked circular list of all forget buffers (superseded 495c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * buffers which we can un-checkpoint once this transaction commits) 496c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * [j_list_lock] 497c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 498c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head *t_forget; 499c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 500c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 501c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Doubly-linked circular list of all buffers still to be flushed before 502c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * this transaction can be checkpointed. [j_list_lock] 503c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 504c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head *t_checkpoint_list; 505c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 506c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 507c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Doubly-linked circular list of all buffers submitted for IO while 508c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * checkpointing. [j_list_lock] 509c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 510c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head *t_checkpoint_io_list; 511c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 512c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 513c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Doubly-linked circular list of temporary buffers currently undergoing 514c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IO in the log [j_list_lock] 515c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 516c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head *t_iobuf_list; 517c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 518c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 519c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Doubly-linked circular list of metadata buffers being shadowed by log 520c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IO. The IO buffers on the iobuf list and the shadow buffers on this 521c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * list match each other one for one at all times. [j_list_lock] 522c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 523c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head *t_shadow_list; 524c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 525c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 526c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Doubly-linked circular list of control buffers being written to the 527c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * log. [j_list_lock] 528c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 529c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head *t_log_list; 530c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 531c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 532c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Protects info related to handles 533c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 534c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t t_handle_lock; 535c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 536c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 537c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Number of outstanding updates running on this transaction 538c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * [t_handle_lock] 539c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 540c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int t_updates; 541c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 542c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 543c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Number of buffers reserved for use by all handles in this transaction 544c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * handle but not yet modified. [t_handle_lock] 545c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 546c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int t_outstanding_credits; 547c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 548c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 549c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Forward and backward links for the circular list of all transactions 550c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * awaiting checkpoint. [j_list_lock] 551c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 552c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru transaction_t *t_cpnext, *t_cpprev; 553c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 554c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 555c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * When will the transaction expire (become due for commit), in jiffies? 556c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * [no locking] 557c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 558c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long t_expires; 559c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 560c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 561c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * How many handles used this transaction? [t_handle_lock] 562c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 563c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int t_handle_count; 564c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 565c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 566c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 567c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 568c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct journal_s - The journal_s type is the concrete type associated with 569c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * journal_t. 570c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_flags: General journaling state flags 571c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_errno: Is there an outstanding uncleared error on the journal (from a 572c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * prior abort)? 573c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_sb_buffer: First part of superblock buffer 574c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_superblock: Second part of superblock buffer 575c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_format_version: Version of the superblock format 576c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_state_lock: Protect the various scalars in the journal 577c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_barrier_count: Number of processes waiting to create a barrier lock 578c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_barrier: The barrier lock itself 579c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_running_transaction: The current running transaction.. 580c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_committing_transaction: the transaction we are pushing to disk 581c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_checkpoint_transactions: a linked circular list of all transactions 582c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * waiting for checkpointing 583c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_wait_transaction_locked: Wait queue for waiting for a locked transaction 584c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to start committing, or for a barrier lock to be released 585c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_wait_logspace: Wait queue for waiting for checkpointing to complete 586c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_wait_done_commit: Wait queue for waiting for commit to complete 587c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_wait_checkpoint: Wait queue to trigger checkpointing 588c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_wait_commit: Wait queue to trigger commit 589c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_wait_updates: Wait queue to wait for updates to complete 590c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_checkpoint_mutex: Mutex for locking against concurrent checkpoints 591c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_head: Journal head - identifies the first unused block in the journal 592c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_tail: Journal tail - identifies the oldest still-used block in the 593c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * journal. 594c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_free: Journal free - how many free blocks are there in the journal? 595c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_first: The block number of the first usable block 596c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_last: The block number one beyond the last usable block 597c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_dev: Device where we store the journal 598c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_blocksize: blocksize for the location where we store the journal. 599c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_blk_offset: starting block offset for into the device where we store the 600c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * journal 601c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_fs_dev: Device which holds the client fs. For internal journal this will 602c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * be equal to j_dev 603c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_maxlen: Total maximum capacity of the journal region on disk. 604c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_list_lock: Protects the buffer lists and internal buffer state. 605c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_inode: Optional inode where we store the journal. If present, all journal 606c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * block numbers are mapped into this inode via bmap(). 607c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_tail_sequence: Sequence number of the oldest transaction in the log 608c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_transaction_sequence: Sequence number of the next transaction to grant 609c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_commit_sequence: Sequence number of the most recently committed 610c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * transaction 611c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_commit_request: Sequence number of the most recent transaction wanting 612c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * commit 613c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_uuid: Uuid of client object. 614c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_task: Pointer to the current commit thread for this journal 615c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_max_transaction_buffers: Maximum number of metadata buffers to allow in a 616c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * single compound commit transaction 617c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_commit_interval: What is the maximum transaction lifetime before we begin 618c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * a commit? 619c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_commit_timer: The timer used to wakeup the commit thread 620c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_revoke_lock: Protect the revoke table 621c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_revoke: The revoke table - maintains the list of revoked blocks in the 622c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * current transaction. 623c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_revoke_table: alternate revoke tables for j_revoke 624c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_wbuf: array of buffer_heads for journal_commit_transaction 625c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_wbufsize: maximum number of buffer_heads allowed in j_wbuf, the 626c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * number that will fit in j_blocksize 627c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_last_sync_writer: most recent pid which did a synchronous write 628c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @j_private: An opaque pointer to fs-private information. 629c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 630c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 631c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct journal_s 632c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 633c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* General journaling state flags [j_state_lock] */ 634c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long j_flags; 635c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 636c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 637c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Is there an outstanding uncleared error on the journal (from a prior 638c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * abort)? [j_state_lock] 639c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 640c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int j_errno; 641c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 642c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* The superblock buffer */ 643c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct buffer_head *j_sb_buffer; 644c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru journal_superblock_t *j_superblock; 645c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 646c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Version of the superblock format */ 647c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int j_format_version; 648c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 649c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 650c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Protect the various scalars in the journal 651c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 652c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t j_state_lock; 653c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 654c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 655c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Number of processes waiting to create a barrier lock [j_state_lock] 656c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 657c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int j_barrier_count; 658c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 659c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* The barrier lock itself */ 660c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mutex j_barrier; 661c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 662c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 663c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Transactions: The current running transaction... 664c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * [j_state_lock] [caller holding open handle] 665c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 666c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru transaction_t *j_running_transaction; 667c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 668c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 669c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the transaction we are pushing to disk 670c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * [j_state_lock] [caller holding open handle] 671c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 672c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru transaction_t *j_committing_transaction; 673c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 674c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 675c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ... and a linked circular list of all transactions waiting for 676c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * checkpointing. [j_list_lock] 677c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 678c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru transaction_t *j_checkpoint_transactions; 679c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 680c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 681c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Wait queue for waiting for a locked transaction to start committing, 682c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * or for a barrier lock to be released 683c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 684c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_head_t j_wait_transaction_locked; 685c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 686c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Wait queue for waiting for checkpointing to complete */ 687c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_head_t j_wait_logspace; 688c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 689c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Wait queue for waiting for commit to complete */ 690c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_head_t j_wait_done_commit; 691c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 692c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Wait queue to trigger checkpointing */ 693c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_head_t j_wait_checkpoint; 694c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 695c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Wait queue to trigger commit */ 696c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_head_t j_wait_commit; 697c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 698c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Wait queue to wait for updates to complete */ 699c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_head_t j_wait_updates; 700c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 701c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Semaphore for locking against concurrent checkpoints */ 702c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mutex j_checkpoint_mutex; 703c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 704c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 705c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Journal head: identifies the first unused block in the journal. 706c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * [j_state_lock] 707c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 708c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long j_head; 709c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 710c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 711c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Journal tail: identifies the oldest still-used block in the journal. 712c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * [j_state_lock] 713c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 714c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long j_tail; 715c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 716c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 717c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Journal free: how many free blocks are there in the journal? 718c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * [j_state_lock] 719c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 720c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long j_free; 721c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 722c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 723c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Journal start and end: the block numbers of the first usable block 724c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and one beyond the last usable block in the journal. [j_state_lock] 725c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 726c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long j_first; 727c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long j_last; 728c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 729c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 730c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Device, blocksize and starting block offset for the location where we 731c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * store the journal. 732c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 733c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct block_device *j_dev; 734c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int j_blocksize; 735c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int j_blk_offset; 736c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 737c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 738c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Device which holds the client fs. For internal journal this will be 739c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * equal to j_dev. 740c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 741c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct block_device *j_fs_dev; 742c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 743c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Total maximum capacity of the journal region on disk. */ 744c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int j_maxlen; 745c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 746c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 747c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Protects the buffer lists and internal buffer state. 748c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 749c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t j_list_lock; 750c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 751c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Optional inode where we store the journal. If present, all */ 752c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* journal block numbers are mapped into this inode via */ 753c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* bmap(). */ 754c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct inode *j_inode; 755c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 756c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 757c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Sequence number of the oldest transaction in the log [j_state_lock] 758c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 759c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru tid_t j_tail_sequence; 760c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 761c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 762c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Sequence number of the next transaction to grant [j_state_lock] 763c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 764c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru tid_t j_transaction_sequence; 765c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 766c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 767c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Sequence number of the most recently committed transaction 768c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * [j_state_lock]. 769c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 770c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru tid_t j_commit_sequence; 771c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 772c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 773c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Sequence number of the most recent transaction wanting commit 774c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * [j_state_lock] 775c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 776c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru tid_t j_commit_request; 777c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 778c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 779c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Journal uuid: identifies the object (filesystem, LVM volume etc) 780c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * backed by this journal. This will eventually be replaced by an array 781c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * of uuids, allowing us to index multiple devices within a single 782c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * journal and to perform atomic updates across them. 783c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 784c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 j_uuid[16]; 785c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 786c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Pointer to the current commit thread for this journal */ 787c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct task_struct *j_task; 788c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 789c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 790c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Maximum number of metadata buffers to allow in a single compound 791c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * commit transaction 792c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 793c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int j_max_transaction_buffers; 794c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 795c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 796c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * What is the maximum transaction lifetime before we begin a commit? 797c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 798c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long j_commit_interval; 799c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 800c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* The timer used to wakeup the commit thread: */ 801c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct timer_list j_commit_timer; 802c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 803c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 804c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The revoke table: maintains the list of revoked blocks in the 805c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * current transaction. [j_revoke_lock] 806c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 807c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t j_revoke_lock; 808c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct jbd_revoke_table_s *j_revoke; 809c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct jbd_revoke_table_s *j_revoke_table[2]; 810c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 811c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 812c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * array of bhs for journal_commit_transaction 813c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 814c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct buffer_head **j_wbuf; 815c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int j_wbufsize; 816c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 817c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pid_t j_last_sync_writer; 818c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 819c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 820c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * An opaque pointer to fs-private information. ext3 puts its 821c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * superblock pointer here 822c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 823c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *j_private; 824c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 825c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 826c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 827c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Journal flag definitions 828c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 829c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_UNMOUNT 0x001 /* Journal thread is being destroyed */ 830c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_ABORT 0x002 /* Journaling has been aborted for errors. */ 831c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_ACK_ERR 0x004 /* The errno in the sb has been acked */ 832c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_FLUSHED 0x008 /* The journal superblock has been flushed */ 833c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_LOADED 0x010 /* The journal superblock has been loaded */ 834c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JFS_BARRIER 0x020 /* Use IDE barriers */ 835c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 836c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 837c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Function declarations for the journaling transaction and buffer 838c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * management 839c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 840c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 841c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Filing buffers */ 842c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __journal_temp_unlink_buffer(struct journal_head *jh); 843c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_unfile_buffer(journal_t *, struct journal_head *); 844c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __journal_unfile_buffer(struct journal_head *); 845c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __journal_refile_buffer(struct journal_head *); 846c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_refile_buffer(journal_t *, struct journal_head *); 847c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __journal_file_buffer(struct journal_head *, transaction_t *, int); 848c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __journal_free_buffer(struct journal_head *bh); 849c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_file_buffer(struct journal_head *, transaction_t *, int); 850c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __journal_clean_data_list(transaction_t *transaction); 851c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 852c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Log buffer allocation */ 853c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct journal_head * journal_get_descriptor_buffer(journal_t *); 854c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint journal_next_log_block(journal_t *, unsigned long *); 855c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 856c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Commit management */ 857c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_commit_transaction(journal_t *); 858c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 859c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Checkpoint list management */ 860c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint __journal_clean_checkpoint_list(journal_t *journal); 861c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint __journal_remove_checkpoint(struct journal_head *); 862c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid __journal_insert_checkpoint(struct journal_head *, transaction_t *); 863c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 864c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Buffer IO */ 865c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int 866c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querujournal_write_metadata_buffer(transaction_t *transaction, 867c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head *jh_in, 868c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct journal_head **jh_out, 869c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int blocknr); 870c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 871c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Transaction locking */ 872c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __wait_on_journal (journal_t *); 873c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 874c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 875c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Journal locking. 876c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 877c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * We need to lock the journal during transaction state changes so that nobody 878c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ever tries to take a handle on the running transaction while we are in the 879c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * middle of moving it to the commit phase. j_state_lock does this. 880c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 881c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Note that the locking is completely interrupt unsafe. We never touch 882c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * journal structures from interrupts. 883c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 884c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 885c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline handle_t *journal_current_handle(void) 886c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 887c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return current->journal_info; 888c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 889c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 890c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* The journaling code user interface: 891c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 892c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Create and destroy handles 893c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Register buffer modifications against the current transaction. 894c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 895c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 896c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern handle_t *journal_start(journal_t *, int nblocks); 897c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_restart (handle_t *, int nblocks); 898c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_extend (handle_t *, int nblocks); 899c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_get_write_access(handle_t *, struct buffer_head *); 900c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_get_create_access (handle_t *, struct buffer_head *); 901c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_get_undo_access(handle_t *, struct buffer_head *); 902c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_dirty_data (handle_t *, struct buffer_head *); 903c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_dirty_metadata (handle_t *, struct buffer_head *); 904c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_release_buffer (handle_t *, struct buffer_head *); 905c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_forget (handle_t *, struct buffer_head *); 906c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_sync_buffer (struct buffer_head *); 907c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_invalidatepage(journal_t *, 908c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct page *, unsigned long); 909c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_try_to_free_buffers(journal_t *, struct page *, gfp_t); 910c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_stop(handle_t *); 911c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_flush (journal_t *); 912c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_lock_updates (journal_t *); 913c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_unlock_updates (journal_t *); 914c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 915c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern journal_t * journal_init_dev(struct block_device *bdev, 916c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct block_device *fs_dev, 917c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int start, int len, int bsize); 918c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern journal_t * journal_init_inode (struct inode *); 919c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_update_format (journal_t *); 920c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_check_used_features 921c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (journal_t *, unsigned long, unsigned long, unsigned long); 922c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_check_available_features 923c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (journal_t *, unsigned long, unsigned long, unsigned long); 924c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_set_features 925c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (journal_t *, unsigned long, unsigned long, unsigned long); 926c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_create (journal_t *); 927c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_load (journal_t *journal); 928c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_destroy (journal_t *); 929c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_recover (journal_t *journal); 930c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_wipe (journal_t *, int); 931c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_skip_recovery (journal_t *); 932c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_update_superblock (journal_t *, int); 933c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __journal_abort_hard (journal_t *); 934c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_abort (journal_t *, int); 935c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_errno (journal_t *); 936c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_ack_err (journal_t *); 937c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_clear_err (journal_t *); 938c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_bmap(journal_t *, unsigned long, unsigned long *); 939c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_force_commit(journal_t *); 940c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 941c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 942c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * journal_head management 943c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 944c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct journal_head *journal_add_journal_head(struct buffer_head *bh); 945c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct journal_head *journal_grab_journal_head(struct buffer_head *bh); 946c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid journal_remove_journal_head(struct buffer_head *bh); 947c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid journal_put_journal_head(struct journal_head *jh); 948c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 949c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 950c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * handle management 951c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 952c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern kmem_cache_t *jbd_handle_cache; 953c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 954c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline handle_t *jbd_alloc_handle(gfp_t gfp_flags) 955c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 956c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return kmem_cache_alloc(jbd_handle_cache, gfp_flags); 957c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 958c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 959c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void jbd_free_handle(handle_t *handle) 960c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 961c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru kmem_cache_free(jbd_handle_cache, handle); 962c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 963c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 964c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Primary revoke support */ 965c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JOURNAL_REVOKE_DEFAULT_HASH 256 966c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_init_revoke(journal_t *, int); 967c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_destroy_revoke_caches(void); 968c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_init_revoke_caches(void); 969c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 970c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_destroy_revoke(journal_t *); 971c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_revoke (handle_t *, 972c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long, struct buffer_head *); 973c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_cancel_revoke(handle_t *, struct journal_head *); 974c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_write_revoke_records(journal_t *, transaction_t *); 975c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 976c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Recovery revoke support */ 977c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_set_revoke(journal_t *, unsigned long, tid_t); 978c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_test_revoke(journal_t *, unsigned long, tid_t); 979c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_clear_revoke(journal_t *); 980c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_brelse_array(struct buffer_head *b[], int n); 981c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void journal_switch_revoke_table(journal_t *journal); 982c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 983c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 984c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The log thread user interface: 985c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 986c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Request space in the current transaction, and force transaction commit 987c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * transitions on demand. 988c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 989c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 990c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint __log_space_left(journal_t *); /* Called with journal locked */ 991c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint log_start_commit(journal_t *journal, tid_t tid); 992c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint __log_start_commit(journal_t *journal, tid_t tid); 993c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint journal_start_commit(journal_t *journal, tid_t *tid); 994c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint journal_force_commit_nested(journal_t *journal); 995c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint log_wait_commit(journal_t *journal, tid_t tid); 996c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint log_do_checkpoint(journal_t *journal); 997c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 998c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid __log_wait_for_space(journal_t *journal); 999c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __journal_drop_transaction(journal_t *, transaction_t *); 1000c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int cleanup_journal_tail(journal_t *); 1001c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1002c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Debugging code only: */ 1003c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1004c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define jbd_ENOSYS() \ 1005c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 1006c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru printk (KERN_ERR "JBD unimplemented function %s\n", __FUNCTION__); \ 1007c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru current->state = TASK_UNINTERRUPTIBLE; \ 1008c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru schedule(); \ 1009c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (1) 1010c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1011c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 1012c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is_journal_abort 1013c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 1014c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Simple test wrapper function to test the JFS_ABORT state flag. This 1015c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bit, when set, indicates that we have had a fatal error somewhere, 1016c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * either inside the journaling layer or indicated to us by the client 1017c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (eg. ext3), and that we and should not commit any further 1018c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * transactions. 1019c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 1020c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1021c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int is_journal_aborted(journal_t *journal) 1022c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1023c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return journal->j_flags & JFS_ABORT; 1024c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1025c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1026c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int is_handle_aborted(handle_t *handle) 1027c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1028c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (handle->h_aborted) 1029c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 1030c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return is_journal_aborted(handle->h_transaction->t_journal); 1031c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1032c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1033c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void journal_abort_handle(handle_t *handle) 1034c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1035c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru handle->h_aborted = 1; 1036c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1037c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1038c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */ 1039c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1040c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Comparison functions for transaction IDs: perform comparisons using 1041c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * modulo arithmetic so that they work over sequence number wraps. */ 1042c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1043c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int tid_gt(tid_t x, tid_t y) 1044c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1045c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int difference = (x - y); 1046c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (difference > 0); 1047c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1048c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1049c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int tid_geq(tid_t x, tid_t y) 1050c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1051c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int difference = (x - y); 1052c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (difference >= 0); 1053c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1054c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1055c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int journal_blocks_per_page(struct inode *inode); 1056c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1057c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 1058c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Return the minimum number of blocks which must be free in the journal 1059c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * before a new transaction may be started. Must be called under j_state_lock. 1060c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 1061c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int jbd_space_needed(journal_t *journal) 1062c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1063c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int nblocks = journal->j_max_transaction_buffers; 1064c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (journal->j_committing_transaction) 1065c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru nblocks += journal->j_committing_transaction-> 1066c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru t_outstanding_credits; 1067c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return nblocks; 1068c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1069c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1070c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 1071c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Definitions which augment the buffer_head layer 1072c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 1073c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1074c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* journaling buffer types */ 1075c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BJ_None 0 /* Not journaled */ 1076c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BJ_SyncData 1 /* Normal data: flush before commit */ 1077c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BJ_Metadata 2 /* Normal journaled metadata */ 1078c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BJ_Forget 3 /* Buffer superseded by this transaction */ 1079c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BJ_IO 4 /* Buffer is for temporary IO use */ 1080c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BJ_Shadow 5 /* Buffer contents being shadowed to the log */ 1081c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BJ_LogCtl 6 /* Buffer contains log descriptors */ 1082c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BJ_Reserved 7 /* Buffer is reserved for access by journal */ 1083c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BJ_Locked 8 /* Locked for I/O during commit */ 1084c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BJ_Types 9 1085c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1086c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int jbd_blocks_per_page(struct inode *inode); 1087c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1088c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 1089c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1090c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define buffer_trace_init(bh) do {} while (0) 1091c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define print_buffer_fields(bh) do {} while (0) 1092c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define print_buffer_trace(bh) do {} while (0) 1093c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BUFFER_TRACE(bh, info) do {} while (0) 1094c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BUFFER_TRACE2(bh, bh2, info) do {} while (0) 1095c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define JBUFFER_TRACE(jh, info) do {} while (0) 1096c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1097c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */ 1098c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1099c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _LINUX_JBD_H */ 1100