1*1a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * Copyright (C) International Business Machines Corp., 2000-2004 41da177e4SLinus Torvalds */ 51da177e4SLinus Torvalds #ifndef _H_JFS_TXNMGR 61da177e4SLinus Torvalds #define _H_JFS_TXNMGR 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds #include "jfs_logmgr.h" 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds /* 111da177e4SLinus Torvalds * Hide implementation of TxBlock and TxLock 121da177e4SLinus Torvalds */ 131da177e4SLinus Torvalds #define tid_to_tblock(tid) (&TxBlock[tid]) 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds #define lid_to_tlock(lid) (&TxLock[lid]) 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds /* 181da177e4SLinus Torvalds * transaction block 191da177e4SLinus Torvalds */ 201da177e4SLinus Torvalds struct tblock { 211da177e4SLinus Torvalds /* 221da177e4SLinus Torvalds * tblock and jbuf_t common area: struct logsyncblk 231da177e4SLinus Torvalds * 241da177e4SLinus Torvalds * the following 5 fields are the same as struct logsyncblk 251da177e4SLinus Torvalds * which is common to tblock and jbuf to form logsynclist 261da177e4SLinus Torvalds */ 271da177e4SLinus Torvalds u16 xflag; /* tx commit type */ 281da177e4SLinus Torvalds u16 flag; /* tx commit state */ 291da177e4SLinus Torvalds lid_t dummy; /* Must keep structures common */ 301da177e4SLinus Torvalds s32 lsn; /* recovery lsn */ 311da177e4SLinus Torvalds struct list_head synclist; /* logsynclist link */ 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds /* lock management */ 341da177e4SLinus Torvalds struct super_block *sb; /* super block */ 351da177e4SLinus Torvalds lid_t next; /* index of first tlock of tid */ 361da177e4SLinus Torvalds lid_t last; /* index of last tlock of tid */ 371da177e4SLinus Torvalds wait_queue_head_t waitor; /* tids waiting on this tid */ 381da177e4SLinus Torvalds 391da177e4SLinus Torvalds /* log management */ 401da177e4SLinus Torvalds u32 logtid; /* log transaction id */ 411da177e4SLinus Torvalds 421da177e4SLinus Torvalds /* commit management */ 431da177e4SLinus Torvalds struct list_head cqueue; /* commit queue list */ 441da177e4SLinus Torvalds s32 clsn; /* commit lsn */ 451da177e4SLinus Torvalds struct lbuf *bp; 461da177e4SLinus Torvalds s32 pn; /* commit record log page number */ 471da177e4SLinus Torvalds s32 eor; /* commit record eor */ 481da177e4SLinus Torvalds wait_queue_head_t gcwait; /* group commit event list: 491da177e4SLinus Torvalds * ready transactions wait on this 501da177e4SLinus Torvalds * event for group commit completion. 511da177e4SLinus Torvalds */ 521da177e4SLinus Torvalds union { 531da177e4SLinus Torvalds struct inode *ip; /* inode being deleted */ 541da177e4SLinus Torvalds pxd_t ixpxd; /* pxd of inode extent for created inode */ 551da177e4SLinus Torvalds } u; 561da177e4SLinus Torvalds u32 ino; /* inode number being created */ 571da177e4SLinus Torvalds }; 581da177e4SLinus Torvalds 591da177e4SLinus Torvalds extern struct tblock *TxBlock; /* transaction block table */ 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds /* commit flags: tblk->xflag */ 621da177e4SLinus Torvalds #define COMMIT_SYNC 0x0001 /* synchronous commit */ 631da177e4SLinus Torvalds #define COMMIT_FORCE 0x0002 /* force pageout at end of commit */ 641da177e4SLinus Torvalds #define COMMIT_FLUSH 0x0004 /* init flush at end of commit */ 651da177e4SLinus Torvalds #define COMMIT_MAP 0x00f0 661da177e4SLinus Torvalds #define COMMIT_PMAP 0x0010 /* update pmap */ 671da177e4SLinus Torvalds #define COMMIT_WMAP 0x0020 /* update wmap */ 681da177e4SLinus Torvalds #define COMMIT_PWMAP 0x0040 /* update pwmap */ 691da177e4SLinus Torvalds #define COMMIT_FREE 0x0f00 701da177e4SLinus Torvalds #define COMMIT_DELETE 0x0100 /* inode delete */ 711da177e4SLinus Torvalds #define COMMIT_TRUNCATE 0x0200 /* file truncation */ 721da177e4SLinus Torvalds #define COMMIT_CREATE 0x0400 /* inode create */ 731da177e4SLinus Torvalds #define COMMIT_LAZY 0x0800 /* lazy commit */ 741da177e4SLinus Torvalds #define COMMIT_PAGE 0x1000 /* Identifies element as metapage */ 751da177e4SLinus Torvalds #define COMMIT_INODE 0x2000 /* Identifies element as inode */ 761da177e4SLinus Torvalds 771da177e4SLinus Torvalds /* group commit flags tblk->flag: see jfs_logmgr.h */ 781da177e4SLinus Torvalds 791da177e4SLinus Torvalds /* 801da177e4SLinus Torvalds * transaction lock 811da177e4SLinus Torvalds */ 821da177e4SLinus Torvalds struct tlock { 831da177e4SLinus Torvalds lid_t next; /* 2: index next lockword on tid locklist 841da177e4SLinus Torvalds * next lockword on freelist 851da177e4SLinus Torvalds */ 861da177e4SLinus Torvalds tid_t tid; /* 2: transaction id holding lock */ 871da177e4SLinus Torvalds 881da177e4SLinus Torvalds u16 flag; /* 2: lock control */ 891da177e4SLinus Torvalds u16 type; /* 2: log type */ 901da177e4SLinus Torvalds 911da177e4SLinus Torvalds struct metapage *mp; /* 4/8: object page buffer locked */ 921da177e4SLinus Torvalds struct inode *ip; /* 4/8: object */ 931da177e4SLinus Torvalds /* (16) */ 941da177e4SLinus Torvalds 951da177e4SLinus Torvalds s16 lock[24]; /* 48: overlay area */ 961da177e4SLinus Torvalds }; /* (64) */ 971da177e4SLinus Torvalds 981da177e4SLinus Torvalds extern struct tlock *TxLock; /* transaction lock table */ 991da177e4SLinus Torvalds 1001da177e4SLinus Torvalds /* 1011da177e4SLinus Torvalds * tlock flag 1021da177e4SLinus Torvalds */ 1031da177e4SLinus Torvalds /* txLock state */ 1041da177e4SLinus Torvalds #define tlckPAGELOCK 0x8000 1051da177e4SLinus Torvalds #define tlckINODELOCK 0x4000 1061da177e4SLinus Torvalds #define tlckLINELOCK 0x2000 1071da177e4SLinus Torvalds #define tlckINLINELOCK 0x1000 1081da177e4SLinus Torvalds /* lmLog state */ 1091da177e4SLinus Torvalds #define tlckLOG 0x0800 1101da177e4SLinus Torvalds /* updateMap state */ 1111da177e4SLinus Torvalds #define tlckUPDATEMAP 0x0080 112438282d8SDave Kleikamp #define tlckDIRECTORY 0x0040 1131da177e4SLinus Torvalds /* freeLock state */ 1141da177e4SLinus Torvalds #define tlckFREELOCK 0x0008 1151da177e4SLinus Torvalds #define tlckWRITEPAGE 0x0004 1161da177e4SLinus Torvalds #define tlckFREEPAGE 0x0002 1171da177e4SLinus Torvalds 1181da177e4SLinus Torvalds /* 1191da177e4SLinus Torvalds * tlock type 1201da177e4SLinus Torvalds */ 1211da177e4SLinus Torvalds #define tlckTYPE 0xfe00 1221da177e4SLinus Torvalds #define tlckINODE 0x8000 1231da177e4SLinus Torvalds #define tlckXTREE 0x4000 1241da177e4SLinus Torvalds #define tlckDTREE 0x2000 1251da177e4SLinus Torvalds #define tlckMAP 0x1000 1261da177e4SLinus Torvalds #define tlckEA 0x0800 1271da177e4SLinus Torvalds #define tlckACL 0x0400 1281da177e4SLinus Torvalds #define tlckDATA 0x0200 1291da177e4SLinus Torvalds #define tlckBTROOT 0x0100 1301da177e4SLinus Torvalds 1311da177e4SLinus Torvalds #define tlckOPERATION 0x00ff 1321da177e4SLinus Torvalds #define tlckGROW 0x0001 /* file grow */ 1331da177e4SLinus Torvalds #define tlckREMOVE 0x0002 /* file delete */ 1341da177e4SLinus Torvalds #define tlckTRUNCATE 0x0004 /* file truncate */ 1351da177e4SLinus Torvalds #define tlckRELOCATE 0x0008 /* file/directory relocate */ 1361da177e4SLinus Torvalds #define tlckENTRY 0x0001 /* directory insert/delete */ 1371da177e4SLinus Torvalds #define tlckEXTEND 0x0002 /* directory extend in-line */ 1381da177e4SLinus Torvalds #define tlckSPLIT 0x0010 /* splited page */ 1391da177e4SLinus Torvalds #define tlckNEW 0x0020 /* new page from split */ 1401da177e4SLinus Torvalds #define tlckFREE 0x0040 /* free page */ 1411da177e4SLinus Torvalds #define tlckRELINK 0x0080 /* update sibling pointer */ 1421da177e4SLinus Torvalds 1431da177e4SLinus Torvalds /* 1441da177e4SLinus Torvalds * linelock for lmLog() 1451da177e4SLinus Torvalds * 1461da177e4SLinus Torvalds * note: linelock and its variations are overlaid 1471da177e4SLinus Torvalds * at tlock.lock: watch for alignment; 1481da177e4SLinus Torvalds */ 1491da177e4SLinus Torvalds struct lv { 1501da177e4SLinus Torvalds u8 offset; /* 1: */ 1511da177e4SLinus Torvalds u8 length; /* 1: */ 1521da177e4SLinus Torvalds }; /* (2) */ 1531da177e4SLinus Torvalds 1541da177e4SLinus Torvalds #define TLOCKSHORT 20 1551da177e4SLinus Torvalds #define TLOCKLONG 28 1561da177e4SLinus Torvalds 1571da177e4SLinus Torvalds struct linelock { 1581da177e4SLinus Torvalds lid_t next; /* 2: next linelock */ 1591da177e4SLinus Torvalds 1601da177e4SLinus Torvalds s8 maxcnt; /* 1: */ 1611da177e4SLinus Torvalds s8 index; /* 1: */ 1621da177e4SLinus Torvalds 1631da177e4SLinus Torvalds u16 flag; /* 2: */ 1641da177e4SLinus Torvalds u8 type; /* 1: */ 1651da177e4SLinus Torvalds u8 l2linesize; /* 1: log2 of linesize */ 1661da177e4SLinus Torvalds /* (8) */ 1671da177e4SLinus Torvalds 1681da177e4SLinus Torvalds struct lv lv[20]; /* 40: */ 1691da177e4SLinus Torvalds }; /* (48) */ 1701da177e4SLinus Torvalds 1711da177e4SLinus Torvalds #define dt_lock linelock 1721da177e4SLinus Torvalds 1731da177e4SLinus Torvalds struct xtlock { 1741da177e4SLinus Torvalds lid_t next; /* 2: */ 1751da177e4SLinus Torvalds 1761da177e4SLinus Torvalds s8 maxcnt; /* 1: */ 1771da177e4SLinus Torvalds s8 index; /* 1: */ 1781da177e4SLinus Torvalds 1791da177e4SLinus Torvalds u16 flag; /* 2: */ 1801da177e4SLinus Torvalds u8 type; /* 1: */ 1811da177e4SLinus Torvalds u8 l2linesize; /* 1: log2 of linesize */ 1821da177e4SLinus Torvalds /* (8) */ 1831da177e4SLinus Torvalds 1841da177e4SLinus Torvalds struct lv header; /* 2: */ 1851da177e4SLinus Torvalds struct lv lwm; /* 2: low water mark */ 1861da177e4SLinus Torvalds struct lv hwm; /* 2: high water mark */ 1871da177e4SLinus Torvalds struct lv twm; /* 2: */ 1881da177e4SLinus Torvalds /* (16) */ 1891da177e4SLinus Torvalds 1901da177e4SLinus Torvalds s32 pxdlock[8]; /* 32: */ 1911da177e4SLinus Torvalds }; /* (48) */ 1921da177e4SLinus Torvalds 1931da177e4SLinus Torvalds 1941da177e4SLinus Torvalds /* 1951da177e4SLinus Torvalds * maplock for txUpdateMap() 1961da177e4SLinus Torvalds * 1971da177e4SLinus Torvalds * note: maplock and its variations are overlaid 1981da177e4SLinus Torvalds * at tlock.lock/linelock: watch for alignment; 1991da177e4SLinus Torvalds * N.B. next field may be set by linelock, and should not 2001da177e4SLinus Torvalds * be modified by maplock; 2011da177e4SLinus Torvalds * N.B. index of the first pxdlock specifies index of next 2021da177e4SLinus Torvalds * free maplock (i.e., number of maplock) in the tlock; 2031da177e4SLinus Torvalds */ 2041da177e4SLinus Torvalds struct maplock { 2051da177e4SLinus Torvalds lid_t next; /* 2: */ 2061da177e4SLinus Torvalds 2071da177e4SLinus Torvalds u8 maxcnt; /* 2: */ 2081da177e4SLinus Torvalds u8 index; /* 2: next free maplock index */ 2091da177e4SLinus Torvalds 2101da177e4SLinus Torvalds u16 flag; /* 2: */ 2111da177e4SLinus Torvalds u8 type; /* 1: */ 2121da177e4SLinus Torvalds u8 count; /* 1: number of pxd/xad */ 2131da177e4SLinus Torvalds /* (8) */ 2141da177e4SLinus Torvalds 2151da177e4SLinus Torvalds pxd_t pxd; /* 8: */ 2161da177e4SLinus Torvalds }; /* (16): */ 2171da177e4SLinus Torvalds 2181da177e4SLinus Torvalds /* maplock flag */ 2191da177e4SLinus Torvalds #define mlckALLOC 0x00f0 2201da177e4SLinus Torvalds #define mlckALLOCXADLIST 0x0080 2211da177e4SLinus Torvalds #define mlckALLOCPXDLIST 0x0040 2221da177e4SLinus Torvalds #define mlckALLOCXAD 0x0020 2231da177e4SLinus Torvalds #define mlckALLOCPXD 0x0010 2241da177e4SLinus Torvalds #define mlckFREE 0x000f 2251da177e4SLinus Torvalds #define mlckFREEXADLIST 0x0008 2261da177e4SLinus Torvalds #define mlckFREEPXDLIST 0x0004 2271da177e4SLinus Torvalds #define mlckFREEXAD 0x0002 2281da177e4SLinus Torvalds #define mlckFREEPXD 0x0001 2291da177e4SLinus Torvalds 2301da177e4SLinus Torvalds #define pxd_lock maplock 2311da177e4SLinus Torvalds 2321da177e4SLinus Torvalds struct xdlistlock { 2331da177e4SLinus Torvalds lid_t next; /* 2: */ 2341da177e4SLinus Torvalds 2351da177e4SLinus Torvalds u8 maxcnt; /* 2: */ 2361da177e4SLinus Torvalds u8 index; /* 2: */ 2371da177e4SLinus Torvalds 2381da177e4SLinus Torvalds u16 flag; /* 2: */ 2391da177e4SLinus Torvalds u8 type; /* 1: */ 2401da177e4SLinus Torvalds u8 count; /* 1: number of pxd/xad */ 2411da177e4SLinus Torvalds /* (8) */ 2421da177e4SLinus Torvalds 2431da177e4SLinus Torvalds /* 2441da177e4SLinus Torvalds * We need xdlist to be 64 bits (8 bytes), regardless of 2451da177e4SLinus Torvalds * whether void * is 32 or 64 bits 2461da177e4SLinus Torvalds */ 2471da177e4SLinus Torvalds union { 2481da177e4SLinus Torvalds void *_xdlist; /* pxd/xad list */ 2491da177e4SLinus Torvalds s64 pad; /* 8: Force 64-bit xdlist size */ 2501da177e4SLinus Torvalds } union64; 2511da177e4SLinus Torvalds }; /* (16): */ 2521da177e4SLinus Torvalds 2531da177e4SLinus Torvalds #define xdlist union64._xdlist 2541da177e4SLinus Torvalds 2551da177e4SLinus Torvalds /* 2561da177e4SLinus Torvalds * commit 2571da177e4SLinus Torvalds * 2581da177e4SLinus Torvalds * parameter to the commit manager routines 2591da177e4SLinus Torvalds */ 2601da177e4SLinus Torvalds struct commit { 2611da177e4SLinus Torvalds tid_t tid; /* tid = index of tblock */ 2621da177e4SLinus Torvalds int flag; /* flags */ 2631da177e4SLinus Torvalds struct jfs_log *log; /* log */ 2641da177e4SLinus Torvalds struct super_block *sb; /* superblock */ 2651da177e4SLinus Torvalds 2661da177e4SLinus Torvalds int nip; /* number of entries in iplist */ 2671da177e4SLinus Torvalds struct inode **iplist; /* list of pointers to inodes */ 2681da177e4SLinus Torvalds 2691da177e4SLinus Torvalds /* log record descriptor on 64-bit boundary */ 2701da177e4SLinus Torvalds struct lrd lrd; /* : log record descriptor */ 2711da177e4SLinus Torvalds }; 2721da177e4SLinus Torvalds 2731da177e4SLinus Torvalds /* 2741da177e4SLinus Torvalds * external declarations 2751da177e4SLinus Torvalds */ 2761868f4aaSDave Kleikamp extern int jfs_tlocks_low; 2771da177e4SLinus Torvalds 2781868f4aaSDave Kleikamp extern int txInit(void); 2791868f4aaSDave Kleikamp extern void txExit(void); 2801868f4aaSDave Kleikamp extern struct tlock *txLock(tid_t, struct inode *, struct metapage *, int); 2811868f4aaSDave Kleikamp extern struct tlock *txMaplock(tid_t, struct inode *, int); 2821868f4aaSDave Kleikamp extern int txCommit(tid_t, int, struct inode **, int); 2831868f4aaSDave Kleikamp extern tid_t txBegin(struct super_block *, int); 2841868f4aaSDave Kleikamp extern void txBeginAnon(struct super_block *); 2851868f4aaSDave Kleikamp extern void txEnd(tid_t); 2861868f4aaSDave Kleikamp extern void txAbort(tid_t, int); 2871868f4aaSDave Kleikamp extern struct linelock *txLinelock(struct linelock *); 2881868f4aaSDave Kleikamp extern void txFreeMap(struct inode *, struct maplock *, struct tblock *, int); 2891868f4aaSDave Kleikamp extern void txEA(tid_t, struct inode *, dxd_t *, dxd_t *); 2901868f4aaSDave Kleikamp extern void txFreelock(struct inode *); 2911868f4aaSDave Kleikamp extern int lmLog(struct jfs_log *, struct tblock *, struct lrd *, 2921868f4aaSDave Kleikamp struct tlock *); 2931868f4aaSDave Kleikamp extern void txQuiesce(struct super_block *); 2941868f4aaSDave Kleikamp extern void txResume(struct super_block *); 2951868f4aaSDave Kleikamp extern void txLazyUnlock(struct tblock *); 2961868f4aaSDave Kleikamp extern int jfs_lazycommit(void *); 2971868f4aaSDave Kleikamp extern int jfs_sync(void *); 2981da177e4SLinus Torvalds #endif /* _H_JFS_TXNMGR */ 299