#include "ebitmap.h"
 #include "policydb.h"
 
-#define BITS_PER_U64 (sizeof(u64) * 8)
+#define BITS_PER_U64 ((u32)(sizeof(u64) * 8))
 
 static struct kmem_cache *ebitmap_node_cachep __ro_after_init;
 
                const struct ebitmap *e2)
 {
        struct ebitmap_node *n;
-       int bit, rc;
+       u32 bit;
+       int rc;
 
        ebitmap_init(dst);
 
        return 1;
 }
 
-int ebitmap_get_bit(const struct ebitmap *e, unsigned long bit)
+int ebitmap_get_bit(const struct ebitmap *e, u32 bit)
 {
        const struct ebitmap_node *n;
 
        return 0;
 }
 
-int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value)
+int ebitmap_set_bit(struct ebitmap *e, u32 bit, int value)
 {
        struct ebitmap_node *n, *prev, *new;
 
                        if (value) {
                                ebitmap_node_set_bit(n, bit);
                        } else {
-                               unsigned int s;
+                               u32 s;
 
                                ebitmap_node_clr_bit(n, bit);
 
 int ebitmap_read(struct ebitmap *e, void *fp)
 {
        struct ebitmap_node *n = NULL;
-       u32 mapunit, count, startbit, index;
+       u32 mapunit, count, startbit, index, i;
        __le32 ebitmap_start;
        u64 map;
        __le64 mapbits;
        __le32 buf[3];
-       int rc, i;
+       int rc;
 
        ebitmap_init(e);
 
 
        if (mapunit != BITS_PER_U64) {
                pr_err("SELinux: ebitmap: map size %u does not "
-                      "match my size %zd (high bit was %u)\n",
+                      "match my size %u (high bit was %u)\n",
                       mapunit, BITS_PER_U64, e->highbit);
                goto bad;
        }
 int ebitmap_write(const struct ebitmap *e, void *fp)
 {
        struct ebitmap_node *n;
-       u32 count;
+       u32 bit, count, last_bit, last_startbit;
        __le32 buf[3];
        u64 map;
-       int bit, last_bit, last_startbit, rc;
+       int rc;
 
        buf[0] = cpu_to_le32(BITS_PER_U64);
 
        count = 0;
        last_bit = 0;
-       last_startbit = -1;
+       last_startbit = U32_MAX;
        ebitmap_for_each_positive_bit(e, n, bit)
        {
-               if (rounddown(bit, (int)BITS_PER_U64) > last_startbit) {
+               if (last_startbit == U32_MAX ||
+                   rounddown(bit, BITS_PER_U64) > last_startbit) {
                        count++;
                        last_startbit = rounddown(bit, BITS_PER_U64);
                }
                return rc;
 
        map = 0;
-       last_startbit = INT_MIN;
+       last_startbit = U32_MAX;
        ebitmap_for_each_positive_bit(e, n, bit)
        {
-               if (rounddown(bit, (int)BITS_PER_U64) > last_startbit) {
+               if (last_startbit == U32_MAX ||
+                   rounddown(bit, BITS_PER_U64) > last_startbit) {
                        __le64 buf64[1];
 
                        /* this is the very first bit */
 
 
 #define ebitmap_length(e) ((e)->highbit)
 
-static inline unsigned int ebitmap_start_positive(const struct ebitmap *e,
-                                                 struct ebitmap_node **n)
+static inline u32 ebitmap_start_positive(const struct ebitmap *e,
+                                        struct ebitmap_node **n)
 {
-       unsigned int ofs;
+       u32 ofs;
 
        for (*n = e->node; *n; *n = (*n)->next) {
                ofs = find_first_bit((*n)->maps, EBITMAP_SIZE);
        memset(e, 0, sizeof(*e));
 }
 
-static inline unsigned int ebitmap_next_positive(const struct ebitmap *e,
-                                                struct ebitmap_node **n,
-                                                unsigned int bit)
+static inline u32 ebitmap_next_positive(const struct ebitmap *e,
+                                       struct ebitmap_node **n, u32 bit)
 {
-       unsigned int ofs;
+       u32 ofs;
 
        ofs = find_next_bit((*n)->maps, EBITMAP_SIZE, bit - (*n)->startbit + 1);
        if (ofs < EBITMAP_SIZE)
 #define EBITMAP_NODE_OFFSET(node, bit) \
        (((bit) - (node)->startbit) % EBITMAP_UNIT_SIZE)
 
-static inline int ebitmap_node_get_bit(const struct ebitmap_node *n,
-                                      unsigned int bit)
+static inline int ebitmap_node_get_bit(const struct ebitmap_node *n, u32 bit)
 {
-       unsigned int index = EBITMAP_NODE_INDEX(n, bit);
-       unsigned int ofs = EBITMAP_NODE_OFFSET(n, bit);
+       u32 index = EBITMAP_NODE_INDEX(n, bit);
+       u32 ofs = EBITMAP_NODE_OFFSET(n, bit);
 
        BUG_ON(index >= EBITMAP_UNIT_NUMS);
        if ((n->maps[index] & (EBITMAP_BIT << ofs)))
        return 0;
 }
 
-static inline void ebitmap_node_set_bit(struct ebitmap_node *n,
-                                       unsigned int bit)
+static inline void ebitmap_node_set_bit(struct ebitmap_node *n, u32 bit)
 {
-       unsigned int index = EBITMAP_NODE_INDEX(n, bit);
-       unsigned int ofs = EBITMAP_NODE_OFFSET(n, bit);
+       u32 index = EBITMAP_NODE_INDEX(n, bit);
+       u32 ofs = EBITMAP_NODE_OFFSET(n, bit);
 
        BUG_ON(index >= EBITMAP_UNIT_NUMS);
        n->maps[index] |= (EBITMAP_BIT << ofs);
 }
 
-static inline void ebitmap_node_clr_bit(struct ebitmap_node *n,
-                                       unsigned int bit)
+static inline void ebitmap_node_clr_bit(struct ebitmap_node *n, u32 bit)
 {
-       unsigned int index = EBITMAP_NODE_INDEX(n, bit);
-       unsigned int ofs = EBITMAP_NODE_OFFSET(n, bit);
+       u32 index = EBITMAP_NODE_INDEX(n, bit);
+       u32 ofs = EBITMAP_NODE_OFFSET(n, bit);
 
        BUG_ON(index >= EBITMAP_UNIT_NUMS);
        n->maps[index] &= ~(EBITMAP_BIT << ofs);
                const struct ebitmap *e2);
 int ebitmap_contains(const struct ebitmap *e1, const struct ebitmap *e2,
                     u32 last_e2bit);
-int ebitmap_get_bit(const struct ebitmap *e, unsigned long bit);
-int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value);
+int ebitmap_get_bit(const struct ebitmap *e, u32 bit);
+int ebitmap_set_bit(struct ebitmap *e, u32 bit, int value);
 void ebitmap_destroy(struct ebitmap *e);
 int ebitmap_read(struct ebitmap *e, void *fp);
 int ebitmap_write(const struct ebitmap *e, void *fp);