mdadm/bitmap: locate bitmap calcuate bitmap position wrongly

Now it only adds bitmap offset based on cluster nodes. It's not right. It needs to
add per node bitmap space to find next node bitmap position.

Signed-off-by: Xiao Ni <xni@redhat.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
This commit is contained in:
Xiao Ni 2020-10-28 14:04:24 +08:00 committed by Jes Sorensen
parent 75562b57d4
commit 1fe2e10073
1 changed files with 9 additions and 3 deletions

View File

@ -2582,8 +2582,9 @@ add_internal_bitmap1(struct supertype *st,
static int locate_bitmap1(struct supertype *st, int fd, int node_num)
{
unsigned long long offset;
unsigned long long offset, bm_sectors_per_node;
struct mdp_superblock_1 *sb;
bitmap_super_t *bms;
int mustfree = 0;
int ret;
@ -2598,8 +2599,13 @@ static int locate_bitmap1(struct supertype *st, int fd, int node_num)
ret = 0;
else
ret = -1;
offset = __le64_to_cpu(sb->super_offset);
offset += (int32_t) __le32_to_cpu(sb->bitmap_offset) * (node_num + 1);
offset = __le64_to_cpu(sb->super_offset) + __le32_to_cpu(sb->bitmap_offset);
if (node_num) {
bms = (bitmap_super_t*)(((char*)sb)+MAX_SB_SIZE);
bm_sectors_per_node = calc_bitmap_size(bms, 4096) >> 9;
offset += bm_sectors_per_node * node_num;
}
if (mustfree)
free(sb);
lseek64(fd, offset<<9, 0);