1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
|
/*
* Copyright (c) International Business Machines Corp., 2000-2002
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef H_LOGREDO
#define H_LOGREDO
/*
* NOTE:
* If logredo passes rc > 0 to fsck,
* fsck will do a full check and repair process
*
* but if logredo passes rc < 0 to fsck,
* fsck will do a full check and repair process AND
* fsck will reformat the log
*/
#define MINOR_ERROR 1 /* error that will not abort the program */
#define MAJOR_ERROR -2 /* return code to force abort of logredo */
#define REFORMAT_ERROR -3 /* return code to force logform of log */
#define ENOMEM0 100 /* insufficient dynamic storage, location 0 */
#define ENOMEM1 101 /* insufficient dynamic storage, location 1 */
#define ENOMEM2 102 /* insufficient dynamic storage, location 2 */
#define ENOMEM3 103 /* insufficient dynamic storage, location 3 */
#define ENOMEM4 104 /* insufficient dynamic storage, location 4 */
#define ENOMEM5 105 /* insufficient dynamic storage, location 5 */
#define ENOMEM6 106 /* insufficient dynamic storage, location 6 */
#define ENOMEM7 107 /* insufficient dynamic storage, location 7 */
#define ENOMEM8 108 /* insufficient dynamic storage, location 8 */
#define ENOMEM9 109 /* insufficient dynamic storage, location 9 */
#define ENOMEM10 110 /* insufficient dynamic storage, location 10 */
#define ENOMEM11 111 /* insufficient dynamic storage, location 11 */
#define ENOMEM12 112 /* insufficient dynamic storage, location 12 */
#define ENOMEM25 175 /* insufficient dynamic storage for BMap */
#define BFLUSH_WRITEERROR 201
#define BLOCK_OUTOFRANGE 202
#define BMAP_READERROR1 203
#define BMAP_READERROR2 204
#define BMAP_READERROR3 205
#define BMAP_READERROR4 206
#define BMAP_READERROR5 207
#define BMAP_READERROR6 208
#define BMAP_WRITEERROR1 209
#define BMAP_WRITEERROR2 210
#define BMAP_WRONGTOTPAGES 211
#define BREAD_BMAPINIT 212
#define BREAD_IMAPINIT 213
#define CANTOPEN_INLINELOG -214
#define CANTOPEN_OUTLINELOG -215
#define CANTREAD_2NDFSSUPER 216
#define CANTREAD_PRIMFSSUPER 217
#define CANTWRITE_2NDFSSUPER 218
#define CANTWRITE_PRIMFSSUPER 219
#define DMAP_UPDATEFAIL 220
#define DOSFSCTL_ERROR -221
#define DTPAGE_BADSLOTNEXTIDX1 -222
#define DTPAGE_BADSLOTNEXTIDX2 -223
#define DTPAGE_BADSTBLENTRY1 -224
#define DTPAGE_BADSTBLENTRY2 -225
#define DTPAGE_READERROR1 226
#define DTREE_READERROR1 227
#define EXTENDFS_FAILRECOV 228
#define FSSUPER_READERROR1 229
#define FSSUPER_READERROR2 230
#define ILLEGAL_LEAF_IND0 231
#define ILLEGAL_LEAF_IND1 232
#define IMAP_READERROR1 233
#define IMAP_READERROR2 234
#define IMAP_READERROR3 235
#define IMAP_READERROR4 236
#define IMAP_READERROR5 237
#define IMAP_READERROR6 238
#define IMAP_WRITEERROR1 239
#define IMAP_WRITEERROR2 240
#define IMAP_WRONGNPAGES 241
#define INOEXT_READERROR1 242
#define INOEXT_READERROR2 243
#define INVALID_LOGEND -244
#define INVALID_NEXTADDR -245
#define JFS_BLKSIZE_ERROR -246
#define JFS_LOGSIZE_ERROR -247
#define JFS_L2BLKSIZE_ERROR -248
#define JFS_VERSION_ERROR -249
#define JLOG_LOGWRAP -250
#define JLOG_NOCOMFREE -251
#define JLOG_READERROR1 -252
#define JLOG_WRITEERROR1 -253
#define LOG_OPEN_ERROR -254
#define LOGSUPER_BADLOGLOC -255
#define LOGSUPER_LOGNOTINLINE -256
#define LOGSUPER_BADMAGIC -257
#define LOGSUPER_BADSERIAL -258
#define LOGSUPER_BADVERSION -259
#define LOGSUPER_READ_ERROR -260
#define LOGSUPER_WRITEERROR1 -261
#define LOG_WRAPPED_TWICE -262
#define NEXTADDR_SAME -263
#define NOTREBUILDING_BMAP 264
#define NOTREBUILDING_IMAP 265
#define NOT_FSDEV_ERROR 266
#define NOT_INLINELOG_ERROR 267
#define NOT_LOG_FILE_ERROR -268
#define UNRECOG_LOGRECTYP -269
#define XTPAGE_READERROR1 270
#define BMAP_READERROR7 271
#define READLOGERROR -272
#define LOG_IN_USE 273
#define UPDATEPAGE_BAD_RANGE 274
/* error types
*/
#define MAPERR 0
#define DBTYPE 1
#define INOTYPE 2
#define READERR 3
#define UNKNOWNR 4
#define LOGEND 5
#define SERIALNO 6
#define OPENERR 7
#define IOERROR 8
#define LOGRCERR 9
#define PB_READ 0
#define PB_UPDATE 1
/* log.location */
#define INLINELOG 0x1
#define OUTLINELOG 0x2
#define NBUFPOOL 128
/*
* the following are used to map the bmap_wsp array elements
* which describe block map pages
*/
struct dmap_bitmaps {
uint32_t wmap[LPERDMAP]; /* 1024: bits of the working map */
uint32_t pmap[LPERDMAP]; /* 1024: bits of the persistent map */
}; /* - 2048 - */
struct bmap_wsp {
int64_t page_offset; /* aggregate offset for the page */
struct dmap_bitmaps *dmap_bitmaps; /*
* IF this record describes a dmap page,
* AND IF that dmap page is affected by
* transactions processed in this
* logredo session, THEN this field is
* a ptr to bit maps for the page.
* Otherwise this field is null.
*/
uint32_t available; /* unused at this time */
};
/*
* the following are used to map the imap_wsp array elements
* which describe the inode map pages
*/
struct iag_data {
uint32_t wmap[EXTSPERIAG]; /* 512: working allocation map */
uint32_t pmap[EXTSPERIAG]; /* 512: persistent allocation map */
pxd_t inoext[EXTSPERIAG]; /* 1024: inode extent addresses */
}; /* - 2048 - */
struct imap_wsp {
int64_t page_offset; /* aggregate offset for the page */
struct iag_data *imap_data; /* IF this record describes an IAG
* AND IF that IAG is affected by
* transactions processed in this
* logredo session, THEN this field
* is a ptr to data for the IAG.
* Otherwise this field is null.
*/
uint32_t available; /* unused at this time */
};
/*
* Information about the log device
*/
struct log_info {
FILE *fp; /* file descriptor */
int32_t serial; /* log serial number */
int location; /* INLINELOG or OUTLINELOG */
int64_t xaddr; /* log address in bytes offset */
int64_t size; /* log size in 4K blocks */
int bsize; /* Logical Block size */
int l2bsize; /* log2 of bsize */
uuid_t uuid; /* 128-bit device uuid */
int32_t devnum; /* Kernel-style device number */
};
extern struct log_info Log;
/*
* open file system aggregate/lv array
*/
struct vopen {
dev_t device; /* device major/minor */
int state; /* see below */
int next_hash; /* Next vopen index in hash list */
FILE *fp; /* file descriptor for the opened aggregate */
uuid_t uuid; /* 128-bit device uuid */
int32_t status; /* status of aggregate/volume */
int64_t fssize; /* fs size, total number of aggre. blks */
int32_t lblksize; /* aggre. blksize (ie fs blksize) in bytes */
int16_t lbperpage; /* aggregate blocks per page */
int16_t is_fsdirty; /* true if superblock.state is FM_DIRTY */
int16_t l2bsize; /* log2 of s_bsize */
int16_t l2bfactor; /* log2(s_bsize/physical block size) */
int32_t agsize; /* num of aggre. blks per alloc group */
int32_t l2agsize; /* Log2 of agsize */
int32_t numag; /* total num of ags in this aggregate. */
struct dinomap *aggimap_ctrl; /* pointer to the control page of
aggregate inode map */
struct iag *aggimap_iag; /* ptr to aggregate inode map iag pages */
struct fsimap_lst {
int32_t fileset; /* fileset number, which is the inode
* number of this fileset imap inode in
* the aggregate inode table.
*/
int imap_page_count; /* number of pages in the imap,
* including the control page
*/
struct dinomap *fsimapctrl; /* ptr to ctrl page of fileset imap */
struct imap_wsp *imap_wsp; /*
* ptr to an array of IAG workspaces
*/
struct iag *iag_pbuf; /* ptr to an iag page buffer */
int imap_pagenum; /* page offset, in inode map,
* of buffer contents
*/
struct iag *iag_pbuf2; /* ptr to another iag page buffer */
int imap_pagenum2; /* page offset, in inode map,
* of buffer contents
*/
struct fsimap_lst *next; /* ptr to next fileset imap */
} fsimap_lst; /* the list of multiple fileset imap */
int bmap_page_count; /* number of pages in the bmap,
* including the control page
*/
struct dbmap *bmap_ctl; /* ptr to control page of aggregate block
* allocate map (i.e. bmap) file
*/
struct bmap_wsp *bmap_wsp; /*
* ptr to an array of blockmap page workspaces
*/
struct dmap *dmap_pbuf; /* ptr to a dmap page buffer */
int dmap_pagenum; /* page offset, in block map, of
* buffer contents
*/
struct dmapctl *L0_pbuf; /* ptr to a dmap page buffer */
int L0_pagenum; /* page offset, in block map, of
* buffer contents
*/
struct dmapctl *L1_pbuf; /* ptr to a dmap page buffer */
int L1_pagenum; /* page offset, in block map, of
* buffer contents
*/
struct dmapctl *L2_pbuf; /* ptr to a dmap page buffer */
int L2_pagenum; /* page offset, in block map, of
* buffer contents
*/
};
/* vopen state */
#define VOPEN_EMPTY 0 /* Unused slot */
#define VOPEN_OPEN 1 /* Device is open */
#define VOPEN_CLOSED 2 /* Device is closed */
#define fsimap_iag fsimap_lst.fsimapiag
int jfs_logredo(caddr_t, FILE *, int32_t);
int findLog(FILE *, int *);
#endif /* H_LOGREDO */
|