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