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

📄 iag.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 *//* *   FUNCTION: Display/modify an iag */#include "xpeek.h"#include <ctype.h>/* JFS includes */#include "jfs_endian.h"#include <jfs_xtree.h>#include <jfs_filsys.h>extern int64_t AIT_2nd_offset;	/* Defined and assigned in xpeek.c      */int change_iag(struct iag *);int display_ext(pxd_t *, char *);int display_map(unsigned *, int);void iag(){	int64_t address;	int64_t block_num;	char cmd_line[80];	struct iag iag;	int iagnum;	int rc;	char *token;	unsigned which_table = FILESYSTEM_I;	token = strtok(0, " 	\n");	if (token == 0) {		fputs("iag: Please enter: iagnum [ a | 0 ]\niag> ", stdout);		fgets(cmd_line, 80, stdin);		token = strtok(cmd_line, " 	\n");		if (token == 0)			return;	}	errno = 0;	iagnum = strtoul(token, 0, 0);	token = strtok(0, " 	\n");	if (token) {		if (token[0] == 'a')			which_table = AGGREGATE_I;		else if (token[0] == 's')			which_table = AGGREGATE_2ND_I;		else if (token[0] != '0') {			fputs("iag: invalide fileset\n\n", stderr);			return;		}	}	if (strtok(0, " 	\n")) {		fputs("iag: Too many arguments\n\n", stderr);		return;	}	if (find_iag(iagnum, which_table, &address) ||	    xRead(address, sizeof (struct iag), (char *) &iag)) {		fputs("iag: error reading iag\n\n", stderr);		return;	}	/* swap if on big endian machine */	ujfs_swap_iag(&iag);	block_num = address >> l2bsize;      changed:	printf("IAG %d at block %lld\n\n", iagnum, (long long) block_num);	display_iag(&iag);	if ((rc = change_iag(&iag)) == XPEEK_ERROR)		return;	if (rc & XPEEK_CHANGED) {		/* swap if on big endian machine */		ujfs_swap_iag(&iag);		if (xWrite(address, sizeof (struct iag), (char *) &iag)) {			fputs("iag: error writing iag\n\n", stderr);			/* swap back if on big endian machine */			ujfs_swap_iag(&iag);			return;		}		/* swap back if on big endian machine */		ujfs_swap_iag(&iag);	}	if (rc & XPEEK_REDISPLAY)		goto changed;	return;}/**************************************************************************** ************************  Sample output of display_iag()IAG 0 at block 440[1] agstart:		25		[12] extsmap[0]:	ffffffff[2] iagnum:		0	    	[13] extsmap[1]:	ffffffff[3] inofreefwd:		-1		[14] extsmap[2]:	ffffe000[4] inofreeback:	-1	    	[15] extsmap[3]:	00000000[5] extfreefwd:		-1		[16] nfreeinos:		284[6] extfreeback:	-1		[17] nfreeexts:		45[7] iagfree:		-1		[18] pad:		Not Displayed[8] inosmap[0]:		ffffffff	[19] wmap:		Type 'w'[9] inosmap[1]:		ffffffff	[20] pmap:		Type 'p'[10] inosmap[2]:	ff801fff	[21] inoext:		Type 'i'[11] inosmap[3]:	ffffffff ****************************************************************************/void display_iag(struct iag *iag){	printf("[1] agstart:\t\t%lld\t\t", (long long) iag->agstart);	printf("[12] extsmap[0]:\t%08x\n", iag->extsmap[0]);	printf("[2] iagnum:\t\t%d\t\t", iag->iagnum);	printf("[13] extsmap[1]:\t%08x\n", iag->extsmap[1]);	printf("[3] inofreefwd:\t\t%d\t\t", iag->inofreefwd);	printf("[14] extsmap[2]:\t%08x\n", iag->extsmap[2]);	printf("[4] inofreeback:\t%d\t\t", iag->inofreeback);	printf("[15] extsmap[3]:\t%08x\n", iag->extsmap[3]);	printf("[5] extfreefwd:\t\t%d\t\t", iag->extfreefwd);	printf("[16] nfreeinos:\t\t%d\n", iag->nfreeinos);	printf("[6] extfreeback:\t%d\t\t", iag->extfreeback);	printf("[17] nfreeexts:\t\t%d\n", iag->nfreeexts);	printf("[7] iagfree:\t\t%d\t\t", iag->iagfree);	printf("[18] pad:\t\tNot Displayed\n");	printf("[8] inosmap[0]:\t\t%08x\t", iag->inosmap[0]);	printf("[19] wmap:\t\tType 'w'\n");	printf("[9] inosmap[1]:\t\t%08x\t", iag->inosmap[1]);	printf("[20] pmap:\t\tType 'p'\n");	printf("[10] inosmap[2]:\t%08x\t", iag->inosmap[2]);	printf("[21] inoext:\t\tType 'i'\n");	printf("[11] inosmap[3]:\t%08x\n", iag->inosmap[3]);}int change_iag(struct iag *iag){	char cmdline[80];	int field;	char *token;      retry:	fputs("change_iag: [m]odify, [w]map, [p]map, [i]noext or e[x]it > ", stdout);	fgets(cmdline, 80, stdin);	token = strtok(cmdline, " 	\n");	if (token == 0 || token[0] == 'x')		return XPEEK_OK;	if (token[0] == 'w')		return display_map(iag->wmap, EXTSPERIAG);	if (token[0] == 'p')		return display_map(iag->pmap, EXTSPERIAG);	if (token[0] == 'i') {		return display_ext(iag->inoext, cmdline);	}	field = m_parse(cmdline, 17, &token);	if (field == 0)		goto retry;	switch (field) {	case 1:		iag->agstart = strtoll(token, 0, 0);		break;	case 2:		iag->iagnum = strtol(token, 0, 0);		break;	case 3:		iag->inofreefwd = strtol(token, 0, 0);		break;	case 4:		iag->inofreeback = strtol(token, 0, 0);		break;	case 5:		iag->extfreefwd = strtol(token, 0, 0);		break;	case 6:		iag->extfreeback = strtol(token, 0, 0);		break;	case 7:		iag->iagfree = strtol(token, 0, 0);		break;	case 8:		iag->inosmap[0] = strtoul(token, 0, 16);		break;	case 9:		iag->inosmap[1] = strtoul(token, 0, 16);		break;	case 10:		iag->inosmap[2] = strtoul(token, 0, 16);		break;	case 11:		iag->inosmap[3] = strtoul(token, 0, 16);		break;	case 12:		iag->extsmap[0] = strtoul(token, 0, 16);		break;	case 13:		iag->extsmap[1] = strtoul(token, 0, 16);		break;	case 14:		iag->extsmap[2] = strtoul(token, 0, 16);		break;	case 15:		iag->extsmap[3] = strtoul(token, 0, 16);		break;	case 16:		iag->nfreeinos = strtol(token, 0, 0);		break;	case 17:		iag->nfreeexts = strtol(token, 0, 0);		break;	}	return XPEEK_CHANGED | XPEEK_REDISPLAY;}#define XT_CMP(CMP, K, X) \{ \	int64_t offset64 = offsetXAD(X); \	(CMP) = ((K) >= offset64 + lengthXAD(X)) ? 1 : \		((K) < offset64) ? -1 : 0 ; \}int find_iag(unsigned iagnum, unsigned which_table, int64_t * address){	int base;	char buffer[PSIZE];	int cmp;	struct dinode fileset_inode;	int64_t fileset_inode_address;	int64_t iagblock;	int index;	int lim;	xtpage_t *page;	int rc;	if (which_table != FILESYSTEM_I &&	    which_table != AGGREGATE_I && which_table != AGGREGATE_2ND_I) {		fprintf(stderr, "find_iag: Invalid fileset, %d\n", which_table);		return 1;	}	iagblock = IAGTOLBLK(iagnum, L2PSIZE - l2bsize);	if (which_table == AGGREGATE_2ND_I) {		fileset_inode_address = AIT_2nd_offset + sizeof (struct dinode);	} else {		fileset_inode_address = AGGR_INODE_TABLE_START + (which_table * sizeof (struct dinode));	}	rc = xRead(fileset_inode_address, sizeof (struct dinode), (char *) &fileset_inode);	if (rc) {		fputs("find_inode: Error reading fileset inode\n", stderr);		return 1;	}	page = (xtpage_t *) & (fileset_inode.di_btroot);      descend:	/* Binary search */	for (base = XTENTRYSTART,	     lim = __le16_to_cpu(page->header.nextindex) - XTENTRYSTART; lim; lim >>= 1) {		index = base + (lim >> 1);		XT_CMP(cmp, iagblock, &(page->xad[index]));		if (cmp == 0) {			/* HIT! */			if (page->header.flag & BT_LEAF) {				*address = (addressXAD(&(page->xad[index]))					    + (iagblock - offsetXAD(&(page->xad[index]))))				    << l2bsize;				return 0;			} else {				rc = xRead(addressXAD(&(page->xad[index])) << l2bsize,					   PSIZE, buffer);				if (rc) {					fputs("find_iag: Error reading btree node\n", stderr);					return 1;				}				page = (xtpage_t *) buffer;				goto descend;			}		} else if (cmp > 0) {			base = index + 1;			--lim;		}	}	if (page->header.flag & BT_INTERNAL) {		/* Traverse internal page, it might hit down there		 * If base is non-zero, decrement base by one to get the parent		 * entry of the child page to search.		 */		index = base ? base - 1 : base;		rc = xRead(addressXAD(&(page->xad[index])) << l2bsize, PSIZE, buffer);		if (rc) {			fputs("find_iag: Error reading btree node\n", stderr);			return 1;		}		page = (xtpage_t *) buffer;		goto descend;	}	/* Not found! */	fprintf(stderr, "find_iag:  IAG %d not found!\n", iagnum);	return 1;}/* display_map is also called from display_page in dmap.c */int display_map(unsigned *map, int size){	char cmdline[80];	int end;	int i;	int index;	int rc = XPEEK_OK;	int start = 0;	char *token;      map_display:	end = MIN(start + 128, size);	for (i = start; i < end; i += 8) {		if ((i + 7) < 100)	/* [i-(i+7)] fits in first field */			printf("[%d-%d]\t", i, i + 7);		else			printf("[%d- ]\t", i);		printf("%08x %08x %08x %08x %08x %08x %08x %08x\n", map[i],		       map[i + 1], map[i + 2], map[i + 3], map[i + 4], map[i + 5], map[i + 6],		       map[i + 7]);	}      map_retry:	fputs("display_map: [m]odify, [b]ack, e[x]it\n", stdout);	fgets(cmdline, 80, stdin);	token = strtok(cmdline, " 	\n");	if (token == 0) {		start = (size > end) ? end : 0;		goto map_display;	}	if (token[0] == 'x')		return rc;	if (token[0] != 'm') {	/* assuming 'b' */		return (rc | XPEEK_REDISPLAY);	}	index = m_parse(cmdline, size - 1, &token);	if (index == 0)		goto map_retry;	map[index] = strtoul(token, 0, 16);	rc = XPEEK_CHANGED;	goto map_display;}int display_ext(pxd_t * ext, char *cmdline){	int field;	int index;	int rc = XPEEK_OK;	char *token;	token = strtok(0, " 	\n");	if (token == 0) {	      ext_retry:		fputs("Please enter: index [0-127] > ", stdout);		fgets(cmdline, 80, stdin);		token = strtok(cmdline, " 	\n");		if (token == 0)			return rc | XPEEK_REDISPLAY;	}      newext:	index = strtol(token, 0, 0);	if (index < 0 || index >= EXTSPERIAG) {		fputs("Invalid index\n", stderr);		goto ext_retry;	}      ext_changed:	printf("[1] inoext[%d].len:\t%d\n", index, ext[index].len);	printf("[2] inoext[%d].addr1:\t0x%02x\n", index, ext[index].addr1);	printf("[3] inoext[%d].addr2:\t0x%08x\n", index, ext[index].addr2);	printf("    addressPXD:\t\t%lld\n", (long long) addressPXD(&ext[index]));      ext_again:	fputs("display_ext: [m]odify, ext [#], [b]ack to iag, e[x]it > ", stdout);	fgets(cmdline, 80, stdin);	token = strtok(cmdline, " 	\n");	if (token == 0 || token[0] == 'x')		return rc;	if (isdigit(token[0]))		goto newext;	if (token[0] != 'm')	/* assuming 'b' */		return rc | XPEEK_REDISPLAY;	field = m_parse(cmdline, 3, &token);	if (field == 0)		goto ext_again;	switch (field) {	case 1:		ext[index].len = strtol(token, 0, 0);		break;	case 2:		ext[index].addr1 = strtol(token, 0, 16);		break;	case 3:		ext[index].addr2 = strtol(token, 0, 16);		break;	}	rc = XPEEK_CHANGED;	goto ext_changed;}

⌨️ 快捷键说明

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