📄 bitmap.c
字号:
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 + -