From: NeilBrown Date: Wed, 24 Feb 2010 00:31:48 +0000 (+1100) Subject: super1: put bitmap on a 4K boundary when possible. X-Git-Tag: mdadm-3.1.2~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a31128d2de3c3b60e6cbcceef391479ad3c0cfb4;p=thirdparty%2Fmdadm.git super1: put bitmap on a 4K boundary when possible. Some devices have 4K sector sizes. So try to align the bitmap on a 4K boundary. This isn't possible when hot-adding a bitmap, but will be once we add support for configuring the bitmap via sysfs. Signed-off-by: NeilBrown --- diff --git a/super1.c b/super1.c index 40fbb81a..7861cf44 100644 --- a/super1.c +++ b/super1.c @@ -1445,8 +1445,8 @@ add_internal_bitmap1(struct supertype *st, switch(st->minor_version) { case 0: - /* either 3K after the superblock, or some amount of space - * before. + /* either 3K after the superblock (when hot-add), + * or some amount of space before. */ if (may_change) { /* We are creating array, so we *know* how much room has @@ -1454,11 +1454,6 @@ add_internal_bitmap1(struct supertype *st, */ offset = 0; room = choose_bm_space(__le64_to_cpu(sb->size)); - if (room == 4*2) { - /* make it 3K after the superblock */ - room = 3*2; - offset = 2; - } } else { room = __le64_to_cpu(sb->super_offset) - __le64_to_cpu(sb->data_offset) @@ -1519,8 +1514,12 @@ add_internal_bitmap1(struct supertype *st, return 0; if (offset == 0) { + /* start bitmap on a 4K boundary with enough space for + * the bitmap + */ bits = (size*512) / chunk + 1; - room = ((bits+7)/8 + sizeof(bitmap_super_t) +511)/512; + room = ((bits+7)/8 + sizeof(bitmap_super_t) +4095)/4096; + room *= 8; /* convert 4K blocks to sectors */ offset = -room; }