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