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>
This commit is contained in:
parent
3673f305fa
commit
70471dafe3
|
@ -1399,8 +1399,14 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
|
||||||
if (rdev2->desc_nr+1 > max_dev)
|
if (rdev2->desc_nr+1 > max_dev)
|
||||||
max_dev = rdev2->desc_nr+1;
|
max_dev = rdev2->desc_nr+1;
|
||||||
|
|
||||||
if (max_dev > le32_to_cpu(sb->max_dev))
|
if (max_dev > le32_to_cpu(sb->max_dev)) {
|
||||||
|
int bmask;
|
||||||
sb->max_dev = cpu_to_le32(max_dev);
|
sb->max_dev = cpu_to_le32(max_dev);
|
||||||
|
rdev->sb_size = max_dev * 2 + 256;
|
||||||
|
bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1;
|
||||||
|
if (rdev->sb_size & bmask)
|
||||||
|
rdev->sb_size = (rdev->sb_size | bmask) + 1;
|
||||||
|
}
|
||||||
for (i=0; i<max_dev;i++)
|
for (i=0; i<max_dev;i++)
|
||||||
sb->dev_roles[i] = cpu_to_le16(0xfffe);
|
sb->dev_roles[i] = cpu_to_le16(0xfffe);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue