md: Handle growth of v1.x metadata correctly.

The v1.x metadata does not have a fixed size and can grow
when devices are added.
If it grows enough to require an extra sector of storage,
we need to update the 'sb_size' to match.

Without this, md can write out an incomplete superblock with a
bad checksum, which will be rejected when trying to re-assemble
the array.

Cc: stable@kernel.org
Signed-off-by: NeilBrown <neilb@suse.de>

NeilBrown 70471daf 3673f305

+7 -1
+7 -1
drivers/md/md.c
··· 1399 if (rdev2->desc_nr+1 > max_dev) 1400 max_dev = rdev2->desc_nr+1; 1401 1402 - if (max_dev > le32_to_cpu(sb->max_dev)) 1403 sb->max_dev = cpu_to_le32(max_dev); 1404 for (i=0; i<max_dev;i++) 1405 sb->dev_roles[i] = cpu_to_le16(0xfffe); 1406
··· 1399 if (rdev2->desc_nr+1 > max_dev) 1400 max_dev = rdev2->desc_nr+1; 1401 1402 + if (max_dev > le32_to_cpu(sb->max_dev)) { 1403 + int bmask; 1404 sb->max_dev = cpu_to_le32(max_dev); 1405 + rdev->sb_size = max_dev * 2 + 256; 1406 + bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1; 1407 + if (rdev->sb_size & bmask) 1408 + rdev->sb_size = (rdev->sb_size | bmask) + 1; 1409 + } 1410 for (i=0; i<max_dev;i++) 1411 sb->dev_roles[i] = cpu_to_le16(0xfffe); 1412