From 1fe2e1007310778d0551d5c34317e5318507399d Mon Sep 17 00:00:00 2001 From: Xiao Ni Date: Wed, 28 Oct 2020 14:04:24 +0800 Subject: [PATCH] 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 Signed-off-by: Jes Sorensen --- super1.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/super1.c b/super1.c index 8b0d6ff..b5b379b 100644 --- a/super1.c +++ b/super1.c @@ -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);