File 0001-make-write_bitmap1-compatible-with-previous-versions.patch of Package mdadm.7533

commit 19e7063adf81fdff0a4a1092df62cff621bc21f2
Author: Zhilong Liu <zlliu@suse.com>
Date:   Tue Nov 8 22:30:23 2016 -0500

      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: 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>
        Signed-off-by: Zhilong Liu <zlliu@suse.com>

diff --git a/super1.c b/super1.c
index 8bcaa2f..02c6610 100644
--- a/super1.c
+++ b/super1.c
@@ -2423,7 +2423,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)
openSUSE Build Service is sponsored by