summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXiao Ni <xni@redhat.com>2020-10-28 14:04:24 +0800
committerJes Sorensen <jsorensen@fb.com>2021-03-03 09:29:13 -0500
commit1fe2e1007310778d0551d5c34317e5318507399d (patch)
treee2a913303e65cb811b3e8a52510b29ec8cff1e3f
parent75562b57d43bd252399b55d0004b8eac4b337a67 (diff)
downloadmdadm-1fe2e1007310778d0551d5c34317e5318507399d.tar.gz
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>
-rw-r--r--super1.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/super1.c b/super1.c
index 8b0d6ff3..b5b379b3 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);