1*6a54128fSAndroid Build Coastguard Worker /* 2*6a54128fSAndroid Build Coastguard Worker * bmap64.h --- 64-bit bitmap structure 3*6a54128fSAndroid Build Coastguard Worker * 4*6a54128fSAndroid Build Coastguard Worker * Copyright (C) 2007, 2008 Theodore Ts'o. 5*6a54128fSAndroid Build Coastguard Worker * 6*6a54128fSAndroid Build Coastguard Worker * %Begin-Header% 7*6a54128fSAndroid Build Coastguard Worker * This file may be redistributed under the terms of the GNU Public 8*6a54128fSAndroid Build Coastguard Worker * License. 9*6a54128fSAndroid Build Coastguard Worker * %End-Header% 10*6a54128fSAndroid Build Coastguard Worker */ 11*6a54128fSAndroid Build Coastguard Worker 12*6a54128fSAndroid Build Coastguard Worker struct ext2_bmap_statistics { 13*6a54128fSAndroid Build Coastguard Worker int type; 14*6a54128fSAndroid Build Coastguard Worker struct timeval created; 15*6a54128fSAndroid Build Coastguard Worker 16*6a54128fSAndroid Build Coastguard Worker #ifdef ENABLE_BMAP_STATS_OPS 17*6a54128fSAndroid Build Coastguard Worker unsigned long copy_count; 18*6a54128fSAndroid Build Coastguard Worker unsigned long resize_count; 19*6a54128fSAndroid Build Coastguard Worker unsigned long mark_count; 20*6a54128fSAndroid Build Coastguard Worker unsigned long unmark_count; 21*6a54128fSAndroid Build Coastguard Worker unsigned long test_count; 22*6a54128fSAndroid Build Coastguard Worker unsigned long mark_ext_count; 23*6a54128fSAndroid Build Coastguard Worker unsigned long unmark_ext_count; 24*6a54128fSAndroid Build Coastguard Worker unsigned long test_ext_count; 25*6a54128fSAndroid Build Coastguard Worker unsigned long set_range_count; 26*6a54128fSAndroid Build Coastguard Worker unsigned long get_range_count; 27*6a54128fSAndroid Build Coastguard Worker unsigned long clear_count; 28*6a54128fSAndroid Build Coastguard Worker 29*6a54128fSAndroid Build Coastguard Worker blk64_t last_marked; 30*6a54128fSAndroid Build Coastguard Worker blk64_t last_tested; 31*6a54128fSAndroid Build Coastguard Worker blk64_t mark_back; 32*6a54128fSAndroid Build Coastguard Worker blk64_t test_back; 33*6a54128fSAndroid Build Coastguard Worker 34*6a54128fSAndroid Build Coastguard Worker unsigned long mark_seq; 35*6a54128fSAndroid Build Coastguard Worker unsigned long test_seq; 36*6a54128fSAndroid Build Coastguard Worker #endif /* ENABLE_BMAP_STATS_OPS */ 37*6a54128fSAndroid Build Coastguard Worker }; 38*6a54128fSAndroid Build Coastguard Worker 39*6a54128fSAndroid Build Coastguard Worker 40*6a54128fSAndroid Build Coastguard Worker struct ext2fs_struct_generic_bitmap_64 { 41*6a54128fSAndroid Build Coastguard Worker errcode_t magic; 42*6a54128fSAndroid Build Coastguard Worker ext2_filsys fs; 43*6a54128fSAndroid Build Coastguard Worker struct ext2_bitmap_ops *bitmap_ops; 44*6a54128fSAndroid Build Coastguard Worker int flags; 45*6a54128fSAndroid Build Coastguard Worker __u64 start, end; 46*6a54128fSAndroid Build Coastguard Worker __u64 real_end; 47*6a54128fSAndroid Build Coastguard Worker int cluster_bits; 48*6a54128fSAndroid Build Coastguard Worker char *description; 49*6a54128fSAndroid Build Coastguard Worker void *private; 50*6a54128fSAndroid Build Coastguard Worker errcode_t base_error_code; 51*6a54128fSAndroid Build Coastguard Worker #ifdef ENABLE_BMAP_STATS 52*6a54128fSAndroid Build Coastguard Worker struct ext2_bmap_statistics stats; 53*6a54128fSAndroid Build Coastguard Worker #endif 54*6a54128fSAndroid Build Coastguard Worker }; 55*6a54128fSAndroid Build Coastguard Worker 56*6a54128fSAndroid Build Coastguard Worker typedef struct ext2fs_struct_generic_bitmap_64 *ext2fs_generic_bitmap_64; 57*6a54128fSAndroid Build Coastguard Worker 58*6a54128fSAndroid Build Coastguard Worker #define EXT2FS_IS_32_BITMAP(bmap) \ 59*6a54128fSAndroid Build Coastguard Worker (((bmap)->magic == EXT2_ET_MAGIC_GENERIC_BITMAP) || \ 60*6a54128fSAndroid Build Coastguard Worker ((bmap)->magic == EXT2_ET_MAGIC_BLOCK_BITMAP) || \ 61*6a54128fSAndroid Build Coastguard Worker ((bmap)->magic == EXT2_ET_MAGIC_INODE_BITMAP)) 62*6a54128fSAndroid Build Coastguard Worker 63*6a54128fSAndroid Build Coastguard Worker #define EXT2FS_IS_64_BITMAP(bmap) \ 64*6a54128fSAndroid Build Coastguard Worker (((bmap)->magic == EXT2_ET_MAGIC_GENERIC_BITMAP64) || \ 65*6a54128fSAndroid Build Coastguard Worker ((bmap)->magic == EXT2_ET_MAGIC_BLOCK_BITMAP64) || \ 66*6a54128fSAndroid Build Coastguard Worker ((bmap)->magic == EXT2_ET_MAGIC_INODE_BITMAP64)) 67*6a54128fSAndroid Build Coastguard Worker 68*6a54128fSAndroid Build Coastguard Worker struct ext2_bitmap_ops { 69*6a54128fSAndroid Build Coastguard Worker int type; 70*6a54128fSAndroid Build Coastguard Worker /* Generic bmap operators */ 71*6a54128fSAndroid Build Coastguard Worker errcode_t (*new_bmap)(ext2_filsys fs, ext2fs_generic_bitmap_64 bmap); 72*6a54128fSAndroid Build Coastguard Worker void (*free_bmap)(ext2fs_generic_bitmap_64 bitmap); 73*6a54128fSAndroid Build Coastguard Worker errcode_t (*copy_bmap)(ext2fs_generic_bitmap_64 src, 74*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_64 dest); 75*6a54128fSAndroid Build Coastguard Worker errcode_t (*resize_bmap)(ext2fs_generic_bitmap_64 bitmap, 76*6a54128fSAndroid Build Coastguard Worker __u64 new_end, 77*6a54128fSAndroid Build Coastguard Worker __u64 new_real_end); 78*6a54128fSAndroid Build Coastguard Worker /* bit set/test operators */ 79*6a54128fSAndroid Build Coastguard Worker int (*mark_bmap)(ext2fs_generic_bitmap_64 bitmap, __u64 arg); 80*6a54128fSAndroid Build Coastguard Worker int (*unmark_bmap)(ext2fs_generic_bitmap_64 bitmap, __u64 arg); 81*6a54128fSAndroid Build Coastguard Worker int (*test_bmap)(ext2fs_generic_bitmap_64 bitmap, __u64 arg); 82*6a54128fSAndroid Build Coastguard Worker void (*mark_bmap_extent)(ext2fs_generic_bitmap_64 bitmap, __u64 arg, 83*6a54128fSAndroid Build Coastguard Worker unsigned int num); 84*6a54128fSAndroid Build Coastguard Worker void (*unmark_bmap_extent)(ext2fs_generic_bitmap_64 bitmap, __u64 arg, 85*6a54128fSAndroid Build Coastguard Worker unsigned int num); 86*6a54128fSAndroid Build Coastguard Worker int (*test_clear_bmap_extent)(ext2fs_generic_bitmap_64 bitmap, 87*6a54128fSAndroid Build Coastguard Worker __u64 arg, unsigned int num); 88*6a54128fSAndroid Build Coastguard Worker errcode_t (*set_bmap_range)(ext2fs_generic_bitmap_64 bitmap, 89*6a54128fSAndroid Build Coastguard Worker __u64 start, size_t num, void *in); 90*6a54128fSAndroid Build Coastguard Worker errcode_t (*get_bmap_range)(ext2fs_generic_bitmap_64 bitmap, 91*6a54128fSAndroid Build Coastguard Worker __u64 start, size_t num, void *out); 92*6a54128fSAndroid Build Coastguard Worker void (*clear_bmap)(ext2fs_generic_bitmap_64 bitmap); 93*6a54128fSAndroid Build Coastguard Worker void (*print_stats)(ext2fs_generic_bitmap_64); 94*6a54128fSAndroid Build Coastguard Worker 95*6a54128fSAndroid Build Coastguard Worker /* Find the first zero bit between start and end, inclusive. 96*6a54128fSAndroid Build Coastguard Worker * May be NULL, in which case a generic function is used. */ 97*6a54128fSAndroid Build Coastguard Worker errcode_t (*find_first_zero)(ext2fs_generic_bitmap_64 bitmap, 98*6a54128fSAndroid Build Coastguard Worker __u64 start, __u64 end, __u64 *out); 99*6a54128fSAndroid Build Coastguard Worker /* Find the first set bit between start and end, inclusive. 100*6a54128fSAndroid Build Coastguard Worker * May be NULL, in which case a generic function is used. */ 101*6a54128fSAndroid Build Coastguard Worker errcode_t (*find_first_set)(ext2fs_generic_bitmap_64 bitmap, 102*6a54128fSAndroid Build Coastguard Worker __u64 start, __u64 end, __u64 *out); 103*6a54128fSAndroid Build Coastguard Worker }; 104*6a54128fSAndroid Build Coastguard Worker 105*6a54128fSAndroid Build Coastguard Worker extern struct ext2_bitmap_ops ext2fs_blkmap64_bitarray; 106*6a54128fSAndroid Build Coastguard Worker extern struct ext2_bitmap_ops ext2fs_blkmap64_rbtree; 107