xref: /openbmc/linux/fs/jfs/jfs_logmgr.h (revision 1760371b277718062211fc7eb6f3042c5051c1a5)
11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  *   Copyright (C) International Business Machines Corp., 2000-2004
41da177e4SLinus Torvalds  *   Portions Copyright (C) Christoph Hellwig, 2001-2002
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds #ifndef	_H_JFS_LOGMGR
71da177e4SLinus Torvalds #define _H_JFS_LOGMGR
81da177e4SLinus Torvalds 
92e3bc612SAndy Shevchenko #include <linux/uuid.h>
102e3bc612SAndy Shevchenko 
111da177e4SLinus Torvalds #include "jfs_filsys.h"
121da177e4SLinus Torvalds #include "jfs_lock.h"
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds /*
151da177e4SLinus Torvalds  *	log manager configuration parameters
161da177e4SLinus Torvalds  */
171da177e4SLinus Torvalds 
181da177e4SLinus Torvalds /* log page size */
191da177e4SLinus Torvalds #define	LOGPSIZE	4096
201da177e4SLinus Torvalds #define	L2LOGPSIZE	12
211da177e4SLinus Torvalds 
221da177e4SLinus Torvalds #define LOGPAGES	16	/* Log pages per mounted file system */
231da177e4SLinus Torvalds 
241da177e4SLinus Torvalds /*
251da177e4SLinus Torvalds  *	log logical volume
261da177e4SLinus Torvalds  *
271da177e4SLinus Torvalds  * a log is used to make the commit operation on journalled
281da177e4SLinus Torvalds  * files within the same logical volume group atomic.
291da177e4SLinus Torvalds  * a log is implemented with a logical volume.
301da177e4SLinus Torvalds  * there is one log per logical volume group.
311da177e4SLinus Torvalds  *
321da177e4SLinus Torvalds  * block 0 of the log logical volume is not used (ipl etc).
331da177e4SLinus Torvalds  * block 1 contains a log "superblock" and is used by logFormat(),
341da177e4SLinus Torvalds  * lmLogInit(), lmLogShutdown(), and logRedo() to record status
351da177e4SLinus Torvalds  * of the log but is not otherwise used during normal processing.
361da177e4SLinus Torvalds  * blocks 2 - (N-1) are used to contain log records.
371da177e4SLinus Torvalds  *
381da177e4SLinus Torvalds  * when a volume group is varied-on-line, logRedo() must have
391da177e4SLinus Torvalds  * been executed before the file systems (logical volumes) in
401da177e4SLinus Torvalds  * the volume group can be mounted.
411da177e4SLinus Torvalds  */
421da177e4SLinus Torvalds /*
431da177e4SLinus Torvalds  *	log superblock (block 1 of logical volume)
441da177e4SLinus Torvalds  */
451da177e4SLinus Torvalds #define	LOGSUPER_B	1
461da177e4SLinus Torvalds #define	LOGSTART_B	2
471da177e4SLinus Torvalds 
481da177e4SLinus Torvalds #define	LOGMAGIC	0x87654321
491da177e4SLinus Torvalds #define	LOGVERSION	1
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds #define MAX_ACTIVE	128	/* Max active file systems sharing log */
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds struct logsuper {
541da177e4SLinus Torvalds 	__le32 magic;		/* 4: log lv identifier */
551da177e4SLinus Torvalds 	__le32 version;		/* 4: version number */
561da177e4SLinus Torvalds 	__le32 serial;		/* 4: log open/mount counter */
571da177e4SLinus Torvalds 	__le32 size;		/* 4: size in number of LOGPSIZE blocks */
581da177e4SLinus Torvalds 	__le32 bsize;		/* 4: logical block size in byte */
591da177e4SLinus Torvalds 	__le32 l2bsize;		/* 4: log2 of bsize */
601da177e4SLinus Torvalds 
611da177e4SLinus Torvalds 	__le32 flag;		/* 4: option */
621da177e4SLinus Torvalds 	__le32 state;		/* 4: state - see below */
631da177e4SLinus Torvalds 
641da177e4SLinus Torvalds 	__le32 end;		/* 4: addr of last log record set by logredo */
652e3bc612SAndy Shevchenko 	uuid_t uuid;		/* 16: 128-bit journal uuid */
661da177e4SLinus Torvalds 	char label[16];		/* 16: journal label */
671da177e4SLinus Torvalds 	struct {
682e3bc612SAndy Shevchenko 		uuid_t uuid;
691da177e4SLinus Torvalds 	} active[MAX_ACTIVE];	/* 2048: active file systems list */
701da177e4SLinus Torvalds };
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds /* log flag: commit option (see jfs_filsys.h) */
731da177e4SLinus Torvalds 
741da177e4SLinus Torvalds /* log state */
751da177e4SLinus Torvalds #define	LOGMOUNT	0	/* log mounted by lmLogInit() */
761da177e4SLinus Torvalds #define LOGREDONE	1	/* log shutdown by lmLogShutdown().
771da177e4SLinus Torvalds 				 * log redo completed by logredo().
781da177e4SLinus Torvalds 				 */
791da177e4SLinus Torvalds #define LOGWRAP		2	/* log wrapped */
801da177e4SLinus Torvalds #define LOGREADERR	3	/* log read error detected in logredo() */
811da177e4SLinus Torvalds 
821da177e4SLinus Torvalds 
831da177e4SLinus Torvalds /*
841da177e4SLinus Torvalds  *	log logical page
851da177e4SLinus Torvalds  *
861da177e4SLinus Torvalds  * (this comment should be rewritten !)
871da177e4SLinus Torvalds  * the header and trailer structures (h,t) will normally have
881da177e4SLinus Torvalds  * the same page and eor value.
891da177e4SLinus Torvalds  * An exception to this occurs when a complete page write is not
901da177e4SLinus Torvalds  * accomplished on a power failure. Since the hardware may "split write"
911da177e4SLinus Torvalds  * sectors in the page, any out of order sequence may occur during powerfail
921da177e4SLinus Torvalds  * and needs to be recognized during log replay.  The xor value is
931da177e4SLinus Torvalds  * an "exclusive or" of all log words in the page up to eor.  This
941da177e4SLinus Torvalds  * 32 bit eor is stored with the top 16 bits in the header and the
951da177e4SLinus Torvalds  * bottom 16 bits in the trailer.  logredo can easily recognize pages
961da177e4SLinus Torvalds  * that were not completed by reconstructing this eor and checking
971da177e4SLinus Torvalds  * the log page.
981da177e4SLinus Torvalds  *
991da177e4SLinus Torvalds  * Previous versions of the operating system did not allow split
1001da177e4SLinus Torvalds  * writes and detected partially written records in logredo by
1011da177e4SLinus Torvalds  * ordering the updates to the header, trailer, and the move of data
1021da177e4SLinus Torvalds  * into the logdata area.  The order: (1) data is moved (2) header
1031da177e4SLinus Torvalds  * is updated (3) trailer is updated.  In logredo, when the header
1041da177e4SLinus Torvalds  * differed from the trailer, the header and trailer were reconciled
1051da177e4SLinus Torvalds  * as follows: if h.page != t.page they were set to the smaller of
1061da177e4SLinus Torvalds  * the two and h.eor and t.eor set to 8 (i.e. empty page). if (only)
1071da177e4SLinus Torvalds  * h.eor != t.eor they were set to the smaller of their two values.
1081da177e4SLinus Torvalds  */
1091da177e4SLinus Torvalds struct logpage {
1101da177e4SLinus Torvalds 	struct {		/* header */
1111da177e4SLinus Torvalds 		__le32 page;	/* 4: log sequence page number */
1121da177e4SLinus Torvalds 		__le16 rsrvd;	/* 2: */
1131da177e4SLinus Torvalds 		__le16 eor;	/* 2: end-of-log offset of lasrt record write */
1141da177e4SLinus Torvalds 	} h;
1151da177e4SLinus Torvalds 
1161da177e4SLinus Torvalds 	__le32 data[LOGPSIZE / 4 - 4];	/* log record area */
1171da177e4SLinus Torvalds 
1181da177e4SLinus Torvalds 	struct {		/* trailer */
1191da177e4SLinus Torvalds 		__le32 page;	/* 4: normally the same as h.page */
1201da177e4SLinus Torvalds 		__le16 rsrvd;	/* 2: */
1211da177e4SLinus Torvalds 		__le16 eor;	/* 2: normally the same as h.eor */
1221da177e4SLinus Torvalds 	} t;
1231da177e4SLinus Torvalds };
1241da177e4SLinus Torvalds 
1251da177e4SLinus Torvalds #define LOGPHDRSIZE	8	/* log page header size */
1261da177e4SLinus Torvalds #define LOGPTLRSIZE	8	/* log page trailer size */
1271da177e4SLinus Torvalds 
1281da177e4SLinus Torvalds 
1291da177e4SLinus Torvalds /*
1301da177e4SLinus Torvalds  *	log record
1311da177e4SLinus Torvalds  *
1321da177e4SLinus Torvalds  * (this comment should be rewritten !)
1331da177e4SLinus Torvalds  * jfs uses only "after" log records (only a single writer is allowed
1341da177e4SLinus Torvalds  * in a page, pages are written to temporary paging space if
135ed1c9a7aSRandy Dunlap  * they must be written to disk before commit, and i/o is
1361da177e4SLinus Torvalds  * scheduled for modified pages to their home location after
1371da177e4SLinus Torvalds  * the log records containing the after values and the commit
1381da177e4SLinus Torvalds  * record is written to the log on disk, undo discards the copy
1391da177e4SLinus Torvalds  * in main-memory.)
1401da177e4SLinus Torvalds  *
1411da177e4SLinus Torvalds  * a log record consists of a data area of variable length followed by
1421da177e4SLinus Torvalds  * a descriptor of fixed size LOGRDSIZE bytes.
1431da177e4SLinus Torvalds  * the data area is rounded up to an integral number of 4-bytes and
1441da177e4SLinus Torvalds  * must be no longer than LOGPSIZE.
1451da177e4SLinus Torvalds  * the descriptor is of size of multiple of 4-bytes and aligned on a
1461da177e4SLinus Torvalds  * 4-byte boundary.
1471da177e4SLinus Torvalds  * records are packed one after the other in the data area of log pages.
1481da177e4SLinus Torvalds  * (sometimes a DUMMY record is inserted so that at least one record ends
1491da177e4SLinus Torvalds  * on every page or the longest record is placed on at most two pages).
1501da177e4SLinus Torvalds  * the field eor in page header/trailer points to the byte following
1511da177e4SLinus Torvalds  * the last record on a page.
1521da177e4SLinus Torvalds  */
1531da177e4SLinus Torvalds 
1541da177e4SLinus Torvalds /* log record types */
1551da177e4SLinus Torvalds #define LOG_COMMIT		0x8000
1561da177e4SLinus Torvalds #define LOG_SYNCPT		0x4000
1571da177e4SLinus Torvalds #define LOG_MOUNT		0x2000
1581da177e4SLinus Torvalds #define LOG_REDOPAGE		0x0800
1591da177e4SLinus Torvalds #define LOG_NOREDOPAGE		0x0080
1601da177e4SLinus Torvalds #define LOG_NOREDOINOEXT	0x0040
1611da177e4SLinus Torvalds #define LOG_UPDATEMAP		0x0008
1621da177e4SLinus Torvalds #define LOG_NOREDOFILE		0x0001
1631da177e4SLinus Torvalds 
1641da177e4SLinus Torvalds /* REDOPAGE/NOREDOPAGE log record data type */
1651da177e4SLinus Torvalds #define	LOG_INODE		0x0001
1661da177e4SLinus Torvalds #define	LOG_XTREE		0x0002
1671da177e4SLinus Torvalds #define	LOG_DTREE		0x0004
1681da177e4SLinus Torvalds #define	LOG_BTROOT		0x0010
1691da177e4SLinus Torvalds #define	LOG_EA			0x0020
1701da177e4SLinus Torvalds #define	LOG_ACL			0x0040
1711da177e4SLinus Torvalds #define	LOG_DATA		0x0080
1721da177e4SLinus Torvalds #define	LOG_NEW			0x0100
1731da177e4SLinus Torvalds #define	LOG_EXTEND		0x0200
1741da177e4SLinus Torvalds #define LOG_RELOCATE		0x0400
1751da177e4SLinus Torvalds #define LOG_DIR_XTREE		0x0800	/* Xtree is in directory inode */
1761da177e4SLinus Torvalds 
1771da177e4SLinus Torvalds /* UPDATEMAP log record descriptor type */
1781da177e4SLinus Torvalds #define	LOG_ALLOCXADLIST	0x0080
1791da177e4SLinus Torvalds #define	LOG_ALLOCPXDLIST	0x0040
1801da177e4SLinus Torvalds #define	LOG_ALLOCXAD		0x0020
1811da177e4SLinus Torvalds #define	LOG_ALLOCPXD		0x0010
1821da177e4SLinus Torvalds #define	LOG_FREEXADLIST		0x0008
1831da177e4SLinus Torvalds #define	LOG_FREEPXDLIST		0x0004
1841da177e4SLinus Torvalds #define	LOG_FREEXAD		0x0002
1851da177e4SLinus Torvalds #define	LOG_FREEPXD		0x0001
1861da177e4SLinus Torvalds 
1871da177e4SLinus Torvalds 
1881da177e4SLinus Torvalds struct lrd {
1891da177e4SLinus Torvalds 	/*
1901da177e4SLinus Torvalds 	 * type independent area
1911da177e4SLinus Torvalds 	 */
1921da177e4SLinus Torvalds 	__le32 logtid;		/* 4: log transaction identifier */
1931da177e4SLinus Torvalds 	__le32 backchain;	/* 4: ptr to prev record of same transaction */
1941da177e4SLinus Torvalds 	__le16 type;		/* 2: record type */
1951da177e4SLinus Torvalds 	__le16 length;		/* 2: length of data in record (in byte) */
1961da177e4SLinus Torvalds 	__le32 aggregate;	/* 4: file system lv/aggregate */
1971da177e4SLinus Torvalds 	/* (16) */
1981da177e4SLinus Torvalds 
1991da177e4SLinus Torvalds 	/*
2001da177e4SLinus Torvalds 	 * type dependent area (20)
2011da177e4SLinus Torvalds 	 */
2021da177e4SLinus Torvalds 	union {
2031da177e4SLinus Torvalds 
2041da177e4SLinus Torvalds 		/*
2051da177e4SLinus Torvalds 		 *	COMMIT: commit
2061da177e4SLinus Torvalds 		 *
2071da177e4SLinus Torvalds 		 * transaction commit: no type-dependent information;
2081da177e4SLinus Torvalds 		 */
2091da177e4SLinus Torvalds 
2101da177e4SLinus Torvalds 		/*
2111da177e4SLinus Torvalds 		 *	REDOPAGE: after-image
2121da177e4SLinus Torvalds 		 *
2131da177e4SLinus Torvalds 		 * apply after-image;
2141da177e4SLinus Torvalds 		 *
2151da177e4SLinus Torvalds 		 * N.B. REDOPAGE, NOREDOPAGE, and UPDATEMAP must be same format;
2161da177e4SLinus Torvalds 		 */
2171da177e4SLinus Torvalds 		struct {
2181da177e4SLinus Torvalds 			__le32 fileset;	/* 4: fileset number */
2191da177e4SLinus Torvalds 			__le32 inode;	/* 4: inode number */
2201da177e4SLinus Torvalds 			__le16 type;	/* 2: REDOPAGE record type */
2211da177e4SLinus Torvalds 			__le16 l2linesize;	/* 2: log2 of line size */
2221da177e4SLinus Torvalds 			pxd_t pxd;	/* 8: on-disk page pxd */
2231da177e4SLinus Torvalds 		} redopage;	/* (20) */
2241da177e4SLinus Torvalds 
2251da177e4SLinus Torvalds 		/*
2261da177e4SLinus Torvalds 		 *	NOREDOPAGE: the page is freed
2271da177e4SLinus Torvalds 		 *
2281da177e4SLinus Torvalds 		 * do not apply after-image records which precede this record
2291da177e4SLinus Torvalds 		 * in the log with the same page block number to this page.
2301da177e4SLinus Torvalds 		 *
2311da177e4SLinus Torvalds 		 * N.B. REDOPAGE, NOREDOPAGE, and UPDATEMAP must be same format;
2321da177e4SLinus Torvalds 		 */
2331da177e4SLinus Torvalds 		struct {
2341da177e4SLinus Torvalds 			__le32 fileset;	/* 4: fileset number */
2351da177e4SLinus Torvalds 			__le32 inode;	/* 4: inode number */
2361da177e4SLinus Torvalds 			__le16 type;	/* 2: NOREDOPAGE record type */
2371da177e4SLinus Torvalds 			__le16 rsrvd;	/* 2: reserved */
2381da177e4SLinus Torvalds 			pxd_t pxd;	/* 8: on-disk page pxd */
2391da177e4SLinus Torvalds 		} noredopage;	/* (20) */
2401da177e4SLinus Torvalds 
2411da177e4SLinus Torvalds 		/*
2421da177e4SLinus Torvalds 		 *	UPDATEMAP: update block allocation map
2431da177e4SLinus Torvalds 		 *
2441da177e4SLinus Torvalds 		 * either in-line PXD,
2451da177e4SLinus Torvalds 		 * or     out-of-line  XADLIST;
2461da177e4SLinus Torvalds 		 *
2471da177e4SLinus Torvalds 		 * N.B. REDOPAGE, NOREDOPAGE, and UPDATEMAP must be same format;
2481da177e4SLinus Torvalds 		 */
2491da177e4SLinus Torvalds 		struct {
2501da177e4SLinus Torvalds 			__le32 fileset;	/* 4: fileset number */
2511da177e4SLinus Torvalds 			__le32 inode;	/* 4: inode number */
2521da177e4SLinus Torvalds 			__le16 type;	/* 2: UPDATEMAP record type */
2531da177e4SLinus Torvalds 			__le16 nxd;	/* 2: number of extents */
2541da177e4SLinus Torvalds 			pxd_t pxd;	/* 8: pxd */
2551da177e4SLinus Torvalds 		} updatemap;	/* (20) */
2561da177e4SLinus Torvalds 
2571da177e4SLinus Torvalds 		/*
2581da177e4SLinus Torvalds 		 *	NOREDOINOEXT: the inode extent is freed
2591da177e4SLinus Torvalds 		 *
2601da177e4SLinus Torvalds 		 * do not apply after-image records which precede this
2611da177e4SLinus Torvalds 		 * record in the log with the any of the 4 page block
2621da177e4SLinus Torvalds 		 * numbers in this inode extent.
2631da177e4SLinus Torvalds 		 *
2641da177e4SLinus Torvalds 		 * NOTE: The fileset and pxd fields MUST remain in
2651da177e4SLinus Torvalds 		 *       the same fields in the REDOPAGE record format.
2661da177e4SLinus Torvalds 		 *
2671da177e4SLinus Torvalds 		 */
2681da177e4SLinus Torvalds 		struct {
2691da177e4SLinus Torvalds 			__le32 fileset;	/* 4: fileset number */
2701da177e4SLinus Torvalds 			__le32 iagnum;	/* 4: IAG number     */
2711da177e4SLinus Torvalds 			__le32 inoext_idx;	/* 4: inode extent index */
2721da177e4SLinus Torvalds 			pxd_t pxd;	/* 8: on-disk page pxd */
2731da177e4SLinus Torvalds 		} noredoinoext;	/* (20) */
2741da177e4SLinus Torvalds 
2751da177e4SLinus Torvalds 		/*
2761da177e4SLinus Torvalds 		 *	SYNCPT: log sync point
2771da177e4SLinus Torvalds 		 *
2781da177e4SLinus Torvalds 		 * replay log up to syncpt address specified;
2791da177e4SLinus Torvalds 		 */
2801da177e4SLinus Torvalds 		struct {
2811da177e4SLinus Torvalds 			__le32 sync;	/* 4: syncpt address (0 = here) */
2821da177e4SLinus Torvalds 		} syncpt;
2831da177e4SLinus Torvalds 
2841da177e4SLinus Torvalds 		/*
2851da177e4SLinus Torvalds 		 *	MOUNT: file system mount
2861da177e4SLinus Torvalds 		 *
2871da177e4SLinus Torvalds 		 * file system mount: no type-dependent information;
2881da177e4SLinus Torvalds 		 */
2891da177e4SLinus Torvalds 
2901da177e4SLinus Torvalds 		/*
2911da177e4SLinus Torvalds 		 *	? FREEXTENT: free specified extent(s)
2921da177e4SLinus Torvalds 		 *
2931da177e4SLinus Torvalds 		 * free specified extent(s) from block allocation map
2941da177e4SLinus Torvalds 		 * N.B.: nextents should be length of data/sizeof(xad_t)
2951da177e4SLinus Torvalds 		 */
2961da177e4SLinus Torvalds 		struct {
2971da177e4SLinus Torvalds 			__le32 type;	/* 4: FREEXTENT record type */
2981da177e4SLinus Torvalds 			__le32 nextent;	/* 4: number of extents */
2991da177e4SLinus Torvalds 
3001da177e4SLinus Torvalds 			/* data: PXD or XAD list */
3011da177e4SLinus Torvalds 		} freextent;
3021da177e4SLinus Torvalds 
3031da177e4SLinus Torvalds 		/*
3041da177e4SLinus Torvalds 		 *	? NOREDOFILE: this file is freed
3051da177e4SLinus Torvalds 		 *
3061da177e4SLinus Torvalds 		 * do not apply records which precede this record in the log
3071da177e4SLinus Torvalds 		 * with the same inode number.
3081da177e4SLinus Torvalds 		 *
30963f83c9fSDave Kleikamp 		 * NOREDOFILE must be the first to be written at commit
3101da177e4SLinus Torvalds 		 * (last to be read in logredo()) - it prevents
3111da177e4SLinus Torvalds 		 * replay of preceding updates of all preceding generations
31263f83c9fSDave Kleikamp 		 * of the inumber esp. the on-disk inode itself.
3131da177e4SLinus Torvalds 		 */
3141da177e4SLinus Torvalds 		struct {
3151da177e4SLinus Torvalds 			__le32 fileset;	/* 4: fileset number */
3161da177e4SLinus Torvalds 			__le32 inode;	/* 4: inode number */
3171da177e4SLinus Torvalds 		} noredofile;
3181da177e4SLinus Torvalds 
3191da177e4SLinus Torvalds 		/*
3201da177e4SLinus Torvalds 		 *	? NEWPAGE:
3211da177e4SLinus Torvalds 		 *
3221da177e4SLinus Torvalds 		 * metadata type dependent
3231da177e4SLinus Torvalds 		 */
3241da177e4SLinus Torvalds 		struct {
3251da177e4SLinus Torvalds 			__le32 fileset;	/* 4: fileset number */
3261da177e4SLinus Torvalds 			__le32 inode;	/* 4: inode number */
3271da177e4SLinus Torvalds 			__le32 type;	/* 4: NEWPAGE record type */
3281da177e4SLinus Torvalds 			pxd_t pxd;	/* 8: on-disk page pxd */
3291da177e4SLinus Torvalds 		} newpage;
3301da177e4SLinus Torvalds 
3311da177e4SLinus Torvalds 		/*
3321da177e4SLinus Torvalds 		 *	? DUMMY: filler
3331da177e4SLinus Torvalds 		 *
3341da177e4SLinus Torvalds 		 * no type-dependent information
3351da177e4SLinus Torvalds 		 */
3361da177e4SLinus Torvalds 	} log;
3371da177e4SLinus Torvalds };					/* (36) */
3381da177e4SLinus Torvalds 
3391da177e4SLinus Torvalds #define	LOGRDSIZE	(sizeof(struct lrd))
3401da177e4SLinus Torvalds 
3411da177e4SLinus Torvalds /*
3421da177e4SLinus Torvalds  *	line vector descriptor
3431da177e4SLinus Torvalds  */
3441da177e4SLinus Torvalds struct lvd {
3451da177e4SLinus Torvalds 	__le16 offset;
3461da177e4SLinus Torvalds 	__le16 length;
3471da177e4SLinus Torvalds };
3481da177e4SLinus Torvalds 
3491da177e4SLinus Torvalds 
3501da177e4SLinus Torvalds /*
3511da177e4SLinus Torvalds  *	log logical volume
3521da177e4SLinus Torvalds  */
3531da177e4SLinus Torvalds struct jfs_log {
3541da177e4SLinus Torvalds 
3551da177e4SLinus Torvalds 	struct list_head sb_list;/*  This is used to sync metadata
3561da177e4SLinus Torvalds 				 *    before writing syncpt.
3571da177e4SLinus Torvalds 				 */
3581da177e4SLinus Torvalds 	struct list_head journal_list; /* Global list */
359*9641706cSJan Kara 	struct bdev_handle *bdev_handle; /* 4: log lv pointer */
3601da177e4SLinus Torvalds 	int serial;		/* 4: log mount serial number */
3611da177e4SLinus Torvalds 
3621da177e4SLinus Torvalds 	s64 base;		/* @8: log extent address (inline log ) */
3631da177e4SLinus Torvalds 	int size;		/* 4: log size in log page (in page) */
3641da177e4SLinus Torvalds 	int l2bsize;		/* 4: log2 of bsize */
3651da177e4SLinus Torvalds 
3665ba25331SAl Viro 	unsigned long flag;	/* 4: flag */
3671da177e4SLinus Torvalds 
3681da177e4SLinus Torvalds 	struct lbuf *lbuf_free;	/* 4: free lbufs */
3691da177e4SLinus Torvalds 	wait_queue_head_t free_wait;	/* 4: */
3701da177e4SLinus Torvalds 
3711da177e4SLinus Torvalds 	/* log write */
3721da177e4SLinus Torvalds 	int logtid;		/* 4: log tid */
3731da177e4SLinus Torvalds 	int page;		/* 4: page number of eol page */
3741da177e4SLinus Torvalds 	int eor;		/* 4: eor of last record in eol page */
3751da177e4SLinus Torvalds 	struct lbuf *bp;	/* 4: current log page buffer */
3761da177e4SLinus Torvalds 
3771de87444SIngo Molnar 	struct mutex loglock;	/* 4: log write serialization lock */
3781da177e4SLinus Torvalds 
3791da177e4SLinus Torvalds 	/* syncpt */
3801da177e4SLinus Torvalds 	int nextsync;		/* 4: bytes to write before next syncpt */
3811da177e4SLinus Torvalds 	int active;		/* 4: */
3821da177e4SLinus Torvalds 	wait_queue_head_t syncwait;	/* 4: */
3831da177e4SLinus Torvalds 
3841da177e4SLinus Torvalds 	/* commit */
3851da177e4SLinus Torvalds 	uint cflag;		/* 4: */
3861da177e4SLinus Torvalds 	struct list_head cqueue; /* FIFO commit queue */
3871da177e4SLinus Torvalds 	struct tblock *flush_tblk; /* tblk we're waiting on for flush */
3881da177e4SLinus Torvalds 	int gcrtc;		/* 4: GC_READY transaction count */
3891da177e4SLinus Torvalds 	struct tblock *gclrt;	/* 4: latest GC_READY transaction */
3901da177e4SLinus Torvalds 	spinlock_t gclock;	/* 4: group commit lock */
3911da177e4SLinus Torvalds 	int logsize;		/* 4: log data area size in byte */
3921da177e4SLinus Torvalds 	int lsn;		/* 4: end-of-log */
3931da177e4SLinus Torvalds 	int clsn;		/* 4: clsn */
3941da177e4SLinus Torvalds 	int syncpt;		/* 4: addr of last syncpt record */
3951da177e4SLinus Torvalds 	int sync;		/* 4: addr from last logsync() */
3961da177e4SLinus Torvalds 	struct list_head synclist;	/* 8: logsynclist anchor */
3971da177e4SLinus Torvalds 	spinlock_t synclock;	/* 4: synclist lock */
3981da177e4SLinus Torvalds 	struct lbuf *wqueue;	/* 4: log pageout queue */
3991da177e4SLinus Torvalds 	int count;		/* 4: count */
4002e3bc612SAndy Shevchenko 	uuid_t uuid;		/* 16: 128-bit uuid of log device */
4011da177e4SLinus Torvalds 
4021da177e4SLinus Torvalds 	int no_integrity;	/* 3: flag to disable journaling to disk */
4031da177e4SLinus Torvalds };
4041da177e4SLinus Torvalds 
4051da177e4SLinus Torvalds /*
4061da177e4SLinus Torvalds  * Log flag
4071da177e4SLinus Torvalds  */
4081da177e4SLinus Torvalds #define log_INLINELOG	1
4091da177e4SLinus Torvalds #define log_SYNCBARRIER	2
4101da177e4SLinus Torvalds #define log_QUIESCE	3
4111da177e4SLinus Torvalds #define log_FLUSH	4
4121da177e4SLinus Torvalds 
4131da177e4SLinus Torvalds /*
4141da177e4SLinus Torvalds  * group commit flag
4151da177e4SLinus Torvalds  */
4161da177e4SLinus Torvalds /* jfs_log */
4171da177e4SLinus Torvalds #define logGC_PAGEOUT	0x00000001
4181da177e4SLinus Torvalds 
4191da177e4SLinus Torvalds /* tblock/lbuf */
4201da177e4SLinus Torvalds #define tblkGC_QUEUE		0x0001
4211da177e4SLinus Torvalds #define tblkGC_READY		0x0002
4221da177e4SLinus Torvalds #define tblkGC_COMMIT		0x0004
4231da177e4SLinus Torvalds #define tblkGC_COMMITTED	0x0008
4241da177e4SLinus Torvalds #define tblkGC_EOP		0x0010
4251da177e4SLinus Torvalds #define tblkGC_FREE		0x0020
4261da177e4SLinus Torvalds #define tblkGC_LEADER		0x0040
4271da177e4SLinus Torvalds #define tblkGC_ERROR		0x0080
4281da177e4SLinus Torvalds #define tblkGC_LAZY		0x0100	// D230860
4291da177e4SLinus Torvalds #define tblkGC_UNLOCKED		0x0200	// D230860
4301da177e4SLinus Torvalds 
4311da177e4SLinus Torvalds /*
4321da177e4SLinus Torvalds  *		log cache buffer header
4331da177e4SLinus Torvalds  */
4341da177e4SLinus Torvalds struct lbuf {
4351da177e4SLinus Torvalds 	struct jfs_log *l_log;	/* 4: log associated with buffer */
4361da177e4SLinus Torvalds 
4371da177e4SLinus Torvalds 	/*
4381da177e4SLinus Torvalds 	 * data buffer base area
4391da177e4SLinus Torvalds 	 */
4401da177e4SLinus Torvalds 	uint l_flag;		/* 4: pageout control flags */
4411da177e4SLinus Torvalds 
4421da177e4SLinus Torvalds 	struct lbuf *l_wqnext;	/* 4: write queue link */
4431da177e4SLinus Torvalds 	struct lbuf *l_freelist;	/* 4: freelistlink */
4441da177e4SLinus Torvalds 
4451da177e4SLinus Torvalds 	int l_pn;		/* 4: log page number */
4461da177e4SLinus Torvalds 	int l_eor;		/* 4: log record eor */
4471da177e4SLinus Torvalds 	int l_ceor;		/* 4: committed log record eor */
4481da177e4SLinus Torvalds 
4491da177e4SLinus Torvalds 	s64 l_blkno;		/* 8: log page block number */
4501da177e4SLinus Torvalds 	caddr_t l_ldata;	/* 4: data page */
451dc5798d9SDave Kleikamp 	struct page *l_page;	/* The page itself */
452dc5798d9SDave Kleikamp 	uint l_offset;		/* Offset of l_ldata within the page */
4531da177e4SLinus Torvalds 
4541da177e4SLinus Torvalds 	wait_queue_head_t l_ioevent;	/* 4: i/o done event */
4551da177e4SLinus Torvalds };
4561da177e4SLinus Torvalds 
4571da177e4SLinus Torvalds /* Reuse l_freelist for redrive list */
4581da177e4SLinus Torvalds #define l_redrive_next l_freelist
4591da177e4SLinus Torvalds 
4601da177e4SLinus Torvalds /*
4611da177e4SLinus Torvalds  *	logsynclist block
4621da177e4SLinus Torvalds  *
4631da177e4SLinus Torvalds  * common logsyncblk prefix for jbuf_t and tblock
4641da177e4SLinus Torvalds  */
4651da177e4SLinus Torvalds struct logsyncblk {
4661da177e4SLinus Torvalds 	u16 xflag;		/* flags */
4671da177e4SLinus Torvalds 	u16 flag;		/* only meaninful in tblock */
4681da177e4SLinus Torvalds 	lid_t lid;		/* lock id */
4691da177e4SLinus Torvalds 	s32 lsn;		/* log sequence number */
4701da177e4SLinus Torvalds 	struct list_head synclist;	/* log sync list link */
4711da177e4SLinus Torvalds };
4721da177e4SLinus Torvalds 
4731da177e4SLinus Torvalds /*
4741da177e4SLinus Torvalds  *	logsynclist serialization (per log)
4751da177e4SLinus Torvalds  */
4761da177e4SLinus Torvalds 
4771da177e4SLinus Torvalds #define LOGSYNC_LOCK_INIT(log) spin_lock_init(&(log)->synclock)
4787fab479bSDave Kleikamp #define LOGSYNC_LOCK(log, flags) spin_lock_irqsave(&(log)->synclock, flags)
4797fab479bSDave Kleikamp #define LOGSYNC_UNLOCK(log, flags) \
4807fab479bSDave Kleikamp 	spin_unlock_irqrestore(&(log)->synclock, flags)
4811da177e4SLinus Torvalds 
4821da177e4SLinus Torvalds /* compute the difference in bytes of lsn from sync point */
4831da177e4SLinus Torvalds #define logdiff(diff, lsn, log)\
4841da177e4SLinus Torvalds {\
4851da177e4SLinus Torvalds 	diff = (lsn) - (log)->syncpt;\
4861da177e4SLinus Torvalds 	if (diff < 0)\
4871da177e4SLinus Torvalds 		diff += (log)->logsize;\
4881da177e4SLinus Torvalds }
4891da177e4SLinus Torvalds 
4901da177e4SLinus Torvalds extern int lmLogOpen(struct super_block *sb);
4911da177e4SLinus Torvalds extern int lmLogClose(struct super_block *sb);
4921da177e4SLinus Torvalds extern int lmLogShutdown(struct jfs_log * log);
4931da177e4SLinus Torvalds extern int lmLogInit(struct jfs_log * log);
4941da177e4SLinus Torvalds extern int lmLogFormat(struct jfs_log *log, s64 logAddress, int logSize);
4951868f4aaSDave Kleikamp extern int lmGroupCommit(struct jfs_log *, struct tblock *);
4961868f4aaSDave Kleikamp extern int jfsIOWait(void *);
4971da177e4SLinus Torvalds extern void jfs_flush_journal(struct jfs_log * log, int wait);
498cbc3d65eSDave Kleikamp extern void jfs_syncpt(struct jfs_log *log, int hard_sync);
4991da177e4SLinus Torvalds 
5001da177e4SLinus Torvalds #endif				/* _H_JFS_LOGMGR */
501