sb = kmap_atomic(bitmap->storage.sb_page);
        pr_debug("%s: bitmap file superblock:\n", bmname(bitmap));
        pr_debug("         magic: %08x\n", le32_to_cpu(sb->magic));
-       pr_debug("       version: %d\n", le32_to_cpu(sb->version));
+       pr_debug("       version: %u\n", le32_to_cpu(sb->version));
        pr_debug("          uuid: %08x.%08x.%08x.%08x\n",
                 le32_to_cpu(*(__le32 *)(sb->uuid+0)),
                 le32_to_cpu(*(__le32 *)(sb->uuid+4)),
        pr_debug("events cleared: %llu\n",
                 (unsigned long long) le64_to_cpu(sb->events_cleared));
        pr_debug("         state: %08x\n", le32_to_cpu(sb->state));
-       pr_debug("     chunksize: %d B\n", le32_to_cpu(sb->chunksize));
-       pr_debug("  daemon sleep: %ds\n", le32_to_cpu(sb->daemon_sleep));
+       pr_debug("     chunksize: %u B\n", le32_to_cpu(sb->chunksize));
+       pr_debug("  daemon sleep: %us\n", le32_to_cpu(sb->daemon_sleep));
        pr_debug("     sync size: %llu KB\n",
                 (unsigned long long)le64_to_cpu(sb->sync_size)/2);
-       pr_debug("max write behind: %d\n", le32_to_cpu(sb->write_behind));
+       pr_debug("max write behind: %u\n", le32_to_cpu(sb->write_behind));
        kunmap_atomic(sb);
 }
 
                        bytes = DIV_ROUND_UP(chunks, 8);
                        if (!bitmap->mddev->bitmap_info.external)
                                bytes += sizeof(bitmap_super_t);
-               } while (bytes > (space << 9));
+               } while (bytes > (space << 9) && (chunkshift + BITMAP_BLOCK_SHIFT) <
+                       (BITS_PER_BYTE * sizeof(((bitmap_super_t *)0)->chunksize) - 1));
        } else
                chunkshift = ffz(~chunksize) - BITMAP_BLOCK_SHIFT;
 
        bitmap->counts.missing_pages = pages;
        bitmap->counts.chunkshift = chunkshift;
        bitmap->counts.chunks = chunks;
-       bitmap->mddev->bitmap_info.chunksize = 1 << (chunkshift +
+       bitmap->mddev->bitmap_info.chunksize = 1UL << (chunkshift +
                                                     BITMAP_BLOCK_SHIFT);
 
        blocks = min(old_counts.chunks << old_counts.chunkshift,
                                bitmap->counts.missing_pages = old_counts.pages;
                                bitmap->counts.chunkshift = old_counts.chunkshift;
                                bitmap->counts.chunks = old_counts.chunks;
-                               bitmap->mddev->bitmap_info.chunksize = 1 << (old_counts.chunkshift +
-                                                                            BITMAP_BLOCK_SHIFT);
+                               bitmap->mddev->bitmap_info.chunksize =
+                                       1UL << (old_counts.chunkshift + BITMAP_BLOCK_SHIFT);
                                blocks = old_counts.chunks << old_counts.chunkshift;
                                pr_warn("Could not pre-allocate in-memory bitmap for cluster raid\n");
                                break;
        if (csize < 512 ||
            !is_power_of_2(csize))
                return -EINVAL;
+       if (BITS_PER_LONG > 32 && csize >= (1ULL << (BITS_PER_BYTE *
+               sizeof(((bitmap_super_t *)0)->chunksize))))
+               return -EOVERFLOW;
        mddev->bitmap_info.chunksize = csize;
        return len;
 }