super1: make write_bitmap1 compatible with previous mdadm versions
For older mdadm version, v1.x metadata has different bitmap_offset,
we can't ensure all the bitmaps are on a 4K boundary since writing
4K for bitmap could corrupt the superblock, and Anthony reported
the bug about it at below link.
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=837964
So let's check about the alignment for bitmap_offset before set
the boundary to 4096 unconditionally. Thanks for Neil's detailed
explanation.
Reported-by: Anthony DeRobertis <anthony@derobert.net>
Fixes: 95a05b37e8
("Create n bitmaps for clustered mode")
Cc: Neil Brown <neilb@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
This commit is contained in:
parent
681b7ae245
commit
119b66a473
10
super1.c
10
super1.c
|
@ -2433,7 +2433,15 @@ static int write_bitmap1(struct supertype *st, int fd, enum bitmap_update update
|
|||
memset(buf, 0xff, 4096);
|
||||
memcpy(buf, (char *)bms, sizeof(bitmap_super_t));
|
||||
|
||||
towrite = calc_bitmap_size(bms, 4096);
|
||||
/*
|
||||
* use 4096 boundary if bitmap_offset is aligned
|
||||
* with 8 sectors, then it should compatible with
|
||||
* older mdadm.
|
||||
*/
|
||||
if (__le32_to_cpu(sb->bitmap_offset) & 7)
|
||||
towrite = calc_bitmap_size(bms, 512);
|
||||
else
|
||||
towrite = calc_bitmap_size(bms, 4096);
|
||||
while (towrite > 0) {
|
||||
n = towrite;
|
||||
if (n > 4096)
|
||||
|
|
Loading…
Reference in New Issue