⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsckcbbl.c

📁 jfs 源码
💻 C
字号:
/* *   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 */#include "xpeek.h"/* JFS includes */#include <jfs_filsys.h>#include <jfs_superblock.h>#include <jfs_logmgr.h>/* libfs includes */#include <fsckcbbl.h>#include <fsckwsp.h>#include <jfs_endian.h>#include <super.h>/* global data */extern int64_t fsckwsp_offset;	/* defined in xpeek.c    */extern int64_t jlog_super_offset;	/* defined in xpeek.c    *//* forward references */int display_cbblfsck(struct fsck_blk_map_hdr *);int display_fsck_wsphdr(struct fsck_blk_map_hdr *);int display_logsuper(struct logsuper *);int get_fsckwsphdr(struct fsck_blk_map_hdr *);int put_fsckwsphdr(struct fsck_blk_map_hdr *);/************************************************************* *  cbblfsck() * */void cbblfsck(){	struct fsck_blk_map_hdr fsckwsp;	if (get_fsckwsphdr(&fsckwsp)) {		fputs("cbblfsck: error returned from get_fsckwsphdr()\n\n", stderr);		return;	}	if (display_cbblfsck(&fsckwsp) == XPEEK_CHANGED)		if (put_fsckwsphdr(&fsckwsp))			fputs("cbblfsck: error returned from put_fsckwsphdr()\n\n", stderr);	return;}				/* end cbblfsck() *//************************************************************* *  fsckwsphdr() * */void fsckwsphdr(){	struct fsck_blk_map_hdr fsckwsp;	if (get_fsckwsphdr(&fsckwsp)) {		fputs("fsckwsphdr: error returned from get_fsckwsphdr()\n\n", stderr);		return;	}	if (display_fsck_wsphdr(&fsckwsp) == XPEEK_CHANGED)		if (put_fsckwsphdr(&fsckwsp))			fputs("fsckwsphdr: error returned from put_fsckwsphdr()\n\n", stderr);	return;}				/* end fsckwsphdr() *//************************************************************* *  logsuper() * */void logsuper(){	char buffer[PSIZE];	struct logsuper *lsp;	lsp = (struct logsuper *) & (buffer[0]);	if (ujfs_get_logsuper(fd, lsp)) {		fputs("logsuper: error returned from ujfs_get_logsuper()\n\n", stderr);		return;	}	if (display_logsuper(lsp) == XPEEK_CHANGED)		if (ujfs_put_logsuper(fd, lsp))			fputs("logsuper: error returned from ujfs_put_logsuper()\n\n", stderr);	return;}				/* end logsuper() *//* * ============================================================ *//************************************************************* *  display_cbblfsck() * *****************  Sample output of display_cbblfsck()[1] eyecatcher:		'fsckcbbl'	    [13] bufptr_eyecatch:	'cbblbufs'[2] cbbl_retcode: 	0		    [14] cbbl_agg_recptr:	0x00067f40[3] fs_blksize: 	1024		    [15] ImapInoPtr: 		0x00067cb0[4] lv_blksize:		512		    [16] ImapCtlPtr:		0x00061a70[5] fs_lv_ratio: 	2		[6] fs_last_metablk:	0x00000000000008a8    (0d02216)[7] fs_first_wspblk:	0x00000000001fba2b    (0d02079275)[8] total_bad_blocks:	20		[9] resolved_blocks:	18		    [17] ImapLeafPtr:		0x00060a60[10] reloc_extents:     14		    [18] iagPtr:		0x00066ca0[11] reloc_blocks:	1028		    [19] InoExtPtr:		0x00060a70[12] LVM_lists: 	3		 */int display_cbblfsck(struct fsck_blk_map_hdr *fsckwsp_ptr){	int rc = XPEEK_OK;	struct fsckcbbl_record *cbblrec;	char cmdline[512];	int field;	char *token;	char s1[9];	char s2[9];	cbblrec = &(fsckwsp_ptr->cbblrec);      changed:	strncpy(s1, cbblrec->eyecatcher, 8);	s1[8] = '\0';	strncpy(s2, cbblrec->bufptr_eyecatcher, 8);	s2[8] = '\0';	printf("[1] eyecatcher:	\t'%s'\t", s1);	printf("[13] bufptr_eyecatch:\t'%s'\n", s2);	printf("[2] cbbl_retcode:\t%d\t\t", cbblrec->cbbl_retcode);	printf("[14] cbbl_agg_recptr:\t0x%8p\n", cbblrec->clrbblks_agg_recptr);	printf("[3] fs_blksize:\t\t%d\t\t", cbblrec->fs_blksize);	printf("[15] ImapInoPtr:\t0x%8p\n", cbblrec->ImapInoPtr);	printf("[4] lv_blksize:\t\t%d\t\t", cbblrec->lv_blksize);	printf("[16] ImapCtlPtr:\t0x%8p\n", cbblrec->ImapCtlPtr);	printf("[5] fs_lv_ratio:\t%d\n", cbblrec->fs_lv_ratio);	printf("[6] last_metablk:\t0x%016llx    (0d0%lld)\n",	       (long long) cbblrec->fs_last_metablk, (long long) cbblrec->fs_last_metablk);	printf("[7] first_wspblk:\t0x%016llx    (0d0%lld)\n",	       (long long) cbblrec->fs_first_wspblk, (long long) cbblrec->fs_first_wspblk);	printf("[8] total_bad_blocks:\t%0d\n", cbblrec->total_bad_blocks);	printf("[9] resolved_blocks:\t%d\t\t", cbblrec->resolved_blocks);	printf("[17] ImapLeafPtr:\t0x%8p\n", cbblrec->ImapLeafPtr);	printf("[10] reloc_extents:\t%d\t\t", cbblrec->reloc_extents);	printf("[18] iagPtr:\t\t0x%8p\n", cbblrec->iagPtr);	printf("[11] reloc_blocks:\t%lld\t\t", (long long) cbblrec->reloc_blocks);	printf("[19] InoExtPtr:\t\t0x%8p\n", cbblrec->InoExtPtr);	printf("[12] LVM_lists:\t\t%d\n", cbblrec->LVM_lists);      retry:	fputs("display_cbblfsck: [m]odify or e[x]it: ", stdout);	fgets(cmdline, 512, stdin);	token = strtok(cmdline, " 	\n");	if (token == 0 || token[0] != 'm')		return rc;	field = m_parse(cmdline, 19, &token);	if (field == 0)		goto retry;	switch (field) {	case 1:		strncpy(cbblrec->eyecatcher, token, 8);		break;	case 2:		cbblrec->cbbl_retcode = strtol(token, 0, 8);		break;	case 3:		cbblrec->fs_blksize = strtol(token, 0, 0);		break;	case 4:		cbblrec->lv_blksize = strtol(token, 0, 0);		break;	case 5:		cbblrec->fs_lv_ratio = strtol(token, 0, 0);		break;	case 6:		cbblrec->fs_last_metablk = strtoull(token, 0, 16);		break;	case 7:		cbblrec->fs_first_wspblk = strtoull(token, 0, 16);		break;	case 8:		cbblrec->total_bad_blocks = strtol(token, 0, 0);		break;	case 9:		cbblrec->resolved_blocks = strtol(token, 0, 0);		break;	case 10:		cbblrec->reloc_extents = strtol(token, 0, 0);		break;	case 11:		cbblrec->reloc_blocks = strtol(token, 0, 0);		break;	case 12:		cbblrec->LVM_lists = strtoul(token, 0, 0);		break;	case 13:		strncpy(cbblrec->bufptr_eyecatcher, token, 8);		break;	case 14:		cbblrec->clrbblks_agg_recptr = (void *) strtoul(token, 0, 16);		break;	case 15:		cbblrec->ImapInoPtr = (void *) strtoul(token, 0, 16);		break;	case 16:		cbblrec->ImapCtlPtr = (void *) strtoul(token, 0, 16);		break;	case 17:		cbblrec->ImapLeafPtr = (void *) strtoul(token, 0, 16);		break;	case 18:		cbblrec->iagPtr = (void *) strtoul(token, 0, 16);		break;	case 19:		cbblrec->InoExtPtr = (void *) strtoul(token, 0, 16);		break;	}	rc = XPEEK_CHANGED;	goto changed;}				/* end display_cbblfsck() *//************************************************************* *  display_fsck_wsphdr() * * *****************  Sample output of display_fsck_wsphdr()[1] eyecatcher:			'wspblkmp'	[2] last_entry_pos:		0		[3] next_entry_pos: 		0		[4] start_time: 		2/5/999.11.2[5] end_time:	 		2/5/999.11.4	[6] return_code:		0[7] super_buff_addr:		0x164f0be0[8] agg_record_addr:		0x164f4cd0		[9] bmap_record_addr:		0x16463ce0		[10] fscklog_agg_offset:	0x000000003f786600	(0d01064855040)[11] fscklog_full:		0[12] fscklog_buf_allocated:	-1	[13] fscklog_buf_alloc_err:	0[14] num_logwrite_errors:	0 */int display_fsck_wsphdr(struct fsck_blk_map_hdr *wp){	int rc = XPEEK_OK;	char cmdline[512];	int field;	char *token;	char s1[9];      changed:	strncpy(s1, wp->hdr.eyecatcher, 8);	s1[8] = '\0';	printf("[1] eyecatcher:\t\t\t'%s'\n", s1);	printf("[2] last_entry_pos:\t\t%d\n", wp->hdr.last_entry_pos);	printf("[3] next_entry_pos:\t\t%d\n", wp->hdr.next_entry_pos);	printf("[4] start_time:\t\t\t%s\n", wp->hdr.start_time);	printf("[5] end_time:\t\t\t%s\n", wp->hdr.end_time);	printf("[6] return_code:\t\t%d\n", wp->hdr.return_code);	printf("[7] super_buff_addr:\t\t%8p\n", wp->hdr.super_buff_addr);	printf("[8] agg_record_addr:\t\t0x%8p\n", wp->hdr.agg_record_addr);	printf("[9] bmap_record_addr:\t\t0x%8p\n", wp->hdr.bmap_record_addr);	printf("[10] fscklog_agg_offset:\t0x%016llx    (0d0%lld)\n",	       (long long) wp->hdr.fscklog_agg_offset, (long long) wp->hdr.fscklog_agg_offset);	printf("[11] fscklog_full:\t\t%d\n", wp->hdr.fscklog_full);	printf("[12] fscklog_buf_allocated:\t%d\n", wp->hdr.fscklog_buf_allocated);	printf("[13] fscklog_buf_alloc_err:\t%d\n", wp->hdr.fscklog_buf_alloc_err);	printf("[14] num_logwrite_errors:\t%d\n", wp->hdr.num_logwrite_errors);      retry:	fputs("display_fsck_wsphdr: [m]odify or e[x]it: ", stdout);	fgets(cmdline, 512, stdin);	token = strtok(cmdline, " 	\n");	if (token == 0 || token[0] != 'm')		return rc;	field = m_parse(cmdline, 14, &token);	if (field == 0)		goto retry;	switch (field) {	case 1:		strncpy(wp->hdr.eyecatcher, token, 8);		break;	case 2:		wp->hdr.last_entry_pos = strtol(token, 0, 0);		break;	case 3:		wp->hdr.next_entry_pos = strtol(token, 0, 0);		break;	case 4:		strncpy(wp->hdr.start_time, token, 16);		break;	case 5:		strncpy(wp->hdr.end_time, token, 16);		break;	case 6:		wp->hdr.return_code = strtol(token, 0, 0);		break;	case 7:		wp->hdr.super_buff_addr = (char *) strtoul(token, 0, 16);		break;	case 8:		wp->hdr.agg_record_addr = (char *) strtoul(token, 0, 16);		break;	case 9:		wp->hdr.bmap_record_addr = (char *) strtoul(token, 0, 16);		break;	case 10:		wp->hdr.fscklog_agg_offset = strtoull(token, 0, 16);		break;	case 11:		wp->hdr.fscklog_full = strtol(token, 0, 0);		break;	case 12:		wp->hdr.fscklog_buf_allocated = strtol(token, 0, 0);		break;	case 13:		wp->hdr.fscklog_buf_alloc_err = strtol(token, 0, 0);		break;	case 14:		wp->hdr.num_logwrite_errors = strtol(token, 0, 8);		break;	}	rc = XPEEK_CHANGED;	goto changed;}				/* end display_fsck_wsphdr() *//************************************************************* *  display_logsuper() * * *****************  Sample output of display_logsuper()[1]  magic:			0x87654321[2]  version:			1[3]  serial:			5[4]  log size (# blocks):	32768	(at 4096 bytes/log block)[5]  agg block size:		4096	(bytes)[6]  log2(agg blk size):	12[7]  flag:			0x10200100[8]  state:			0x00000000  LOGMOUNT[9]  end:			0x5dd4  (d 24020)[10] uuid:			5a845eb7-31ee-451f-8c5d-ef517b08c9d5[11] label:			'                'active file systems:[]  active[0]:	c60fb757-05e5-4014-a1ea-6f2ad08073b2 */int display_logsuper(struct logsuper * lsp){	int rc = XPEEK_OK;	char cmdline[512];	int field;	char *token;	char *state;	char uuid_unparsed[37];	int i, uuid_rc;	bool active_fs = false;      changed:	switch (lsp->state) {	case LOGMOUNT:		state = "LOGMOUNT";		break;	case LOGREDONE:		state = "LOGREDONE";		break;	case LOGWRAP:		state = "LOGWRAP";		break;	case LOGREADERR:		state = "LOGREADERR";		break;	default:		state = "Unknown State";		break;	}	printf("[1]  magic:\t\t\t0x%x\n", lsp->magic);	printf("[2]  version:\t\t\t%d\n", lsp->version);	printf("[3]  serial:\t\t\t%d\n", lsp->serial);	printf("[4]  log size (# blocks):\t%d\t(at 4096 bytes/log block)\n", lsp->size);	printf("[5]  agg block size:\t\t%d\t(bytes)\n", lsp->bsize);	printf("[6]  log2(agg blk size):\t%d\n", lsp->l2bsize);	printf("[7]  flag:\t\t\t0x%08x\n", lsp->flag);	printf("[8]  state:\t\t\t0x%08x  %s\n", lsp->state, state);	printf("[9]  end:\t\t\t0x%x  (d %d)\n", lsp->end, lsp->end);	uuid_unparse(lsp->uuid, uuid_unparsed);	printf("[10] uuid:\t\t\t%s\n", uuid_unparsed);	printf("[11] label:\t\t\t'%16s'\n", lsp->label);	printf("active file systems:\n");	for (i = 0; i < MAX_ACTIVE; i++) {		uuid_unparse(lsp->active[i], uuid_unparsed);		/* only print active (non-zero uuid) file systems */		if (strncmp(uuid_unparsed, "00000000-0000-0000-0000-000000000000", 36)) {			printf("[]  active[%d]:\t%s\n", i, uuid_unparsed);			active_fs = true;		}	}	if (!active_fs) {		printf("None active.\n");	}      retry:	fputs("\ndisplay_logsuper: [m]odify or e[x]it: ", stdout);	fgets(cmdline, 512, stdin);	token = strtok(cmdline, " 	\n");	if (token == 0 || token[0] != 'm')		return rc;	field = m_parse(cmdline, 11, &token);	if (field == 0)		goto retry;	switch (field) {	case 1:		lsp->magic = strtoul(token, 0, 16);		break;	case 2:		lsp->version = strtol(token, 0, 0);		break;	case 3:		lsp->serial = strtol(token, 0, 0);		break;	case 4:		lsp->size = strtol(token, 0, 0);		break;	case 5:		lsp->bsize = strtol(token, 0, 0);		break;	case 6:		lsp->l2bsize = strtol(token, 0, 0);		break;	case 7:		lsp->flag = strtoul(token, 0, 16);		break;	case 8:		lsp->state = strtoul(token, 0, 16);		break;	case 9:		lsp->end = strtoul(token, 0, 16);		break;	case 10:		strncpy(uuid_unparsed, token, 36);		uuid_rc = uuid_parse(uuid_unparsed, lsp->uuid);		if (uuid_rc) {			fputs			    ("\ndisplay_logsuper: uuid_parse() FAILED.  uuid entered in improper format.\n",			     stderr);			goto retry;		}		break;	case 11:		strncpy(lsp->label, token, 16);		break;	}	rc = XPEEK_CHANGED;	goto changed;}				/* end display_logsuper() *//************************************************************* *  get_fsckwsphdr() * */int get_fsckwsphdr(struct fsck_blk_map_hdr *wsphdr_ptr){	if (xRead(fsckwsp_offset, PSIZE, (char *) wsphdr_ptr)) {		fputs("get_fsckwsphdr: error returned from xRead(fsckwsp_offset)\n\n", stderr);		return (-2);	}	/* swap if on big endian machine */	ujfs_swap_fsck_blk_map_hdr(wsphdr_ptr);	return (0);}				/* end get_fsckwsphdr() *//************************************************************* *  put_fsckwsphdr() * */int put_fsckwsphdr(struct fsck_blk_map_hdr * wsphdr_ptr){	/* swap if on big endian machine */	ujfs_swap_fsck_blk_map_hdr(wsphdr_ptr);	if (xWrite(fsckwsp_offset, PSIZE, (char *) wsphdr_ptr)) {		fputs("put_fsckwsphdr: error returned from xWrite(fsckwsp_offset)\n\n", stderr);		/* swap back if on big endian machine */		ujfs_swap_fsck_blk_map_hdr(wsphdr_ptr);		return (-4);	}	/* swap back if on big endian machine */	ujfs_swap_fsck_blk_map_hdr(wsphdr_ptr);	return (0);}				/* end put_fsckwsphdr() */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -