3
* Copyright (c) International Business Machines Corp., 2000
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13
* the GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
#include <jfs_filsys.h>
24
#include <jfs_superblock.h>
25
#include <jfs_logmgr.h>
32
extern int64_t fsckwsp_offset; /* defined in xpeek.c */
33
extern int64_t jlog_super_offset; /* defined in xpeek.c */
35
/* forward references */
36
int32_t display_cbblfsck( struct fsck_blk_map_hdr * );
37
int32_t display_fsck_wsphdr( struct fsck_blk_map_hdr * );
38
int32_t display_logsuper( logsuper_t * );
40
int32_t get_fsckwsphdr( struct fsck_blk_map_hdr * );
41
int32_t get_logsuper( logsuper_t * );
43
int32_t put_fsckwsphdr( struct fsck_blk_map_hdr * );
44
int32_t put_logsuper( logsuper_t * );
47
extern uint32_t type_jfs;
48
extern void ujfs_swap_fsck_blk_map_hdr( fsck_blk_map_hdr_t * );
49
extern void ujfs_swap_logsuper_t( logsuper_t * );
51
/*************************************************************
57
struct fsck_blk_map_hdr fsckwsp;
59
if( get_fsckwsphdr( &fsckwsp ) ) {
60
fputs("cbblfsck: error returned from get_fsckwsphdr()\n\n",stderr);
63
if (display_cbblfsck( &fsckwsp ) == XPEEK_CHANGED)
64
if( put_fsckwsphdr( &fsckwsp ) )
65
fputs("cbblfsck: error returned from put_fsckwsphdr()\n\n",stderr);
67
} /* end cbblfsck() */
70
/*************************************************************
76
struct fsck_blk_map_hdr fsckwsp;
78
if( get_fsckwsphdr( &fsckwsp ) ) {
79
fputs("fsckwsphdr: error returned from get_fsckwsphdr()\n\n",stderr);
82
if (display_fsck_wsphdr( &fsckwsp ) == XPEEK_CHANGED)
83
if( put_fsckwsphdr( &fsckwsp ) )
84
fputs("fsckwsphdr: error returned from put_fsckwsphdr()\n\n",stderr);
86
} /* end fsckwsphdr() */
89
/*************************************************************
98
lsp = (logsuper_t *) &(buffer[0]);
100
if( get_logsuper( lsp ) ) {
101
fputs("logsuper: error returned from get_fsckwsphdr()\n\n",stderr);
104
if (display_logsuper( lsp ) == XPEEK_CHANGED)
105
if( put_logsuper( lsp ) )
106
fputs("logsuper: error returned from put_fsckwsphdr()\n\n",stderr);
108
} /* end logsuper() */
111
* ============================================================
114
/*************************************************************
117
***************** Sample output of display_cbblfsck()
119
[1] eyecatcher: 'fsckcbbl' [13] bufptr_eyecatch: 'cbblbufs'
120
[2] cbbl_retcode: 0 [14] cbbl_agg_recptr: 0x00067f40
121
[3] fs_blksize: 1024 [15] ImapInoPtr: 0x00067cb0
122
[4] lv_blksize: 512 [16] ImapCtlPtr: 0x00061a70
124
[6] fs_last_metablk: 0x00000000000008a8 (0d02216)
125
[7] fs_first_wspblk: 0x00000000001fba2b (0d02079275)
126
[8] total_bad_blocks: 20
127
[9] resolved_blocks: 18 [17] ImapLeafPtr: 0x00060a60
128
[10] reloc_extents: 14 [18] iagPtr: 0x00066ca0
129
[11] reloc_blocks: 1028 [19] InoExtPtr: 0x00060a70
133
int32_t display_cbblfsck( struct fsck_blk_map_hdr *fsckwsp_ptr )
135
int32_t rc = XPEEK_OK;
136
struct fsckcbbl_record *cbblrec;
143
cbblrec = &( fsckwsp_ptr->cbblrec );
147
strncpy(s1, cbblrec->eyecatcher, 8);
149
strncpy(s2, cbblrec->bufptr_eyecatcher, 8);
152
printf("[1] eyecatcher: \t'%s'\t", s1);
153
printf("[13] bufptr_eyecatch:\t'%s'\n", s2);
154
printf("[2] cbbl_retcode:\t%d\t\t", cbblrec->cbbl_retcode);
155
printf("[14] cbbl_agg_recptr:\t0x%8p\n", cbblrec->clrbblks_agg_recptr);
156
printf("[3] fs_blksize:\t\t%d\t\t", cbblrec->fs_blksize);
157
printf("[15] ImapInoPtr:\t0x%8p\n", cbblrec->ImapInoPtr);
158
printf("[4] lv_blksize:\t\t%d\t\t", cbblrec->lv_blksize);
159
printf("[16] ImapCtlPtr:\t0x%8p\n", cbblrec->ImapCtlPtr);
160
printf("[5] fs_lv_ratio:\t%d\n", cbblrec->fs_lv_ratio);
161
printf("[6] last_metablk:\t0x%016llx (0d0%lld)\n",
162
(long long)cbblrec->fs_last_metablk, (long long)cbblrec->fs_last_metablk);
163
printf("[7] first_wspblk:\t0x%016llx (0d0%lld)\n",
164
(long long)cbblrec->fs_first_wspblk, (long long)cbblrec->fs_first_wspblk);
165
printf("[8] total_bad_blocks:\t%0d\n", cbblrec->total_bad_blocks);
166
printf("[9] resolved_blocks:\t%d\t\t", cbblrec->resolved_blocks);
167
printf("[17] ImapLeafPtr:\t0x%8p\n", cbblrec->ImapLeafPtr);
168
printf("[10] reloc_extents:\t%d\t\t", cbblrec->reloc_extents);
169
printf("[18] iagPtr:\t\t0x%8p\n", cbblrec->iagPtr);
170
printf("[11] reloc_blocks:\t%lld\t\t", (long long)cbblrec->reloc_blocks);
171
printf("[19] InoExtPtr:\t\t0x%8p\n", cbblrec->InoExtPtr);
172
printf("[12] LVM_lists:\t\t%d\n", cbblrec->LVM_lists);
175
fputs("display_cbblfsck: [m]odify or e[x]it: ", stdout);
176
fgets(cmdline, 512, stdin);
177
token = strtok(cmdline, " \n");
178
if (token == 0 || token[0] != 'm')
181
field = m_parse(cmdline, 19, &token);
187
strncpy(cbblrec->eyecatcher, token, 8);
190
cbblrec->cbbl_retcode = strtol(token, 0, 8);
193
cbblrec->fs_blksize = strtol(token, 0, 0);
196
cbblrec->lv_blksize = strtol(token, 0, 0);
199
cbblrec->fs_lv_ratio = strtol(token, 0, 0);
202
cbblrec->fs_last_metablk = strtoull(token, 0, 16);
205
cbblrec->fs_first_wspblk = strtoull(token, 0, 16);
208
cbblrec->total_bad_blocks = strtol(token, 0, 0);
211
cbblrec->resolved_blocks = strtol(token, 0, 0);
214
cbblrec->reloc_extents = strtol(token, 0, 0);
217
cbblrec->reloc_blocks = strtol(token, 0, 0);
220
cbblrec->LVM_lists = strtoul(token, 0, 0);
223
strncpy(cbblrec->bufptr_eyecatcher, token, 8);
226
cbblrec->clrbblks_agg_recptr = (void *) strtoul(token, 0, 16);
229
cbblrec->ImapInoPtr = (void *) strtoul(token, 0, 16);
232
cbblrec->ImapCtlPtr = (void *) strtoul(token, 0, 16);
235
cbblrec->ImapLeafPtr = (void *) strtoul(token, 0, 16);
238
cbblrec->iagPtr = (void *) strtoul(token, 0, 16);
241
cbblrec->InoExtPtr = (void *) strtoul(token, 0, 16);
246
} /* end display_cbblfsck() */
249
/*************************************************************
250
* display_fsck_wsphdr()
253
***************** Sample output of display_fsck_wsphdr()
255
[1] eyecatcher: 'wspblkmp'
256
[2] last_entry_pos: 0
257
[3] next_entry_pos: 0
258
[4] start_time: 2/5/999.11.2
259
[5] end_time: 2/5/999.11.4
261
[7] super_buff_addr: 0x164f0be0
262
[8] agg_record_addr: 0x164f4cd0
263
[9] bmap_record_addr: 0x16463ce0
264
[10] fscklog_agg_offset: 0x000000003f786600 (0d01064855040)
266
[12] fscklog_buf_allocated: -1
267
[13] fscklog_buf_alloc_err: 0
268
[14] num_logwrite_errors: 0
272
int32_t display_fsck_wsphdr( struct fsck_blk_map_hdr *wp )
274
int32_t rc = XPEEK_OK;
282
strncpy(s1, wp->hdr.eyecatcher, 8);
285
printf("[1] eyecatcher:\t\t\t'%s'\n", s1 );
286
printf("[2] last_entry_pos:\t\t%d\n", wp->hdr.last_entry_pos );
287
printf("[3] next_entry_pos:\t\t%d\n", wp->hdr.next_entry_pos );
288
printf("[4] start_time:\t\t\t%s\n", wp->hdr.start_time );
289
printf("[5] end_time:\t\t\t%s\n", wp->hdr.end_time );
290
printf("[6] return_code:\t\t%d\n", wp->hdr.return_code );
291
printf("[7] super_buff_addr:\t\t%8p\n", wp->hdr.super_buff_addr );
292
printf("[8] agg_record_addr:\t\t0x%8p\n", wp->hdr.agg_record_addr );
293
printf("[9] bmap_record_addr:\t\t0x%8p\n", wp->hdr.bmap_record_addr );
294
printf("[10] fscklog_agg_offset:\t0x%016llx (0d0%lld)\n",
295
(long long)wp->hdr.fscklog_agg_offset, (long long)wp->hdr.fscklog_agg_offset);
296
printf("[11] fscklog_full:\t\t%d\n", wp->hdr.fscklog_full );
297
printf("[12] fscklog_buf_allocated:\t%d\n", wp->hdr.fscklog_buf_allocated );
298
printf("[13] fscklog_buf_alloc_err:\t%d\n", wp->hdr.fscklog_buf_alloc_err );
299
printf("[14] num_logwrite_errors:\t%d\n", wp->hdr.num_logwrite_errors );
302
fputs("display_fsck_wsphdr: [m]odify or e[x]it: ", stdout);
303
fgets(cmdline, 512, stdin);
304
token = strtok(cmdline, " \n");
305
if (token == 0 || token[0] != 'm')
308
field = m_parse(cmdline, 14, &token);
314
strncpy(wp->hdr.eyecatcher, token, 8);
317
wp->hdr.last_entry_pos = strtol(token, 0, 0);
320
wp->hdr.next_entry_pos = strtol(token, 0, 0);
323
strncpy(wp->hdr.start_time, token, 16);
326
strncpy(wp->hdr.end_time, token, 16);
329
wp->hdr.return_code = strtol(token, 0, 0);
332
wp->hdr.super_buff_addr = (char *) strtoul(token, 0, 16);
335
wp->hdr.agg_record_addr = (char *) strtoul(token, 0, 16);
338
wp->hdr.bmap_record_addr = (char *) strtoul(token, 0, 16);
341
wp->hdr.fscklog_agg_offset = strtoull(token, 0, 16);
344
wp->hdr.fscklog_full = strtol(token, 0, 0);
347
wp->hdr.fscklog_buf_allocated = strtol(token, 0, 0);
350
wp->hdr.fscklog_buf_alloc_err = strtol(token, 0, 0);
353
wp->hdr.num_logwrite_errors = strtol(token, 0, 8);
358
} /* end display_fsck_wsphdr() */
361
/*************************************************************
365
***************** Sample output of display_logsuper()
367
[1] eyecatcher: 'wspblkmp'
368
[2] last_entry_pos: 0
369
[3] next_entry_pos: 0
370
[4] start_time: 2/5/999.11.2
371
[5] end_time: 2/5/999.11.4
373
[7] super_buff_addr: 0x164f0be0
374
[8] agg_record_addr: 0x164f4cd0
375
[9] bmap_record_addr: 0x16463ce0
376
[10] fscklog_agg_offset: 0x000000003f786600 (0d01064855040)
378
[12] fscklog_buf_allocated: -1
379
[13] fscklog_buf_alloc_err: 0
380
[14] num_logwrite_errors: 0
384
int32_t display_logsuper( logsuper_t *lsp )
386
int32_t rc = XPEEK_OK;
393
printf("[1] magic:\t\t\t0x%x\n", lsp->magic );
394
printf("[2] version:\t\t\t%d\n", lsp->version );
395
printf("[3] serial:\t\t\t%d\n", lsp->serial );
396
printf("[4] log size:\t\t\t%d\t(at 4096 bytes/log block)\n", lsp->size );
397
printf("[5] agg block size:\t\t%d\t(bytes)\n", lsp->bsize );
398
printf("[6] log2(agg blk size):\t\t%d\n", lsp->l2bsize );
399
printf("[7] flag:\t\t\t0x%08x\n", lsp->flag );
400
printf("[8] state:\t\t\t0x%08x\n", lsp->state );
401
printf("[9] end:\t\t\t0x%x (d %d)\n", lsp->end, lsp->end);
402
printf("[] active[0]:\t0x%x (%d)\t active[4]:\t0x%x (%d)\n",
403
lsp->active[0], lsp->active[0],
404
lsp->active[4], lsp->active[4] );
405
printf(" active[1]:\t0x%x (%d)\t active[5]:\t0x%x (%d)\n",
406
lsp->active[1], lsp->active[1],
407
lsp->active[5], lsp->active[5] );
408
printf(" active[2]:\t0x%x (%d)\t active[6]:\t0x%x (%d)\n",
409
lsp->active[2], lsp->active[2],
410
lsp->active[6], lsp->active[6] );
411
printf(" active[3]:\t0x%x (%d)\t active[7]:\t0x%x (%d)\n",
412
lsp->active[3], lsp->active[3],
413
lsp->active[7], lsp->active[7] );
416
fputs("display_fsck_wsphdr: [m]odify or e[x]it: ", stdout);
417
fgets(cmdline, 512, stdin);
418
token = strtok(cmdline, " \n");
419
if (token == 0 || token[0] != 'm')
422
field = m_parse(cmdline, 9, &token);
428
lsp->magic = strtoul(token, 0, 16);
431
lsp->version = strtol(token, 0, 0);
434
lsp->serial = strtol(token, 0, 0);
437
lsp->size = strtol(token, 0, 0);
440
lsp->bsize = strtol(token, 0, 0);
443
lsp->l2bsize = strtol(token, 0, 0);
446
lsp->flag = strtoul(token, 0, 16);
449
lsp->state = strtoul(token, 0, 16);
452
lsp->end = strtoul(token, 0, 16);
457
} /* end display_logsuper() */
460
/*************************************************************
464
int32_t get_fsckwsphdr( struct fsck_blk_map_hdr *wsphdr_ptr )
466
if( xRead( fsckwsp_offset, PSIZE, (char *)wsphdr_ptr ) ) {
467
fputs("get_fsckwsphdr: error returned from xRead(fsckwsp_offset)\n\n",stderr);
471
/* swap if on big endian machine */
472
if (type_jfs & JFS_SWAP_BYTES) {
473
ujfs_swap_fsck_blk_map_hdr( wsphdr_ptr );
477
} /* end get_fsckwsphdr() */
480
/*************************************************************
484
int32_t get_logsuper( logsuper_t *lsp )
486
if( xRead( jlog_super_offset, PSIZE, (char *)lsp ) ) {
487
fputs("get_logsuper: error returned from xRead(jlog_super_offset)\n\n",stderr);
491
/* swap if on big endian machine */
492
if (type_jfs & JFS_SWAP_BYTES) {
493
ujfs_swap_logsuper_t( lsp );
497
} /* end get_logsuper() */
500
/*************************************************************
504
int32_t put_fsckwsphdr( blk_cntrlptr wsphdr_ptr )
507
/* swap if on big endian machine */
508
if (type_jfs & JFS_SWAP_BYTES) {
509
ujfs_swap_fsck_blk_map_hdr( wsphdr_ptr );
512
if( xWrite( fsckwsp_offset, PSIZE, (char *)wsphdr_ptr ) ) {
513
fputs("put_fsckwsphdr: error returned from xWrite(fsckwsp_offset)\n\n",stderr);
514
/* swap back if on big endian machine */
515
if (type_jfs & JFS_SWAP_BYTES) ujfs_swap_fsck_blk_map_hdr( wsphdr_ptr );
519
/* swap back if on big endian machine */
520
if (type_jfs & JFS_SWAP_BYTES) {
521
ujfs_swap_fsck_blk_map_hdr( wsphdr_ptr );
526
} /* end put_fsckwsphdr() */
529
/*************************************************************
533
int32_t put_logsuper( logsuper_t *lsp )
536
/* swap if on big endian machine */
537
if (type_jfs & JFS_SWAP_BYTES) {
538
ujfs_swap_logsuper_t( lsp );
541
if( xWrite( jlog_super_offset, PSIZE, (char *)lsp ) ) {
542
fputs("put_logsuper: error returned from xWrite(jlog_super_offset)\n\n",stderr);
543
/* swap back if on big endian machine */
544
if (type_jfs & JFS_SWAP_BYTES) ujfs_swap_logsuper_t( lsp );
548
/* swap back if on big endian machine */
549
if (type_jfs & JFS_SWAP_BYTES) {
550
ujfs_swap_logsuper_t( lsp );
555
} /* end put_logsuper() */