errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs, const char *descr, ext2fs_inode_bitmap *ret) { __u64 start, end, real_end; EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); fs->write_bitmaps = ext2fs_write_bitmaps; start = 1; end = fs->super->s_inodes_count; real_end = (EXT2_INODES_PER_GROUP(fs->super) * fs->group_desc_count); /* Are we permitted to use new-style bitmaps? */ if (fs->flags & EXT2_FLAG_64BITS) return (ext2fs_alloc_generic_bmap(fs, EXT2_ET_MAGIC_INODE_BITMAP64, EXT2FS_BMAP64_BITARRAY, start, end, real_end, descr, ret)); /* Otherwise, check to see if the file system is small enough * to use old-style 32-bit bitmaps */ if ((end > ~0U) || (real_end > ~0U)) return EXT2_ET_CANT_USE_LEGACY_BITMAPS; return (ext2fs_make_generic_bitmap(EXT2_ET_MAGIC_INODE_BITMAP, fs, start, end, real_end, descr, 0, (ext2fs_generic_bitmap *) ret)); }
errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs, const char *descr, ext2fs_block_bitmap *ret) { __u64 start, end, real_end; EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); fs->write_bitmaps = ext2fs_write_bitmaps; start = fs->super->s_first_data_block; end = ext2fs_blocks_count(fs->super)-1; real_end = ((__u64) EXT2_BLOCKS_PER_GROUP(fs->super) * (__u64) fs->group_desc_count)-1 + start; if (fs->flags & EXT2_FLAG_64BITS) return (ext2fs_alloc_generic_bmap(fs, EXT2_ET_MAGIC_BLOCK_BITMAP64, EXT2FS_BMAP64_BITARRAY, start, end, real_end, descr, ret)); if ((end > ~0U) || (real_end > ~0U)) return EXT2_ET_CANT_USE_LEGACY_BITMAPS; return (ext2fs_make_generic_bitmap(EXT2_ET_MAGIC_BLOCK_BITMAP, fs, start, end, real_end, descr, 0, (ext2fs_generic_bitmap *) ret)); }
/* * ext2fs_allocate_block_bitmap() really allocates a per-cluster * bitmap for backwards compatibility. This function allocates a * block bitmap which is truly per-block, even if clusters/bigalloc * are enabled. mke2fs and e2fsck need this for tracking the * allocation of the file system metadata blocks. */ errcode_t ext2fs_allocate_subcluster_bitmap(ext2_filsys fs, const char *descr, ext2fs_block_bitmap *ret) { __u64 start, end, real_end; ext2fs_generic_bitmap bmap; errcode_t retval; EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); fs->write_bitmaps = ext2fs_write_bitmaps; if (!fs->cluster_ratio_bits) return ext2fs_allocate_block_bitmap(fs, descr, ret); if ((fs->flags & EXT2_FLAG_64BITS) == 0) return EXT2_ET_CANT_USE_LEGACY_BITMAPS; start = fs->super->s_first_data_block; end = ext2fs_blocks_count(fs->super)-1; real_end = ((__u64) EXT2_BLOCKS_PER_GROUP(fs->super) * (__u64) fs->group_desc_count)-1 + start; retval = ext2fs_alloc_generic_bmap(fs, EXT2_ET_MAGIC_BLOCK_BITMAP64, fs->default_bitmap_type, start, end, real_end, descr, &bmap); if (retval) return retval; bmap->cluster_bits = 0; *ret = bmap; return 0; }
static errcode_t undo_setup_tdb(struct undo_private_data *data) { int i; errcode_t retval; if (data->tdb_written == 1) return 0; data->tdb_written = 1; /* Make a bitmap to track what we've written */ memset(&data->fake_fs, 0, sizeof(data->fake_fs)); data->fake_fs.blocksize = data->tdb_data_size; retval = ext2fs_alloc_generic_bmap(&data->fake_fs, EXT2_ET_MAGIC_BLOCK_BITMAP64, EXT2FS_BMAP64_RBTREE, 0, ~1ULL, ~1ULL, "undo block map", &data->written_block_map); if (retval) return retval; /* Allocate key block */ retval = ext2fs_get_mem(data->tdb_data_size, &data->keyb); if (retval) return retval; data->key_blk_num = data->first_key_blk; /* Record block size */ dbg_printf("Undo block size %llu\n", data->tdb_data_size); dbg_printf("Keys per block %llu\n", KEYS_PER_BLOCK(data)); data->hdr.block_size = ext2fs_cpu_to_le32(data->tdb_data_size); io_channel_set_blksize(data->undo_file, data->tdb_data_size); /* Ensure that we have space for header blocks */ for (i = 0; i <= 2; i++) { retval = io_channel_read_blk64(data->undo_file, i, 1, data->keyb); if (retval) memset(data->keyb, 0, data->tdb_data_size); retval = io_channel_write_blk64(data->undo_file, i, 1, data->keyb); if (retval) return retval; retval = io_channel_flush(data->undo_file); if (retval) return retval; } memset(data->keyb, 0, data->tdb_data_size); return 0; }