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