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

📄 bitmap.c

📁 reiserfsprogs-3.6.19.tar.gz 源码 给有需要的人!
💻 C
📖 第 1 页 / 共 2 页
字号:
	p += copied;	to_copy -= copied;	/* next bitmap block */	if (spread_bitmaps (fs))	    block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8);	else	    block ++;    }    return 1;}void reiserfs_bitmap_zero (reiserfs_bitmap_t * bm){    memset (bm->bm_map, 0, bm->bm_byte_size);    bm->bm_set_bits = 0;    bm->bm_dirty = 1;}void reiserfs_bitmap_fill (reiserfs_bitmap_t * bm){    memset (bm->bm_map, 0xff, bm->bm_byte_size);    bm->bm_set_bits = bm->bm_bit_size;    bm->bm_dirty = 1;}/* format of bitmap saved in a file:   magic number (32 bits)   bm_bit_size (32 bits)   number of ranges of used and free blocks (32 bits)   number of contiguously used block, .. of free blocks, used, free, etc   magic number (32 bits) */#define BITMAP_START_MAGIC 374031#define BITMAP_END_MAGIC 7786472FILE * open_file (char * filename, char * option){    FILE * fp = fopen (filename, option);    if (!fp) {	reiserfs_warning (stderr, "open_file: could not open file %s\n", filename);	return 0;    }    reiserfs_warning (stderr, "Temp file opened by fsck: \"%s\" .. \n", filename);    return fp;}void close_file (FILE * fp){    fclose (fp);    /*reiserfs_warning (stderr, "done\n"); fflush (stderr);*/}void reiserfs_bitmap_save (FILE * fp, reiserfs_bitmap_t * bm){//    FILE * fp;    __u32 v;    int zeros;    int count;    unsigned int i;    int extents;    long position;  /*  fp = fopen (filename, "w+");    if (!fp) {	reiserfs_warning (stderr, "reiserfs_bitmap_save: could not save bitmap in %s: %s",			  filename, strerror(errno));	return;    }*///    reiserfs_warning (stderr, "Saving bitmap in \"%s\" .. ", filename); fflush (stderr);	    v = BITMAP_START_MAGIC;    fwrite (&v, 4, 1, fp);    v = bm->bm_bit_size;    fwrite (&v, 4, 1, fp);    /*printf ("SAVE: bit_size - %d\n", v);*/    position = ftell(fp);    if (fseek (fp, 4, SEEK_CUR)) {	reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s\n", strerror(errno));//	fclose (fp);	return;    }    zeros = 0;    count = 0;    extents = 0;    for (i = 0; i < v; i ++) {	if (reiserfs_bitmap_test_bit (bm, i)) {	    if (zeros) {		/* previous bit was not set, write amount of not set                   bits, switch to count set bits */		fwrite (&count, 4, 1, fp);		/*printf ("SAVE: Free %d\n", count);*/		extents ++;		count = 1;		zeros = 0;	    } else {		/* one more zero bit appeared */		count ++;	    }	} else {	    /* zero bit found */	    if (zeros) {		count ++;	    } else {		/* previous bit was set, write amount of set bits,                   switch to count not set bits */		fwrite (&count, 4, 1, fp);		/*printf ("SAVE: Used %d\n", count);*/		extents ++;		count = 1;		zeros = 1;	    }	}    }    fwrite (&count, 4, 1, fp);    extents ++;/*    if (zeros)	printf ("SAVE: Free %d\n", count);    else		printf ("SAVE: Used %d\n", count);*/    v = BITMAP_END_MAGIC;    fwrite (&v, 4, 1, fp);    if (fseek (fp, position, SEEK_SET)) {	reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s", strerror(errno));	return;    }    fwrite (&extents, 4, 1, fp);    if (fseek (fp, 0, SEEK_END)) {	reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s", strerror(errno));	return;    }}/* format of fsck dump file:        after pass0   magic number                 (32 bits)   passed stage number   bitmap of leaves   bitmap of good_unfm   bitmap of bad_unfm   magic number                 (32 bits) */#define FSCK_DUMP_START_MAGIC 374033#define FSCK_DUMP_END_MAGIC 7786470void reiserfs_begin_stage_info_save(FILE * file, unsigned long stage){    __u32 v = FSCK_DUMP_START_MAGIC;    fwrite (&v, 4, 1, file);    fwrite (&stage, 4, 1, file);}void reiserfs_end_stage_info_save(FILE * file){    __u32 v = FSCK_DUMP_END_MAGIC;    fwrite (&v, 4, 1, file);}/*return last passed stage*/int is_stage_magic_correct (FILE * fp){    __u32 v;    if (fseek (fp, -4, SEEK_END)) {	reiserfs_warning (stderr, "is_stage_magic_correct: fseek failed: %s\n", 	    strerror(errno));	return -1;    }    fread (&v, 4, 1, fp);    if (v != FSCK_DUMP_END_MAGIC) {	reiserfs_warning (stderr, "is_stage_magic_correct: no magic found\n");		return -1;    }    if (fseek (fp, 0, SEEK_SET)) {	reiserfs_warning (stderr, "is_stage_magic_correct: fseek failed: %s\n", 	    strerror(errno));	return -1;    }    fread (&v, 4, 1, fp);    if (v != FSCK_DUMP_START_MAGIC) {	reiserfs_warning (stderr, "is_stage_magic_correct: no magic found\n");		return -1;    }    fread (&v, 4, 1, fp);    if (v != PASS_0_DONE && v != PASS_1_DONE && v != TREE_IS_BUILT && v != SEMANTIC_DONE && v != LOST_FOUND_DONE) {	reiserfs_warning (stderr, "is_stage_magic_correct: wrong pass found");		return -1;    }    return (__u16)v;}reiserfs_bitmap_t * reiserfs_bitmap_load (FILE * fp){//    FILE * fp;    __u32 v;    int count;    int i, j;    int extents;    int bit;    reiserfs_bitmap_t * bm;    /*    fp = fopen (filename, "r");    if (!fp) {	reiserfs_warning (stderr, "reiserfs_bitmap_load: fopen failed: %s\n", strerror(errno));	return 0;    }*/    fread (&v, 4, 1, fp);    if (v != BITMAP_START_MAGIC) {	reiserfs_warning (stderr, "reiserfs_bitmap_load: "			  "no bitmap start magic found");	//	fclose (fp);	return 0;    }	    /* read bit size of bitmap */    fread (&v, 4, 1, fp);    bm = reiserfs_create_bitmap (v);    if (!bm) {	reiserfs_warning (stderr, "reiserfs_bitmap_load: creation failed");	//	fclose (fp);	return 0;    }        /*printf ("LOAD: bit_size - %d\n", v);*/    fread (&extents, 4, 1, fp);    /*printf ("LOAD: extents - %d\n", extents);*/    bit = 0;    for (i = 0; i < extents; i ++) {	fread (&count, 4, 1, fp);/*	if (i % 2)	    printf ("LOAD: Free %d\n", count);	else	    printf ("LOAD: Used %d\n", count);*/	for (j = 0; j < count; j ++, bit ++)	    if (i % 2 == 0) {		reiserfs_bitmap_set_bit (bm, bit);	    }    }    fread (&v, 4, 1, fp);    /*printf ("LOAD: Endmagic %d\n", v);*///    fclose (fp);    if (v != BITMAP_END_MAGIC) {	reiserfs_warning (stderr, "reiserfs_bitmap_load: "			  "no bitmap end magic found");	return 0;    }    /*    reiserfs_warning (stderr, "%d bits set - done\n", reiserfs_bitmap_ones (bm));*/    fflush (stderr);    return bm;}void reiserfs_bitmap_invert (reiserfs_bitmap_t * bm){    unsigned int i;    /*reiserfs_warning (stderr, "Bitmap inverting..");fflush (stderr);*/    for (i = 0; i < bm->bm_bit_size; i ++) {	if (reiserfs_bitmap_test_bit (bm, i))	    reiserfs_bitmap_clear_bit (bm, i);	else	    reiserfs_bitmap_set_bit (bm, i);    }    /*reiserfs_warning (stderr, "done\n");*/}void reiserfs_free_ondisk_bitmap (reiserfs_filsys_t * fs){    if (fs->fs_bitmap2) {	reiserfs_delete_bitmap (fs->fs_bitmap2);	fs->fs_bitmap2 = 0;    }}/* read bitmap blocks */int reiserfs_open_ondisk_bitmap (reiserfs_filsys_t * fs){    if (fs->fs_bitmap2)	reiserfs_panic ("bitmap is initiaized already");    fs->fs_bitmap2 = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));    if (!fs->fs_bitmap2)	return -1;    if ((get_sb_block_count (fs->fs_ondisk_sb) + fs->fs_blocksize * 8 - 1) / 	(fs->fs_blocksize * 8) != get_sb_bmap_nr (fs->fs_ondisk_sb))     {	reiserfs_warning (stderr, "%s: wrong either bitmaps number,\n", __FUNCTION__);	reiserfs_warning (stderr, "count of blocks or blocksize, run with --rebuild-sb "	    "to fix it\n");	return -1;    }    	    return reiserfs_fetch_ondisk_bitmap (fs->fs_bitmap2, fs);}int reiserfs_create_ondisk_bitmap (reiserfs_filsys_t * fs){    if (fs->fs_bitmap2)	reiserfs_panic ("bitmap is initiaized already");    fs->fs_bitmap2 = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));    if (!fs->fs_bitmap2)	return 0;    return 1;}void reiserfs_close_ondisk_bitmap (reiserfs_filsys_t * fs){    if (!fs->fs_bitmap2)	return;    reiserfs_flush_to_ondisk_bitmap (fs->fs_bitmap2, fs);    reiserfs_free_ondisk_bitmap (fs);}

⌨️ 快捷键说明

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