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