summaryrefslogtreecommitdiff
path: root/super1.c
diff options
context:
space:
mode:
authorMichael Tokarev <mjt@tls.msk.ru>2014-09-20 08:50:44 +0400
committerMichael Tokarev <mjt@tls.msk.ru>2014-09-20 08:50:44 +0400
commit20d0ba040d767361c1d0c8a825b2a5e8bfdb39a6 (patch)
tree687a5eda9314ea76da64e234ba269d84345f7efe /super1.c
parentfef4f4267e21104887eba03b8ddec5e6a3fc9747 (diff)
parentfed12d436b9803ad97d1f11cc8f312ab08c3a659 (diff)
Merge tag 'mdadm-3.3.2' into debian
Release mdadm-3.3.2 Minor bugfix/stability release.
Diffstat (limited to 'super1.c')
-rw-r--r--super1.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/super1.c b/super1.c
index 1bc5216f..727a08a1 100644
--- a/super1.c
+++ b/super1.c
@@ -22,6 +22,7 @@
* Email: <neilb@suse.de>
*/
+#include <stddef.h>
#include "mdadm.h"
/*
* The version-1 superblock :
@@ -133,9 +134,6 @@ struct misc_dev_info {
|MD_FEATURE_NEW_OFFSET \
)
-#ifndef offsetof
-#define offsetof(t,f) ((size_t)&(((t*)0)->f))
-#endif
static unsigned int calc_sb_1_csum(struct mdp_superblock_1 * sb)
{
unsigned int disk_csum, csum;
@@ -1559,7 +1557,7 @@ static int write_init_super1(struct supertype *st)
unsigned long long data_offset;
for (di = st->info; di; di = di->next) {
- if (di->disk.state == 1)
+ if (di->disk.state & (1 << MD_DISK_FAULTY))
continue;
if (di->fd < 0)
continue;
@@ -1690,6 +1688,10 @@ static int write_init_super1(struct supertype *st)
rv = -EINVAL;
goto out;
}
+ if (conf_get_create_info()->bblist == 0) {
+ sb->bblog_size = 0;
+ sb->bblog_offset = 0;
+ }
sb->sb_csum = calc_sb_1_csum(sb);
rv = store_super1(st, di->fd);
@@ -2046,8 +2048,8 @@ add_internal_bitmap1(struct supertype *st,
* been left.
*/
offset = 0;
- room = choose_bm_space(__le64_to_cpu(sb->size));
bbl_size = 8;
+ room = choose_bm_space(__le64_to_cpu(sb->size)) + bbl_size;
} else {
room = __le64_to_cpu(sb->super_offset)
- __le64_to_cpu(sb->data_offset)
@@ -2073,8 +2075,8 @@ add_internal_bitmap1(struct supertype *st,
case 2: /* between superblock and data */
if (creating) {
offset = 4*2;
- room = choose_bm_space(__le64_to_cpu(sb->size));
bbl_size = 8;
+ room = choose_bm_space(__le64_to_cpu(sb->size)) + bbl_size;
} else {
room = __le64_to_cpu(sb->data_offset)
- __le64_to_cpu(sb->super_offset);
@@ -2103,6 +2105,10 @@ add_internal_bitmap1(struct supertype *st,
/* Limit to 128K of bitmap when chunk size not requested */
room = 128*2;
+ if (room <= 1)
+ /* No room for a bitmap */
+ return 0;
+
max_bits = (room * 512 - sizeof(bitmap_super_t)) * 8;
min_chunk = 4096; /* sub-page chunks don't work yet.. */