]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
super1: make write_bitmap1 compatible with previous mdadm versions
authorGuoqing Jiang <gqjiang@suse.com>
Wed, 12 Oct 2016 06:24:07 +0000 (02:24 -0400)
committerJes Sorensen <Jes.Sorensen@redhat.com>
Wed, 19 Oct 2016 15:21:15 +0000 (11:21 -0400)
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: 95a05b37e8eb ("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>
super1.c

index 9f62d23f4d6fe40f659d29f223e15aa465e7c780..4fef3789d39a00d0c8acd7b3461b9be20cf655cc 100644 (file)
--- a/super1.c
+++ b/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)