Merge tag 'ceph-for-5.11-rc2' of git://github.com/ceph/ceph-client
[linux-2.6-microblaze.git] / drivers / md / md-bitmap.c
index b10c519..200c5d0 100644 (file)
@@ -357,11 +357,12 @@ static int read_page(struct file *file, unsigned long index,
        struct inode *inode = file_inode(file);
        struct buffer_head *bh;
        sector_t block, blk_cur;
+       unsigned long blocksize = i_blocksize(inode);
 
        pr_debug("read bitmap file (%dB @ %llu)\n", (int)PAGE_SIZE,
                 (unsigned long long)index << PAGE_SHIFT);
 
-       bh = alloc_page_buffers(page, 1<<inode->i_blkbits, false);
+       bh = alloc_page_buffers(page, blocksize, false);
        if (!bh) {
                ret = -ENOMEM;
                goto out;
@@ -383,10 +384,10 @@ static int read_page(struct file *file, unsigned long index,
 
                        bh->b_blocknr = block;
                        bh->b_bdev = inode->i_sb->s_bdev;
-                       if (count < (1<<inode->i_blkbits))
+                       if (count < blocksize)
                                count = 0;
                        else
-                               count -= (1<<inode->i_blkbits);
+                               count -= blocksize;
 
                        bh->b_end_io = end_bitmap_write;
                        bh->b_private = bitmap;
@@ -605,8 +606,8 @@ re_read:
        if (bitmap->cluster_slot >= 0) {
                sector_t bm_blocks = bitmap->mddev->resync_max_sectors;
 
-               sector_div(bm_blocks,
-                          bitmap->mddev->bitmap_info.chunksize >> 9);
+               bm_blocks = DIV_ROUND_UP_SECTOR_T(bm_blocks,
+                          (bitmap->mddev->bitmap_info.chunksize >> 9));
                /* bits to bytes */
                bm_blocks = ((bm_blocks+7) >> 3) + sizeof(bitmap_super_t);
                /* to 4k blocks */
@@ -1367,7 +1368,7 @@ __acquires(bitmap->lock)
        if (bitmap->bp[page].hijacked ||
            bitmap->bp[page].map == NULL)
                csize = ((sector_t)1) << (bitmap->chunkshift +
-                                         PAGE_COUNTER_SHIFT - 1);
+                                         PAGE_COUNTER_SHIFT);
        else
                csize = ((sector_t)1) << bitmap->chunkshift;
        *blocks = csize - (offset & (csize - 1));
@@ -1949,6 +1950,7 @@ out:
 }
 EXPORT_SYMBOL_GPL(md_bitmap_load);
 
+/* caller need to free returned bitmap with md_bitmap_free() */
 struct bitmap *get_bitmap_from_slot(struct mddev *mddev, int slot)
 {
        int rv = 0;
@@ -2012,6 +2014,7 @@ int md_bitmap_copy_from_slot(struct mddev *mddev, int slot,
        md_bitmap_unplug(mddev->bitmap);
        *low = lo;
        *high = hi;
+       md_bitmap_free(bitmap);
 
        return rv;
 }
@@ -2615,4 +2618,3 @@ struct attribute_group md_bitmap_group = {
        .name = "bitmap",
        .attrs = md_bitmap_attrs,
 };
-