linux/fs/jfs/jfs_txnmgr.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 *   Copyright (C) International Business Machines Corp., 2000-2004
   4 */
   5#ifndef _H_JFS_TXNMGR
   6#define _H_JFS_TXNMGR
   7
   8#include "jfs_logmgr.h"
   9
  10/*
  11 * Hide implementation of TxBlock and TxLock
  12 */
  13#define tid_to_tblock(tid) (&TxBlock[tid])
  14
  15#define lid_to_tlock(lid) (&TxLock[lid])
  16
  17/*
  18 *      transaction block
  19 */
  20struct tblock {
  21        /*
  22         * tblock and jbuf_t common area: struct logsyncblk
  23         *
  24         * the following 5 fields are the same as struct logsyncblk
  25         * which is common to tblock and jbuf to form logsynclist
  26         */
  27        u16 xflag;              /* tx commit type */
  28        u16 flag;               /* tx commit state */
  29        lid_t dummy;            /* Must keep structures common */
  30        s32 lsn;                /* recovery lsn */
  31        struct list_head synclist;      /* logsynclist link */
  32
  33        /* lock management */
  34        struct super_block *sb; /* super block */
  35        lid_t next;             /* index of first tlock of tid */
  36        lid_t last;             /* index of last tlock of tid */
  37        wait_queue_head_t waitor;       /* tids waiting on this tid */
  38
  39        /* log management */
  40        u32 logtid;             /* log transaction id */
  41
  42        /* commit management */
  43        struct list_head cqueue;        /* commit queue list */
  44        s32 clsn;               /* commit lsn */
  45        struct lbuf *bp;
  46        s32 pn;                 /* commit record log page number */
  47        s32 eor;                /* commit record eor */
  48        wait_queue_head_t gcwait;       /* group commit event list:
  49                                         * ready transactions wait on this
  50                                         * event for group commit completion.
  51                                         */
  52        union {
  53                struct inode *ip; /* inode being deleted */
  54                pxd_t ixpxd;    /* pxd of inode extent for created inode */
  55        } u;
  56        u32 ino;                /* inode number being created */
  57};
  58
  59extern struct tblock *TxBlock;  /* transaction block table */
  60
  61/* commit flags: tblk->xflag */
  62#define COMMIT_SYNC     0x0001  /* synchronous commit */
  63#define COMMIT_FORCE    0x0002  /* force pageout at end of commit */
  64#define COMMIT_FLUSH    0x0004  /* init flush at end of commit */
  65#define COMMIT_MAP      0x00f0
  66#define COMMIT_PMAP     0x0010  /* update pmap */
  67#define COMMIT_WMAP     0x0020  /* update wmap */
  68#define COMMIT_PWMAP    0x0040  /* update pwmap */
  69#define COMMIT_FREE     0x0f00
  70#define COMMIT_DELETE   0x0100  /* inode delete */
  71#define COMMIT_TRUNCATE 0x0200  /* file truncation */
  72#define COMMIT_CREATE   0x0400  /* inode create */
  73#define COMMIT_LAZY     0x0800  /* lazy commit */
  74#define COMMIT_PAGE     0x1000  /* Identifies element as metapage */
  75#define COMMIT_INODE    0x2000  /* Identifies element as inode */
  76
  77/* group commit flags tblk->flag: see jfs_logmgr.h */
  78
  79/*
  80 *      transaction lock
  81 */
  82struct tlock {
  83        lid_t next;             /* 2: index next lockword on tid locklist
  84                                 *          next lockword on freelist
  85                                 */
  86        tid_t tid;              /* 2: transaction id holding lock */
  87
  88        u16 flag;               /* 2: lock control */
  89        u16 type;               /* 2: log type */
  90
  91        struct metapage *mp;    /* 4/8: object page buffer locked */
  92        struct inode *ip;       /* 4/8: object */
  93        /* (16) */
  94
  95        s16 lock[24];           /* 48: overlay area */
  96};                              /* (64) */
  97
  98extern struct tlock *TxLock;    /* transaction lock table */
  99
 100/*
 101 * tlock flag
 102 */
 103/* txLock state */
 104#define tlckPAGELOCK            0x8000
 105#define tlckINODELOCK           0x4000
 106#define tlckLINELOCK            0x2000
 107#define tlckINLINELOCK          0x1000
 108/* lmLog state */
 109#define tlckLOG                 0x0800
 110/* updateMap state */
 111#define tlckUPDATEMAP           0x0080
 112#define tlckDIRECTORY           0x0040
 113/* freeLock state */
 114#define tlckFREELOCK            0x0008
 115#define tlckWRITEPAGE           0x0004
 116#define tlckFREEPAGE            0x0002
 117
 118/*
 119 * tlock type
 120 */
 121#define tlckTYPE                0xfe00
 122#define tlckINODE               0x8000
 123#define tlckXTREE               0x4000
 124#define tlckDTREE               0x2000
 125#define tlckMAP                 0x1000
 126#define tlckEA                  0x0800
 127#define tlckACL                 0x0400
 128#define tlckDATA                0x0200
 129#define tlckBTROOT              0x0100
 130
 131#define tlckOPERATION           0x00ff
 132#define tlckGROW                0x0001  /* file grow */
 133#define tlckREMOVE              0x0002  /* file delete */
 134#define tlckTRUNCATE            0x0004  /* file truncate */
 135#define tlckRELOCATE            0x0008  /* file/directory relocate */
 136#define tlckENTRY               0x0001  /* directory insert/delete */
 137#define tlckEXTEND              0x0002  /* directory extend in-line */
 138#define tlckSPLIT               0x0010  /* splited page */
 139#define tlckNEW                 0x0020  /* new page from split */
 140#define tlckFREE                0x0040  /* free page */
 141#define tlckRELINK              0x0080  /* update sibling pointer */
 142
 143/*
 144 *      linelock for lmLog()
 145 *
 146 * note: linelock and its variations are overlaid
 147 * at tlock.lock: watch for alignment;
 148 */
 149struct lv {
 150        u8 offset;              /* 1: */
 151        u8 length;              /* 1: */
 152};                              /* (2) */
 153
 154#define TLOCKSHORT      20
 155#define TLOCKLONG       28
 156
 157struct linelock {
 158        lid_t next;             /* 2: next linelock */
 159
 160        s8 maxcnt;              /* 1: */
 161        s8 index;               /* 1: */
 162
 163        u16 flag;               /* 2: */
 164        u8 type;                /* 1: */
 165        u8 l2linesize;          /* 1: log2 of linesize */
 166        /* (8) */
 167
 168        struct lv lv[20];       /* 40: */
 169};                              /* (48) */
 170
 171#define dt_lock linelock
 172
 173struct xtlock {
 174        lid_t next;             /* 2: */
 175
 176        s8 maxcnt;              /* 1: */
 177        s8 index;               /* 1: */
 178
 179        u16 flag;               /* 2: */
 180        u8 type;                /* 1: */
 181        u8 l2linesize;          /* 1: log2 of linesize */
 182                                /* (8) */
 183
 184        struct lv header;       /* 2: */
 185        struct lv lwm;          /* 2: low water mark */
 186        struct lv hwm;          /* 2: high water mark */
 187        struct lv twm;          /* 2: */
 188                                /* (16) */
 189
 190        s32 pxdlock[8];         /* 32: */
 191};                              /* (48) */
 192
 193
 194/*
 195 *      maplock for txUpdateMap()
 196 *
 197 * note: maplock and its variations are overlaid
 198 * at tlock.lock/linelock: watch for alignment;
 199 * N.B. next field may be set by linelock, and should not
 200 * be modified by maplock;
 201 * N.B. index of the first pxdlock specifies index of next
 202 * free maplock (i.e., number of maplock) in the tlock;
 203 */
 204struct maplock {
 205        lid_t next;             /* 2: */
 206
 207        u8 maxcnt;              /* 2: */
 208        u8 index;               /* 2: next free maplock index */
 209
 210        u16 flag;               /* 2: */
 211        u8 type;                /* 1: */
 212        u8 count;               /* 1: number of pxd/xad */
 213                                /* (8) */
 214
 215        pxd_t pxd;              /* 8: */
 216};                              /* (16): */
 217
 218/* maplock flag */
 219#define mlckALLOC               0x00f0
 220#define mlckALLOCXADLIST        0x0080
 221#define mlckALLOCPXDLIST        0x0040
 222#define mlckALLOCXAD            0x0020
 223#define mlckALLOCPXD            0x0010
 224#define mlckFREE                0x000f
 225#define mlckFREEXADLIST         0x0008
 226#define mlckFREEPXDLIST         0x0004
 227#define mlckFREEXAD             0x0002
 228#define mlckFREEPXD             0x0001
 229
 230#define pxd_lock        maplock
 231
 232struct xdlistlock {
 233        lid_t next;             /* 2: */
 234
 235        u8 maxcnt;              /* 2: */
 236        u8 index;               /* 2: */
 237
 238        u16 flag;               /* 2: */
 239        u8 type;                /* 1: */
 240        u8 count;               /* 1: number of pxd/xad */
 241                                /* (8) */
 242
 243        /*
 244         * We need xdlist to be 64 bits (8 bytes), regardless of
 245         * whether void * is 32 or 64 bits
 246         */
 247        union {
 248                void *_xdlist;  /* pxd/xad list */
 249                s64 pad;        /* 8: Force 64-bit xdlist size */
 250        } union64;
 251};                              /* (16): */
 252
 253#define xdlist union64._xdlist
 254
 255/*
 256 *      commit
 257 *
 258 * parameter to the commit manager routines
 259 */
 260struct commit {
 261        tid_t tid;              /* tid = index of tblock */
 262        int flag;               /* flags */
 263        struct jfs_log *log;    /* log */
 264        struct super_block *sb; /* superblock */
 265
 266        int nip;                /* number of entries in iplist */
 267        struct inode **iplist;  /* list of pointers to inodes */
 268
 269        /* log record descriptor on 64-bit boundary */
 270        struct lrd lrd;         /* : log record descriptor */
 271};
 272
 273/*
 274 * external declarations
 275 */
 276extern int jfs_tlocks_low;
 277
 278extern int txInit(void);
 279extern void txExit(void);
 280extern struct tlock *txLock(tid_t, struct inode *, struct metapage *, int);
 281extern struct tlock *txMaplock(tid_t, struct inode *, int);
 282extern int txCommit(tid_t, int, struct inode **, int);
 283extern tid_t txBegin(struct super_block *, int);
 284extern void txBeginAnon(struct super_block *);
 285extern void txEnd(tid_t);
 286extern void txAbort(tid_t, int);
 287extern struct linelock *txLinelock(struct linelock *);
 288extern void txFreeMap(struct inode *, struct maplock *, struct tblock *, int);
 289extern void txEA(tid_t, struct inode *, dxd_t *, dxd_t *);
 290extern void txFreelock(struct inode *);
 291extern int lmLog(struct jfs_log *, struct tblock *, struct lrd *,
 292                 struct tlock *);
 293extern void txQuiesce(struct super_block *);
 294extern void txResume(struct super_block *);
 295extern void txLazyUnlock(struct tblock *);
 296extern int jfs_lazycommit(void *);
 297extern int jfs_sync(void *);
 298#endif                          /* _H_JFS_TXNMGR */
 299