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

📄 stat.c

📁 reiserfsprogs-3.6.19.tar.gz 源码 给有需要的人!
💻 C
字号:
/* * Copyright 2002-2004 by Hans Reiser, licensing governed by  * reiserfsprogs/README */#include "debugreiserfs.h"#include <search.h>#include <obstack.h>#define obstack_chunk_alloc malloc#define obstack_chunk_free free/* try to find blocks which contain only items which are *//* read blocks marked in debug_bitmap and collect statistic of it: number of stat data */struct {    unsigned long all;    unsigned long items [5];    unsigned long unique_keys; /* keys of stat datas */    unsigned long unique_entry_keys; /* keys which appear in directory entries */    unsigned long names; /* dir entries but "." and ".." */    unsigned long dir_blocks; /* block containing only one directory item */    unsigned long unique_items;    unsigned long leaves;    unsigned long blocks_to_skip;} fs_stat;/* store unique item heads */struct obstack items;/* tree sorting item heades by comp_items_1 */void * items_tree;static int comp_items_1 (const void * p1, const void * p2){    int retval;    struct item_head * ih1, * ih2;    /*        if (*(int *)p1 != *(int *)p2)      retval = 1;    else      retval = 0;    */    retval = comp_keys (p1, p2);    /*retval = comp_short_keys (p1, p2);*/    if (retval)	return retval;    ih1 = (struct item_head *)p1;    ih2 = (struct item_head *)p2;    if (get_ih_item_len (ih1) < get_ih_item_len (ih2))	return -1;    if (get_ih_item_len (ih1) > get_ih_item_len (ih2))	return 1;    if (get_ih_entry_count (ih1) < get_ih_entry_count (ih2))	return -1;    if (get_ih_entry_count (ih1) > get_ih_entry_count (ih2))	return 1;    return 0;}/*static void print_node (const void *nodep, VISIT value, int level){    int i;    if (value == leaf) {	for (i = 0; i < level; i ++)	    reiserfs_warning (stdout, "\t");	reiserfs_warning (stdout, "%H\n", *(struct item_head **)nodep);	return;    }    if (value == postorder) {	for (i = 0; i < level; i ++)	    reiserfs_warning (stdout, "\t");	reiserfs_warning (stdout, "%H\n", *(struct item_head **)nodep);    }}*/static int is_unique_item (struct obstack * ostack, void ** tree, void * ih){    void * res;    void * key1;    key1 = obstack_copy (ostack, ih, IH_SIZE);    res = tsearch (key1, tree, comp_items_1);    if (!res)	reiserfs_panic ("Too many keys found");/*    twalk (*tree, print_node);*//*    reiserfs_warning (stderr, "\n\n");*/    if (*(void **)res != key1) {	/* key is in tree already, remove it from obstack */      /*reiserfs_warning (stdout, "%H is skipped\n", ih);fflush (stdout);*/	obstack_free (ostack, key1);	return 0;    }    /*reiserfs_warning (stdout, "%k is added\n", ih);fflush (stdout);*/    return 1;}static void stat1_the_leaf (reiserfs_filsys_t * fs, struct buffer_head * bh){    int i, i_num;    struct item_head * ih;    int is_there_unique_item;    ih = B_N_PITEM_HEAD (bh, 0);    is_there_unique_item = 0;    i_num = leaf_item_number_estimate(bh);    for (i = 0; i < i_num; i ++, ih ++) {	/* count all items */	fs_stat.all ++;	if (is_unique_item (&items, &items_tree, ih)) {	    /* this is item we have not seen yet */	    fs_stat.unique_items ++;	    is_there_unique_item ++;	}    }    if (!is_there_unique_item) {	/* the node contains only items we have seen already. so we will skip           it */	fs_stat.blocks_to_skip ++;	reiserfs_bitmap_clear_bit (input_bitmap (fs), bh->b_blocknr);    } else {	ih = B_N_PITEM_HEAD (bh, 0);	/* node contains at least one unique item. We will put it in, count items of each type */	for (i = 0; i < i_num; i ++, ih ++) {	    fs_stat.items [get_type (&ih->ih_key)] ++;	}    }}/*static void stat2_the_leaf (struct buffer_head * bh){    int i;    struct item_head * ih;    ih = B_N_PITEM_HEAD (bh, 0);    for (i = 0; i < node_item_number (bh); i ++, ih ++) {	    }}*/void do_stat (reiserfs_filsys_t * fs){    unsigned long i;    unsigned long done, total;    struct buffer_head * bh;    int type;    FILE * fp;    obstack_init (&items);    items_tree = 0;/*    bh = bread (fs->s_dev, 8211, fs->s_blocksize);    stat1_the_leaf (fs, bh);        return;*/    /* pass 0 of stating */    total = reiserfs_bitmap_ones (input_bitmap (fs));    done = 0;    for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {	if (!reiserfs_bitmap_test_bit (input_bitmap (fs), i))	    continue;	print_how_far (stderr, &done, total, 1, be_quiet (fs));	bh = bread (fs->fs_dev, i, fs->fs_blocksize);	if (!bh) {	    printf ("could not read block %lu\n", i);	    continue;	}	type = who_is_this (bh->b_data, bh->b_size);	if (type != THE_LEAF && type != HAS_IH_ARRAY) {	    reiserfs_bitmap_clear_bit (input_bitmap (fs), i);	    brelse (bh);	    continue;	}	fs_stat.leaves ++;	stat1_the_leaf (fs, bh);	brelse (bh);    }    reiserfs_warning (stderr, "\nThere were found on the '%s' device:\n"		      "\tleaves %lu\n"		      "\ttotal number of items %lu\n"		      "\tblocks containing at least one unique item %lu\n"		      "\tblocks which can be skipped %lu\n"		      "\t\tstat data %lu\n"		      "\t\tindirect %lu\n"		      "\t\tdirect %lu\n"		      "\t\tdirectory items %lu\n"		      "\tunique items %lu\n",		      /*		      "\tnames there (but \".\" and \"..\") %lu\n"		      "\tpointing to unique keys %lu\n"		      "other items %lu\n"		      "blocks containing only 1 dir item %lu\n",		      */		      fs->fs_file_name,		      fs_stat.leaves,		      fs_stat.all,		      fs_stat.leaves - fs_stat.blocks_to_skip,		      fs_stat.blocks_to_skip,		      fs_stat.items [TYPE_STAT_DATA],		      fs_stat.items [TYPE_INDIRECT],		      fs_stat.items [TYPE_DIRECT],		      fs_stat.items [TYPE_DIRENTRY],		      fs_stat.unique_items);/*		      fs_stat.names,		      fs_stat.unique_keys,		      fs_stat.items [4],		      fs_stat.dir_blocks);*/    if (!input_bitmap_file_name(fs))	return;    fp = fopen (input_bitmap_file_name(fs), "w");    if (!fp) {	reiserfs_exit (1, "could not open %s to save bitmap: %m\n",		       input_bitmap_file_name(fs));    }    reiserfs_warning (stderr, "Updated bitmap contains %d blocks marked\n",		      reiserfs_bitmap_ones (input_bitmap (fs)));        reiserfs_bitmap_save (fp, input_bitmap (fs));    fclose (fp);    return;    /* pass 2 of stating */    reiserfs_warning (stderr, "Looking for blocks containing only keys not pointed by any of entries\n");    total = reiserfs_bitmap_ones (input_bitmap (fs));    done = 0;    for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {	if (!reiserfs_bitmap_test_bit (input_bitmap (fs), i))	    continue;	print_how_far (stderr, &done, total, 1, be_quiet (fs));	bh = bread (fs->fs_dev, i, fs->fs_blocksize);	if (!bh) {	    printf ("could not read block %lu\n", i);	    continue;	}	/*stat2_the_leaf (bh);*/    }}

⌨️ 快捷键说明

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