Skip to contentSkip to conversation

new bitmaps interface in e2fsprogs

RFC PATCH In review Valerie Clement 1 participant 1 message Jun 11, 2007

lore
Share & tools
lore
#0 lore raw

RFC PATCH 5/12 new bitmaps interface in e2fsprogs

This patch introduces new bitmap interface for ext4 filesystems which uses the new type blk64_t.

 bitmaps.c |  152 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 bitops.c  |   36 ++++++++++++++
 bitops.h  |   29 +++++++++++
 ext2fs.h  |   25 ++++++++++
 4 files changed, 229 insertions(+), 13 deletions(-)
lib/ext2fs/ext2fs.h +25 -0
Index: e2fsprogs-1.39-tyt3-v6/lib/ext2fs/ext2fs.h
===================================================================
@@ -112,13 +112,30 @@ struct ext2fs_struct_generic_bitmap {
 	__u32		reserved[7];
 };
 
+struct ext4fs_struct_generic_bitmap {
+	errcode_t	magic;
+	ext2_filsys 	fs;
+	blk64_t		start, end;
+	blk64_t		real_end;
+	char	*	description;
+	char	*	bitmap;
+	errcode_t	base_error_code;
+	__u32		reserved[7];
+};
+
 #define EXT2FS_MARK_ERROR 	0
 #define EXT2FS_UNMARK_ERROR 	1
 #define EXT2FS_TEST_ERROR	2
 
+#ifdef _EXT4FS_
+typedef struct ext4fs_struct_generic_bitmap *ext2fs_generic_bitmap;
+typedef struct ext4fs_struct_generic_bitmap *ext2fs_inode_bitmap;
+typedef struct ext4fs_struct_generic_bitmap *ext2fs_block_bitmap;
+#else
 typedef struct ext2fs_struct_generic_bitmap *ext2fs_generic_bitmap;
 typedef struct ext2fs_struct_generic_bitmap *ext2fs_inode_bitmap;
 typedef struct ext2fs_struct_generic_bitmap *ext2fs_block_bitmap;
+#endif
 
 #define EXT2_FIRST_INODE(s)	EXT2_FIRST_INO(s)
 
@@ -584,11 +601,19 @@ extern errcode_t ext2fs_write_inode_bitm
 extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
 extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
 extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
+#ifndef _EXT4FS_
 extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
 						__u32 end,
 						__u32 real_end,
 						const char *descr,
 						ext2fs_generic_bitmap *ret);
+#else
+extern errcode_t ext2fs_allocate_generic_bitmap(blk64_t start,
+						blk64_t end,
+						blk64_t real_end,
+						const char *descr,
+						ext2fs_generic_bitmap *ret);
+#endif
 extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
 					      const char *descr,
 					      ext2fs_block_bitmap *ret);
lib/ext2fs/bitmaps.c +140 -12

192 lines not on this page · raw message

lib/ext2fs/bitops.c +36 -0
Index: e2fsprogs-1.39-tyt3-v6/lib/ext2fs/bitops.c
===================================================================
@@ -30,6 +30,7 @@
  * systems, as well as non-32 bit systems.
  */
 
+#ifndef _EXT4FS_
 int ext2fs_set_bit(unsigned int nr,void * addr)
 {
 	int		mask, retval;
@@ -63,6 +64,41 @@ int ext2fs_test_bit(unsigned int nr, con
 	mask = 1 << (nr & 0x07);
 	return (mask & *ADDR);
 }
+#else
+int ext2fs_set_bit(blk64_t nr,void * addr)
+{
+	int		mask, retval;
+	unsigned char	*ADDR = (unsigned char *) addr;
+
+	ADDR += nr >> 3;
+	mask = 1 << (nr & 0x07);
+	retval = mask & *ADDR;
+	*ADDR |= mask;
+	return retval;
+}
+
+int ext2fs_clear_bit(blk64_t nr, void * addr)
+{
+	int		mask, retval;
+	unsigned char	*ADDR = (unsigned char *) addr;
+
+	ADDR += nr >> 3;
+	mask = 1 << (nr & 0x07);
+	retval = mask & *ADDR;
+	*ADDR &= ~mask;
+	return retval;
+}
+
+int ext2fs_test_bit(blk64_t nr, const void * addr)
+{
+	int			mask;
+	const unsigned char	*ADDR = (const unsigned char *) addr;
+
+	ADDR += nr >> 3;
+	mask = 1 << (nr & 0x07);
+	return (mask & *ADDR);
+}
+#endif
 
 #endif	/* !_EXT2_HAVE_ASM_BITOPS_ */
 
lib/ext2fs/bitops.h +28 -1
Index: e2fsprogs-1.39-tyt3-v6/lib/ext2fs/bitops.h
===================================================================
@@ -14,11 +14,19 @@
  */
 
 
+#ifndef _EXT4FS_
 extern int ext2fs_set_bit(unsigned int nr,void * addr);
 extern int ext2fs_clear_bit(unsigned int nr, void * addr);
 extern int ext2fs_test_bit(unsigned int nr, const void * addr);
 extern void ext2fs_fast_set_bit(unsigned int nr,void * addr);
 extern void ext2fs_fast_clear_bit(unsigned int nr, void * addr);
+#else
+extern int ext2fs_set_bit(blk64_t nr,void * addr);
+extern int ext2fs_clear_bit(blk64_t nr, void * addr);
+extern int ext2fs_test_bit(blk64_t nr, const void * addr);
+extern void ext2fs_fast_set_bit(blk64_t nr,void * addr);
+extern void ext2fs_fast_clear_bit(blk64_t nr, void * addr);
+#endif
 extern __u16 ext2fs_swab16(__u16 val);
 extern __u32 ext2fs_swab32(__u32 val);
 extern __u64 ext2fs_swab64(__u64 val);
@@ -141,6 +149,7 @@ extern int ext2fs_unmark_generic_bitmap(
  * previous bit value.
  */
 
+#ifndef _EXT4FS_
 _INLINE_ void ext2fs_fast_set_bit(unsigned int nr,void * addr)
 {
 	unsigned char	*ADDR = (unsigned char *) addr;
@@ -156,10 +165,28 @@ _INLINE_ void ext2fs_fast_clear_bit(unsi
 	ADDR += nr >> 3;
 	*ADDR &= ~(1 << (nr & 0x07));
 }
+#else
+_INLINE_ void ext2fs_fast_set_bit(blk64_t nr,void * addr)
+{
+	unsigned char	*ADDR = (unsigned char *) addr;
+
+	ADDR += nr >> 3;
+	*ADDR |= (1 << (nr & 0x07));
+}
+
+_INLINE_ void ext2fs_fast_clear_bit(blk64_t nr, void * addr)
+{
+	unsigned char	*ADDR = (unsigned char *) addr;
+
+	ADDR += nr >> 3;
+	*ADDR &= ~(1 << (nr & 0x07));
+}
+#endif
 
 
 #if ((defined __GNUC__) && !defined(_EXT2_USE_C_VERSIONS_) && \
-     (defined(__i386__) || defined(__i486__) || defined(__i586__)))
+     (defined(__i386__) || defined(__i486__) || defined(__i586__)) && \
+     !(defined(_EXT2_64BIT_BLK_T) && (SIZEOF_LONG == 4)))
 
 #define _EXT2_HAVE_ASM_BITOPS_
 #define _EXT2_HAVE_ASM_SWAB_