Whamcloud - gitweb
libext2fs: force DIO alignment FreeBSD when operating on a block device
[tools/e2fsprogs.git] / lib / ext2fs / bitops.h
index 406999b..bc59608 100644 (file)
  */
 
 #ifdef WORDS_BIGENDIAN
-#define ext2fs_cpu_to_le64(x) ext2fs_swab64((x))
-#define ext2fs_le64_to_cpu(x) ext2fs_swab64((x))
-#define ext2fs_cpu_to_le32(x) ext2fs_swab32((x))
-#define ext2fs_le32_to_cpu(x) ext2fs_swab32((x))
-#define ext2fs_cpu_to_le16(x) ext2fs_swab16((x))
-#define ext2fs_le16_to_cpu(x) ext2fs_swab16((x))
-#define ext2fs_cpu_to_be64(x) ((__u64)(x))
-#define ext2fs_be64_to_cpu(x) ((__u64)(x))
-#define ext2fs_cpu_to_be32(x) ((__u32)(x))
-#define ext2fs_be32_to_cpu(x) ((__u32)(x))
-#define ext2fs_cpu_to_be16(x) ((__u16)(x))
-#define ext2fs_be16_to_cpu(x) ((__u16)(x))
+#define ext2fs_cpu_to_le64(x) ((__force __le64)ext2fs_swab64((__u64)(x)))
+#define ext2fs_le64_to_cpu(x) ext2fs_swab64((__force __u64)(__le64)(x))
+#define ext2fs_cpu_to_le32(x) ((__force __le32)ext2fs_swab32((__u32)(x)))
+#define ext2fs_le32_to_cpu(x) ext2fs_swab32((__force __u32)(__le32)(x))
+#define ext2fs_cpu_to_le16(x) ((__force __le16)ext2fs_swab16((__u16)(x)))
+#define ext2fs_le16_to_cpu(x) ext2fs_swab16((__force __u16)(__le16)(x))
+
+#define ext2fs_cpu_to_be64(x) ((__force __be64)(__u64)(x))
+#define ext2fs_be64_to_cpu(x) ((__force __u64)(__be64)(x))
+#define ext2fs_cpu_to_be32(x) ((__force __be32)(__u32)(x))
+#define ext2fs_be32_to_cpu(x) ((__force __u32)(__be32)(x))
+#define ext2fs_cpu_to_be16(x) ((__force __be16)(__u16)(x))
+#define ext2fs_be16_to_cpu(x) ((__force __u16)(__be16)(x))
 #else
-#define ext2fs_cpu_to_le64(x) ((__u64)(x))
-#define ext2fs_le64_to_cpu(x) ((__u64)(x))
-#define ext2fs_cpu_to_le32(x) ((__u32)(x))
-#define ext2fs_le32_to_cpu(x) ((__u32)(x))
-#define ext2fs_cpu_to_le16(x) ((__u16)(x))
-#define ext2fs_le16_to_cpu(x) ((__u16)(x))
-#define ext2fs_cpu_to_be64(x) ext2fs_swab64((x))
-#define ext2fs_be64_to_cpu(x) ext2fs_swab64((x))
-#define ext2fs_cpu_to_be32(x) ext2fs_swab32((x))
-#define ext2fs_be32_to_cpu(x) ext2fs_swab32((x))
-#define ext2fs_cpu_to_be16(x) ext2fs_swab16((x))
-#define ext2fs_be16_to_cpu(x) ext2fs_swab16((x))
+#define ext2fs_cpu_to_le64(x) ((__force __le64)(__u64)(x))
+#define ext2fs_le64_to_cpu(x) ((__force __u64)(__le64)(x))
+#define ext2fs_cpu_to_le32(x) ((__force __le32)(__u32)(x))
+#define ext2fs_le32_to_cpu(x) ((__force __u32)(__le32)(x))
+#define ext2fs_cpu_to_le16(x) ((__force __le16)(__u16)(x))
+#define ext2fs_le16_to_cpu(x) ((__force __u16)(__le16)(x))
+
+#define ext2fs_cpu_to_be64(x) ((__force __be64)ext2fs_swab64((__u64)(x)))
+#define ext2fs_be64_to_cpu(x) ext2fs_swab64((__force __u64)(__be64)(x))
+#define ext2fs_cpu_to_be32(x) ((__force __be32)ext2fs_swab32((__u32)(x)))
+#define ext2fs_be32_to_cpu(x) ext2fs_swab32((__force __u32)(__be32)(x))
+#define ext2fs_cpu_to_be16(x) ((__force __be16)ext2fs_swab16((__u16)(x)))
+#define ext2fs_be16_to_cpu(x) ext2fs_swab16((__force __u16)(__be16)(x))
 #endif
 
 /*
@@ -54,6 +56,14 @@ extern void ext2fs_warn_bitmap2(ext2fs_generic_bitmap bitmap,
                                int code, unsigned long arg);
 
 #ifdef NO_INLINE_FUNCS
+extern void ext2fs_fast_set_bit(unsigned int nr,void * addr);
+extern void ext2fs_fast_clear_bit(unsigned int nr, void * addr);
+extern void ext2fs_fast_set_bit64(__u64 nr,void * addr);
+extern void ext2fs_fast_clear_bit64(__u64 nr, void * addr);
+extern __u16 ext2fs_swab16(__u16 val);
+extern __u32 ext2fs_swab32(__u32 val);
+extern __u64 ext2fs_swab64(__u64 val);
+
 extern int ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block);
 extern int ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
                                       blk_t block);
@@ -149,6 +159,14 @@ extern errcode_t ext2fs_find_first_zero_inode_bitmap2(ext2fs_inode_bitmap bitmap
                                                      ext2_ino_t start,
                                                      ext2_ino_t end,
                                                      ext2_ino_t *out);
+extern errcode_t ext2fs_find_first_set_block_bitmap2(ext2fs_block_bitmap bitmap,
+                                                    blk64_t start,
+                                                    blk64_t end,
+                                                    blk64_t *out);
+extern errcode_t ext2fs_find_first_set_inode_bitmap2(ext2fs_inode_bitmap bitmap,
+                                                     ext2_ino_t start,
+                                                     ext2_ino_t end,
+                                                     ext2_ino_t *out);
 extern blk64_t ext2fs_get_block_bitmap_start2(ext2fs_block_bitmap bitmap);
 extern ext2_ino_t ext2fs_get_inode_bitmap_start2(ext2fs_inode_bitmap bitmap);
 extern blk64_t ext2fs_get_block_bitmap_end2(ext2fs_block_bitmap bitmap);
@@ -190,6 +208,9 @@ extern void ext2fs_unmark_block_bitmap_range2(ext2fs_block_bitmap bitmap,
 extern errcode_t ext2fs_find_first_zero_generic_bmap(ext2fs_generic_bitmap bitmap,
                                                     __u64 start, __u64 end,
                                                     __u64 *out);
+extern errcode_t ext2fs_find_first_set_generic_bmap(ext2fs_generic_bitmap bitmap,
+                                                   __u64 start, __u64 end,
+                                                   __u64 *out);
 
 /*
  * The inline routines themselves...
@@ -200,7 +221,7 @@ extern errcode_t ext2fs_find_first_zero_generic_bmap(ext2fs_generic_bitmap bitma
  */
 #ifdef NO_INLINE_FUNCS
 #if (defined(__GNUC__) && (defined(__i386__) || defined(__i486__) || \
-                          defined(__i586__) || defined(__mc68000__)))
+                          defined(__i586__)))
        /* This prevents bitops.c from trying to include the C */
        /* function version of these functions */
 #define _EXT2_HAVE_ASM_BITOPS_
@@ -236,7 +257,7 @@ _INLINE_ void ext2fs_fast_set_bit(unsigned int nr,void * addr)
        unsigned char   *ADDR = (unsigned char *) addr;
 
        ADDR += nr >> 3;
-       *ADDR |= (1 << (nr & 0x07));
+       *ADDR |= (unsigned char) (1 << (nr & 0x07));
 }
 
 _INLINE_ void ext2fs_fast_clear_bit(unsigned int nr, void * addr)
@@ -244,7 +265,7 @@ _INLINE_ void ext2fs_fast_clear_bit(unsigned int nr, void * addr)
        unsigned char   *ADDR = (unsigned char *) addr;
 
        ADDR += nr >> 3;
-       *ADDR &= ~(1 << (nr & 0x07));
+       *ADDR &= (unsigned char) ~(1 << (nr & 0x07));
 }
 
 
@@ -253,7 +274,7 @@ _INLINE_ void ext2fs_fast_set_bit64(__u64 nr, void * addr)
        unsigned char   *ADDR = (unsigned char *) addr;
 
        ADDR += nr >> 3;
-       *ADDR |= (1 << (nr & 0x07));
+       *ADDR |= (unsigned char) (1 << (nr & 0x07));
 }
 
 _INLINE_ void ext2fs_fast_clear_bit64(__u64 nr, void * addr)
@@ -261,7 +282,7 @@ _INLINE_ void ext2fs_fast_clear_bit64(__u64 nr, void * addr)
        unsigned char   *ADDR = (unsigned char *) addr;
 
        ADDR += nr >> 3;
-       *ADDR &= ~(1 << (nr & 0x07));
+       *ADDR &= (unsigned char) ~(1 << (nr & 0x07));
 }
 
 
@@ -345,49 +366,12 @@ _INLINE_ __u16 ext2fs_swab16(__u16 val)
 
 #endif /* i386 */
 
-#if ((defined __GNUC__) && !defined(_EXT2_USE_C_VERSIONS_) && \
-     (defined(__mc68000__)))
-
-#define _EXT2_HAVE_ASM_BITOPS_
-
-_INLINE_ int ext2fs_set_bit(unsigned int nr,void * addr)
-{
-       char retval;
-
-       __asm__ __volatile__ ("bfset %2@{%1:#1}; sne %0"
-            : "=d" (retval) : "d" (nr^7), "a" (addr));
-
-       return retval;
-}
-
-_INLINE_ int ext2fs_clear_bit(unsigned int nr, void * addr)
-{
-       char retval;
-
-       __asm__ __volatile__ ("bfclr %2@{%1:#1}; sne %0"
-            : "=d" (retval) : "d" (nr^7), "a" (addr));
-
-       return retval;
-}
-
-_INLINE_ int ext2fs_test_bit(unsigned int nr, const void * addr)
-{
-       char retval;
-
-       __asm__ __volatile__ ("bftst %2@{%1:#1}; sne %0"
-            : "=d" (retval) : "d" (nr^7), "a" (addr));
-
-       return retval;
-}
-
-#endif /* __mc68000__ */
-
 
 #if !defined(_EXT2_HAVE_ASM_SWAB_)
 
 _INLINE_ __u16 ext2fs_swab16(__u16 val)
 {
-       return (val >> 8) | (val << 8);
+       return (val >> 8) | (__u16) (val << 8);
 }
 
 _INLINE_ __u32 ext2fs_swab32(__u32 val)
@@ -400,7 +384,7 @@ _INLINE_ __u32 ext2fs_swab32(__u32 val)
 
 _INLINE_ __u64 ext2fs_swab64(__u64 val)
 {
-       return (ext2fs_swab32(val >> 32) |
+       return (ext2fs_swab32((__u32) (val >> 32)) |
                (((__u64)ext2fs_swab32(val & 0xFFFFFFFFUL)) << 32));
 }
 
@@ -629,10 +613,40 @@ _INLINE_ errcode_t ext2fs_find_first_zero_inode_bitmap2(ext2fs_inode_bitmap bitm
        rv = ext2fs_find_first_zero_generic_bmap((ext2fs_generic_bitmap) bitmap,
                                                 start, end, &o);
        if (!rv)
+               *out = (ext2_ino_t) o;
+       return rv;
+}
+
+_INLINE_ errcode_t ext2fs_find_first_set_block_bitmap2(ext2fs_block_bitmap bitmap,
+                                                      blk64_t start,
+                                                      blk64_t end,
+                                                      blk64_t *out)
+{
+       __u64 o;
+       errcode_t rv;
+
+       rv = ext2fs_find_first_set_generic_bmap((ext2fs_generic_bitmap) bitmap,
+                                               start, end, &o);
+       if (!rv)
                *out = o;
        return rv;
 }
 
+_INLINE_ errcode_t ext2fs_find_first_set_inode_bitmap2(ext2fs_inode_bitmap bitmap,
+                                                      ext2_ino_t start,
+                                                      ext2_ino_t end,
+                                                      ext2_ino_t *out)
+{
+       __u64 o;
+       errcode_t rv;
+
+       rv = ext2fs_find_first_set_generic_bmap((ext2fs_generic_bitmap) bitmap,
+                                               start, end, &o);
+       if (!rv)
+               *out = (ext2_ino_t) o;
+       return rv;
+}
+
 _INLINE_ blk64_t ext2fs_get_block_bitmap_start2(ext2fs_block_bitmap bitmap)
 {
        return ext2fs_get_generic_bmap_start((ext2fs_generic_bitmap) bitmap);
@@ -640,7 +654,7 @@ _INLINE_ blk64_t ext2fs_get_block_bitmap_start2(ext2fs_block_bitmap bitmap)
 
 _INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_start2(ext2fs_inode_bitmap bitmap)
 {
-       return ext2fs_get_generic_bmap_start((ext2fs_generic_bitmap) bitmap);
+       return (ext2_ino_t) ext2fs_get_generic_bmap_start((ext2fs_generic_bitmap) bitmap);
 }
 
 _INLINE_ blk64_t ext2fs_get_block_bitmap_end2(ext2fs_block_bitmap bitmap)
@@ -650,7 +664,7 @@ _INLINE_ blk64_t ext2fs_get_block_bitmap_end2(ext2fs_block_bitmap bitmap)
 
 _INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_end2(ext2fs_inode_bitmap bitmap)
 {
-       return ext2fs_get_generic_bmap_end((ext2fs_generic_bitmap) bitmap);
+       return (ext2_ino_t) ext2fs_get_generic_bmap_end((ext2fs_generic_bitmap) bitmap);
 }
 
 _INLINE_ int ext2fs_fast_test_block_bitmap_range2(ext2fs_block_bitmap bitmap,
@@ -687,14 +701,3 @@ extern int ext2fs_set_bit64(__u64 nr,void * addr);
 extern int ext2fs_clear_bit64(__u64 nr, void * addr);
 extern int ext2fs_test_bit64(__u64 nr, const void * addr);
 extern unsigned int ext2fs_bitcount(const void *addr, unsigned int nbytes);
-
-#ifdef NO_INLINE_FUNCS
-extern void ext2fs_fast_set_bit(unsigned int nr,void * addr);
-extern void ext2fs_fast_clear_bit(unsigned int nr, void * addr);
-extern void ext2fs_fast_set_bit64(__u64 nr,void * addr);
-extern void ext2fs_fast_clear_bit64(__u64 nr, void * addr);
-extern __u16 ext2fs_swab16(__u16 val);
-extern __u32 ext2fs_swab32(__u32 val);
-extern __u64 ext2fs_swab64(__u64 val);
-#endif
-