Skip to content

Commit

Permalink
md-cluster: fix bitmap sub-offset in bitmap_read_sb
Browse files Browse the repository at this point in the history
bitmap_read_sb is modifying mddev->bitmap_info.offset. This works for
the first bitmap read. However, when multiple bitmaps need to be opened
by the same node, it ends up corrupting the offset. Fix it by using a
local variable.

Also, bitmap_read_sb is not required in bitmap_copy_from_slot since
it is called in bitmap_create. Remove bitmap_read_sb().

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: NeilBrown <neilb@suse.com>
  • Loading branch information
Goldwyn Rodrigues authored and NeilBrown committed Jul 24, 2015
1 parent b0c26a7 commit 33e38ac
Showing 1 changed file with 4 additions and 7 deletions.
11 changes: 4 additions & 7 deletions drivers/md/bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,7 @@ static int bitmap_read_sb(struct bitmap *bitmap)
unsigned long sectors_reserved = 0;
int err = -EINVAL;
struct page *sb_page;
loff_t offset = bitmap->mddev->bitmap_info.offset;

if (!bitmap->storage.file && !bitmap->mddev->bitmap_info.offset) {
chunksize = 128 * 1024 * 1024;
Expand All @@ -585,9 +586,9 @@ static int bitmap_read_sb(struct bitmap *bitmap)
bm_blocks = ((bm_blocks+7) >> 3) + sizeof(bitmap_super_t);
/* to 4k blocks */
bm_blocks = DIV_ROUND_UP_SECTOR_T(bm_blocks, 4096);
bitmap->mddev->bitmap_info.offset += bitmap->cluster_slot * (bm_blocks << 3);
offset = bitmap->mddev->bitmap_info.offset + (bitmap->cluster_slot * (bm_blocks << 3));
pr_info("%s:%d bm slot: %d offset: %llu\n", __func__, __LINE__,
bitmap->cluster_slot, (unsigned long long)bitmap->mddev->bitmap_info.offset);
bitmap->cluster_slot, offset);
}

if (bitmap->storage.file) {
Expand All @@ -598,7 +599,7 @@ static int bitmap_read_sb(struct bitmap *bitmap)
bitmap, bytes, sb_page);
} else {
err = read_sb_page(bitmap->mddev,
bitmap->mddev->bitmap_info.offset,
offset,
sb_page,
0, sizeof(bitmap_super_t));
}
Expand Down Expand Up @@ -1875,10 +1876,6 @@ int bitmap_copy_from_slot(struct mddev *mddev, int slot,
if (IS_ERR(bitmap))
return PTR_ERR(bitmap);

rv = bitmap_read_sb(bitmap);
if (rv)
goto err;

rv = bitmap_init_from_disk(bitmap, 0);
if (rv)
goto err;
Expand Down

0 comments on commit 33e38ac

Please sign in to comment.