summaryrefslogtreecommitdiff
path: root/super1.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2013-05-22 16:00:21 +1000
committerNeilBrown <neilb@suse.de>2013-05-22 16:00:21 +1000
commitf79bbf4f690454a91a6f98e559a854cf400439c5 (patch)
treeeb74943c9e5cb8c23322faff2a57374b7b381d92 /super1.c
parent8876bf0bb66d8437cd91607417ada386add14d04 (diff)
super1: don't put the bblog at the end of the free space.
It seems like a nice location, but it means that we cannot decrease the data_offset during a reshape. So put it just after the bitmap, leaving 32K. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'super1.c')
-rw-r--r--super1.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/super1.c b/super1.c
index 5331cac1..e54cd544 100644
--- a/super1.c
+++ b/super1.c
@@ -1186,16 +1186,17 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
}
#endif
if (sb_offset < data_offset) {
- /* 1.1 or 1.2. Put bbl just before data
+ /* 1.1 or 1.2. Put bbl after bitmap leaving at least 32K
*/
long bb_offset;
- space = data_offset - sb_offset;
- bb_offset = space - 8;
+ bb_offset = sb_offset + 8;
if (bm_sectors && bitmap_offset > 0)
- space -= (bitmap_offset + bm_sectors);
- else
- space -= 8; /* The superblock */
- if (space >= 8) {
+ bb_offset = bitmap_offset + bm_sectors;
+ while (bb_offset < (long)sb_offset + 8 + 32*2
+ && bb_offset + 8+8 <= (long)data_offset)
+ /* too close to bitmap, and room to grow */
+ bb_offset += 8;
+ if (bb_offset + 8 <= (long)data_offset) {
sb->bblog_size = __cpu_to_le16(8);
sb->bblog_offset = __cpu_to_le32(bb_offset);
}
@@ -1616,7 +1617,10 @@ static int write_init_super1(struct supertype *st)
sb->data_offset = __cpu_to_le64(reserved);
sb->data_size = __cpu_to_le64(dsize - reserved);
- if (reserved >= 16) {
+ if (reserved >= 8 + 32*2 + 8) {
+ sb->bblog_size = __cpu_to_le16(8);
+ sb->bblog_offset = __cpu_to_le32(8 + 32*2);
+ } else if (reserved >= 16) {
sb->bblog_size = __cpu_to_le16(8);
sb->bblog_offset = __cpu_to_le32(reserved-8);
}
@@ -1648,7 +1652,10 @@ static int write_init_super1(struct supertype *st)
sb->data_offset = __cpu_to_le64(reserved);
sb->data_size = __cpu_to_le64(dsize - reserved);
- if (reserved >= 16+16) {
+ if (reserved >= 16 + 32*2 + 8) {
+ sb->bblog_size = __cpu_to_le16(8);
+ sb->bblog_offset = __cpu_to_le32(8 + 32*2);
+ } else if (reserved >= 16+16) {
sb->bblog_size = __cpu_to_le16(8);
/* '8' sectors for the bblog, and another '8'
* because we want offset from superblock, not