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

📄 dmap.c

📁 在Linux内核从2.4升级到2.6时需要升级的软件包
💻 C
📖 第 1 页 / 共 2 页
字号:
		/* swap back if on big endian machine */		ujfs_swap_dmapctl(&ctl_page);		goto cpage_redisplay;	}	return DMAP_EXIT;}/**************************************************************************** ************************  Example output of display_leaf()Dmap Page at block 144[1] nblocks:		8192		[8] tree.budmin:	5[2] nfree:		7624		[9] tree.stree:		Hit <enter>[3] start:		0		[10] tree.pad:		Not Displayed[4] tree.nleafs:	256		[11] pad:		Not Displayed[5] tree.l2nleafs:	8		[12] wmap:		Type 'w'[6] tree.leafidx:	85		[13] pmap:		Type 'p'[7] tree.height:	4 ***************************************************************************/int display_leaf(struct dinode * bmap_inode, int64_t * lblock){	int64_t address;	int changed = 0;	char cmdline[80];	struct dmap d_map;	int field;	int rc;	char *token;	int dmap, l0, l1;	decode_pagenum(*lblock, &l1, &l0, &dmap);	if (ujfs_rwdaddr(fp, &address, bmap_inode, (*lblock) << dmap_l2bpp,			 GET, bsize) || xRead(address, sizeof (struct dmap), (char *) &d_map)) {		fputs("display_leaf: Error reading dmap page!\n", stderr);		return DMAP_EXIT;	}	/* swap if on big endian machine */	ujfs_swap_dmap(&d_map);      leaf_redisplay:	printf("\nDmap Page at block %lld\n\n", (long long) (address >> l2bsize));	printf("[1] nblocks:\t\t%d\t\t", d_map.nblocks);	printf("[8] tree.budmin:\t%d\n", d_map.tree.budmin);	printf("[2] nfree:\t\t%d\t\t", d_map.nfree);	printf("[9] tree.stree:\t\tHit <enter>\n");	printf("[3] start:\t\t%lld\t\t", (long long) d_map.start);	printf("[10] tree.pad:\t\tNot Displayed\n");	printf("[4] tree.nleafs:\t%d\t\t", d_map.tree.nleafs);	printf("[11] pad:\t\tNot Displayed\n");	printf("[5] tree.l2nleafs:\t%d\t\t", d_map.tree.l2nleafs);	printf("[12] wmap:\t\tType 'w'\n");	printf("[6] tree.leafidx:\t%d\t\t", d_map.tree.leafidx);	printf("[13] pmap:\t\tType 'p'\n");	printf("[7] tree.height:\t%d\n", d_map.tree.height);      leaf_retry:	fputs("[m]odify, [u]p, [r]ight or [l]eft, [w]map, [p]map, e[x]it, [s]tree > ", stdout);	fgets(cmdline, 80, stdin);	token = strtok(cmdline, " 	\n");	if ((token == 0) || (token[0] == 's')) {		rc = display_tree((struct dmapctl *) & d_map.tree, lblock, &changed);		/* swap if on big endian machine */		ujfs_swap_dmap(&d_map);		if (changed && xWrite(address, sizeof (struct dmap), (char *) &d_map)) {			fputs("display_leaf: Error writing dmap page!\n", stderr);			/* swap back if on big endian machine */			ujfs_swap_dmap(&d_map);			return DMAP_EXIT;		}		/* swap back if on big endian machine */		ujfs_swap_dmap(&d_map);		return rc;	}	if (token[0] == 'u') {		*lblock = L0PAGE(l1, l0);		return DISPLAY_CPAGE;	}	if (token[0] == 'r') {		if (dmap < LPERCTL - 1) {			*lblock = DMAPPAGE(l1, l0, dmap + 1);			return (DISPLAY_LEAF);		}		if (dmap_level > 0) {			if (l0 < LPERCTL - 1) {				*lblock = DMAPPAGE(l1, l0 + 1, 0);				return (DISPLAY_LEAF);			}			if ((dmap_level == 2) && (l1 < LPERCTL - 1)) {				*lblock = DMAPPAGE(l1 + 1, 0, 0);				return (DISPLAY_LEAF);			}		}		fputs("display_leaf: No right sibling.\n", stderr);		goto leaf_retry;	}	if (token[0] == 'l') {		if (dmap > 0) {			*lblock = DMAPPAGE(l1, l0, dmap - 1);			return (DISPLAY_LEAF);		}		if (dmap_level > 0) {			if (l0 > 0) {				*lblock = DMAPPAGE(l1, l0 - 1, LPERCTL - 1);				return (DISPLAY_LEAF);			}			if ((dmap_level == 2) && (l1 > 0)) {				*lblock = DMAPPAGE(l1 - 1, LPERCTL - 1, LPERCTL - 1);				return (DISPLAY_LEAF);			}		}		fputs("display_leaf: No left sibling.\n", stderr);		goto leaf_retry;	}	if ((token[0] == 'p') || (token[0] == 'w')) {		if (token[0] == 'p')			rc = display_map(d_map.pmap, LPERDMAP);		else			rc = display_map(d_map.wmap, LPERDMAP);		/* swap if on big endian machine */		ujfs_swap_dmap(&d_map);		if ((rc & XPEEK_CHANGED) && xWrite(address, sizeof (struct dmap), (char *) &d_map)) {			fputs("display_leaf: Error writing dmap page!\n", stderr);			/* swap back if on big endian machine */			ujfs_swap_dmap(&d_map);			return DMAP_EXIT;		}		/* swap back if on big endian machine */		ujfs_swap_dmap(&d_map);		if (rc & XPEEK_REDISPLAY)			goto leaf_redisplay;		return DMAP_EXIT;	}	if (token[0] != 'm')	/* assume 'x'     */		return DMAP_EXIT;	field = m_parse(cmdline, 8, &token);	if (field == 0)		goto leaf_retry;	switch (field) {	case 1:		d_map.nblocks = strtoul(token, 0, 0);		break;	case 2:		d_map.nfree = strtoul(token, 0, 0);		break;	case 3:		d_map.start = strtoull(token, 0, 0);		break;	case 4:		d_map.tree.nleafs = strtoul(token, 0, 0);		break;	case 5:		d_map.tree.l2nleafs = strtoul(token, 0, 0);		break;	case 6:		d_map.tree.leafidx = strtoul(token, 0, 0);		break;	case 7:		d_map.tree.height = strtoul(token, 0, 0);		break;	case 8:		d_map.tree.budmin = strtoul(token, 0, 0);		break;	}	goto leaf_redisplay;}/**************************************************************************** ************************  Example output of display_leaf()Level 4				  [ 0] 10                              /-------/  \-------\                     /-------/			  \-------\            /-------/					   \-------\           /							    \   [  0]  9	       [  1]  8		   [  2] 10	       [  3] 10         /\		     /\ 		 /\		     /\       /    \		   /	\	       /    \		   /	\     /	      \ 	 /	  \	     /	      \ 	 /	  \   /		\      /	    \	   /		\      /	    \  6    8    8    9    8    8    8    8   10   -1    8    9   10   -1    9    8   0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15 ***************************************************************************/int display_tree(struct dmapctl *ctlpage, int64_t *lblock, int *changed){	char cmdline[80];	int i, j;	int level;	int index;	char *token;	/* tree_offset[height of tree - level] is offset of first element	   of that level */	static int tree_offset[6] = { 0, 1, 5, 21, 85, 341 };	int dmap, l0, l1, type;	int offset;	int top_index = 0;	int top_level = ctlpage->height;	if ((ctlpage->height < 1) || (ctlpage->height > 5)) {		fprintf(stderr,			"display_tree is confused.  ctlpage->height = %d\n", ctlpage->height);		return DMAP_EXIT;	}	type = decode_pagenum(*lblock, &l1, &l0, &dmap);      redisplay_tree:	offset = tree_offset[ctlpage->height - top_level];	printf("\nLevel %d\t\t\t\t  [%2d] %2d\n", top_level, top_index,	       ctlpage->stree[offset + top_index]);	i = top_index << 2;	level = top_level - 1;	offset = tree_offset[ctlpage->height - level];	printf("\t\t\t      /-------/  \\-------\\\n");	printf("\t\t     /-------/\t\t\t  \\-------\\\n");	printf("\t    /-------/\t\t\t\t\t   \\-------\\\n");	printf("\t   /\t\t\t\t\t\t\t    \\\n");	printf("   [%3d] %2d\t       [%3d] %2d\t\t   [%3d] %2d\t       [%3d] %2d\n",	       i, ctlpage->stree[offset + i],	       i + 1, ctlpage->stree[offset + i + 1],	       i + 2, ctlpage->stree[offset + i + 2], i + 3, ctlpage->stree[offset + i + 3]);	if (level > 0) {		i = top_index << 4;		level--;		offset = tree_offset[ctlpage->height - level];		printf("\t /\\\t\t     /\\ \t\t /\\\t\t     /\\\n");		printf("       /    \\\t\t   /\t\\\t       /    \\\t\t   /\t\\\n");		printf("     /\t      \\ \t /\t  \\\t     /\t      \\ \t /\t  \\\n");		printf("   /\t\t\\      /\t    \\\t   /\t\t\\      /\t    \\\n");		printf(" %2d", ctlpage->stree[offset + i]);		for (j = i + 1; j < i + 16; j++)			printf("   %2d", ctlpage->stree[offset + j]);		printf("\n\n%4d", i);		for (j = i + 1; j < i + 16; j++)			printf(" %4d", j);		printf("\n");	}      tree_retry:	fputs("\n[b]ack, [d]escend, [g]oto, [m]odify, [r]ight, [l]eft, [u]p, e[x]it > ", stdout);	fgets(cmdline, 80, stdin);	token = strtok(cmdline, " 	\n");	if ((token == 0) || (token[0] == 'x'))		return DMAP_EXIT;	if (token[0] == 'l') {		if (top_index == 0) {	/* Need to move to another page */			fputs("For now, go [b]ack, then go left\n", stdout);			goto tree_retry;		}		top_index--;		goto redisplay_tree;	}	if (token[0] == 'r') {		if (top_index == (1 << ((ctlpage->height - top_level) << 1)) - 1) {			fputs("For now, [b]ack then go right\n", stdout);			goto tree_retry;		}		top_index++;		goto redisplay_tree;	}	if (token[0] == 'g') {		token = strtok(0, " 	\n");		if (token == 0) {			fputs("Please enter: level index > ", stdout);			fgets(cmdline, 80, stdin);			token = strtok(cmdline, " 	\n");			if (token == 0)				goto tree_retry;		}		level = strtoul(token, 0, 0);		token = strtok(0, " 	\n");		if (token == 0) {			fputs("Not enough arguments\n", stderr);			goto tree_retry;		}		index = strtoul(token, 0, 0);		if ((level < 0) || (level > ctlpage->height) || (index < 0) ||		    (index >= (1 << ((ctlpage->height - level) << 1)))) {			fputs("Invalid level and/or index\n", stderr);			goto tree_retry;		}		if ((level == 1) && ctlpage->height > 1) {			level++;			index >>= 2;		} else if (level == 0) {			if (ctlpage->height == 1) {	/* is this possible? */				level++;				index >>= 2;			} else {				level += 2;				index >>= 4;			}		}		top_level = level;		top_index = index;		goto redisplay_tree;	}	if (token[0] == 'u') {		if (top_level == ctlpage->height) {	/* At top of tree */			fputs("Already at top of tree.\n", stdout);			goto tree_retry;		}		/* Move up one level */		top_level++;		top_index >>= 2;		goto redisplay_tree;	}	if (token[0] == 'd') {		if (type == DMAP) {			fputs("[d]escend only valid for control pages\n", stderr);			goto tree_retry;		}		token = strtok(0, " 	\n");		if (token == 0) {			fputs("Please enter: leaf# > ", stdout);			fgets(cmdline, 80, stdin);			token = strtok(cmdline, " 	\n");			if (token == 0)				goto tree_retry;		}		index = strtoul(token, 0, 0);		if ((index < 0) || (index >= ctlpage->nleafs)) {			fputs("Invalid leaf index\n", stderr);			goto tree_retry;		}		if (type == LEVEL0) {			*lblock = DMAPPAGE(l1, l0, index);			return DISPLAY_LEAF;		}		if (type == LEVEL1)			*lblock = L0PAGE(l1, index);		else		/* LEVEL2 */			*lblock = L1PAGE(index);		return DISPLAY_CPAGE;	}	if (token[0] != 'm') {	/* Assuming 'b' */		if (type == DMAP)			return DISPLAY_LEAF;		else			return DISPLAY_CPAGE;	}	token = strtok(0, " 	\n");	if (token == 0) {		fputs("Please enter: level index value > ", stdout);		fgets(cmdline, 80, stdin);		token = strtok(0, " 	\n");		if (token == 0)			goto tree_retry;	}	level = strtol(token, 0, 0);	token = strtok(0, " 	\n");	if (token == 0) {		fputs("Not enough arguments!\n", stderr);		goto tree_retry;	}	index = strtol(token, 0, 0);	token = strtok(0, " 	\n");	if (token == 0) {		fputs("Not enough arguments!\n", stderr);		goto tree_retry;	}	if ((level < 0) || (level > ctlpage->height) || (index < 0) ||	    (index >= (1 << ((ctlpage->height - level) << 1)))) {		fputs("Invalid level and/or index\n", stderr);		goto tree_retry;	}	ctlpage->stree[tree_offset[ctlpage->height - level] + index] = strtol(token, 0, 0);	*changed = 1;	goto redisplay_tree;}int decode_pagenum(int64_t page, int *l1, int *l0, int *dmap){	int remainder;	if (page == 0)		return -1;	if (page == 1)		return LEVEL2;	*l1 = (page - 2) / L1FACTOR;	remainder = (page - 2) % L1FACTOR;	if (remainder == 0)		return LEVEL1;	*l0 = (remainder - 1) / L0FACTOR;	remainder = (remainder - 1) % L0FACTOR;	if (remainder == 0)		return LEVEL0;	*dmap = remainder - 1;	return DMAP;}int display_agfree(int64_t * agfree){	char cmdline[80];	int end;	int i;	int index;	int rc = XPEEK_OK;	int start = 0;	char *token;      agfree_display:	end = MIN(start + 64, MAXAG);	for (i = start; i < end; i += 4)		printf("%3d 0x%016llx 0x%016llx 0x%016llx 0x%016llx\n", i, (long long) agfree[i],		       (long long) agfree[i + 1], (long long) agfree[i + 2],		       (long long) agfree[i + 3]);      agfree_retry:	fputs("display_agfree: [m]odify, [b]ack, e[x]it > ", stdout);	fgets(cmdline, 80, stdin);	token = strtok(cmdline, " 	\n");	if (token == 0) {		start = (end < MAXAG) ? end : 0;		goto agfree_display;	}	if (token[0] == 'x')		return rc;	if (token[0] != 'm') {	/* assuming 'b' */		return (rc | XPEEK_REDISPLAY);	}	index = m_parse(cmdline, MAXAG - 1, &token);	if (index == 0)		goto agfree_retry;	agfree[index] = strtoull(token, 0, 16);	rc = XPEEK_CHANGED;	goto agfree_display;}

⌨️ 快捷键说明

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