119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * bitmaps.c --- routines to read, write, and manipulate the inode and 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * block bitmaps. 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header% 88558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * This file may be redistributed under the terms of the GNU Library 98558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * General Public License, version 2. 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header% 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h> 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SYS_STAT_H 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SYS_TYPES_H 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2_fs.h" 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fs.h" 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtvoid ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap) 313984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_free_generic_bitmap(bitmap); 333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtvoid ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap) 363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_free_generic_bitmap(bitmap); 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src, 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_generic_bitmap *dest) 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_copy_generic_bitmap(src, dest)); 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ext2fs_set_bitmap_padding(ext2fs_generic_bitmap map) 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 483984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_set_generic_bitmap_padding(map); 493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs, 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *descr, 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_inode_bitmap *ret) 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u32 start, end, real_end; 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->write_bitmaps = ext2fs_write_bitmaps; 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project start = 1; 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project end = fs->super->s_inodes_count; 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project real_end = (EXT2_INODES_PER_GROUP(fs->super) * fs->group_desc_count); 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_make_generic_bitmap(EXT2_ET_MAGIC_INODE_BITMAP, fs, 663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt start, end, real_end, 673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt descr, 0, ret)); 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs, 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *descr, 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_block_bitmap *ret) 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u32 start, end, real_end; 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->write_bitmaps = ext2fs_write_bitmaps; 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project start = fs->super->s_first_data_block; 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project end = fs->super->s_blocks_count-1; 823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt real_end = (EXT2_BLOCKS_PER_GROUP(fs->super) 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * fs->group_desc_count)-1 + start; 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 853984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_make_generic_bitmap(EXT2_ET_MAGIC_BLOCK_BITMAP, fs, 863984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt start, end, real_end, 873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt descr, 0, ret)); 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap, 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t end, ext2_ino_t *oend) 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 933984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 943984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_fudge_generic_bitmap_end(bitmap, 953984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_ET_MAGIC_INODE_BITMAP, 963984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_ET_FUDGE_INODE_BITMAP_END, 973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt end, oend)); 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap, 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t end, blk_t *oend) 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 1033984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_fudge_generic_bitmap_end(bitmap, 1043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_ET_MAGIC_BLOCK_BITMAP, 1053984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_ET_FUDGE_BLOCK_BITMAP_END, 1063984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt end, oend)); 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap) 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 1113984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_clear_generic_bitmap(bitmap); 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap) 11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 1163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_clear_generic_bitmap(bitmap); 1173984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 1183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 1193984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidterrcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end, 1203984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_inode_bitmap bmap) 1213984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 1223984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_resize_generic_bitmap(EXT2_ET_MAGIC_INODE_BITMAP, 1233984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt new_end, new_real_end, bmap)); 1243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 1253984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 1263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidterrcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end, 1273984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_block_bitmap bmap) 1283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 1293984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_resize_generic_bitmap(EXT2_ET_MAGIC_BLOCK_BITMAP, 1303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt new_end, new_real_end, bmap)); 1313984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidterrcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1, 1343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_block_bitmap bm2) 1353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 1363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_compare_generic_bitmap(EXT2_ET_MAGIC_BLOCK_BITMAP, 1373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_ET_NEQ_BLOCK_BITMAP, 1383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt bm1, bm2)); 1393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 1403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 1413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidterrcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1, 1423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_inode_bitmap bm2) 1433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 1443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_compare_generic_bitmap(EXT2_ET_MAGIC_INODE_BITMAP, 1453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_ET_NEQ_INODE_BITMAP, 1463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt bm1, bm2)); 1473984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 1483984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 1493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidterrcode_t ext2fs_set_inode_bitmap_range(ext2fs_inode_bitmap bmap, 1503984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2_ino_t start, unsigned int num, 1513984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt void *in) 1523984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 1533984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_set_generic_bitmap_range(bmap, 1543984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_ET_MAGIC_INODE_BITMAP, 1553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt start, num, in)); 1563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 1573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 1583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidterrcode_t ext2fs_get_inode_bitmap_range(ext2fs_inode_bitmap bmap, 1593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2_ino_t start, unsigned int num, 1603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt void *out) 1613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 1623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_get_generic_bitmap_range(bmap, 1633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_ET_MAGIC_INODE_BITMAP, 1643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt start, num, out)); 1653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 1663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 1673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidterrcode_t ext2fs_set_block_bitmap_range(ext2fs_block_bitmap bmap, 1683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_t start, unsigned int num, 1693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt void *in) 1703984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 1713984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_set_generic_bitmap_range(bmap, 1723984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_ET_MAGIC_BLOCK_BITMAP, 1733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt start, num, in)); 1743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 1753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 1763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidterrcode_t ext2fs_get_block_bitmap_range(ext2fs_block_bitmap bmap, 1773984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_t start, unsigned int num, 1783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt void *out) 1793984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 1803984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return (ext2fs_get_generic_bitmap_range(bmap, 1813984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_ET_MAGIC_BLOCK_BITMAP, 1823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt start, num, out)); 18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 184