mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 01:51:34 +00:00
md: Skip cluster setup for dm-raid
There is a bug that the bitmap superblock isn't initialised properly for dm-raid, so a new field can have garbage in new fields. (dm-raid does initialisation in the kernel - md initialised the superblock in mdadm). This means that for dm-raid we cannot currently trust the new ->nodes field. So: - use __GFP_ZERO to initialise the superblock properly for all new arrays - initialise all fields in bitmap_info in bitmap_new_disk_sb - ignore ->nodes for dm arrays (yes, this is a hack) This bug exposes dm-raid to bug in the (still experimental) md-cluster code, so it is suitable for -stable. It does cause crashes. References: https://bugzilla.kernel.org/show_bug.cgi?id=100491 Cc: stable@vger.kernel.org (v4.1) Signed-off-By: Goldwyn Rodrigues <rgoldwyn@suse.com> Signed-off-by: NeilBrown <neilb@suse.com>
This commit is contained in:
parent
ee5d004fd0
commit
d3b178adb3
@ -494,7 +494,7 @@ static int bitmap_new_disk_sb(struct bitmap *bitmap)
|
|||||||
bitmap_super_t *sb;
|
bitmap_super_t *sb;
|
||||||
unsigned long chunksize, daemon_sleep, write_behind;
|
unsigned long chunksize, daemon_sleep, write_behind;
|
||||||
|
|
||||||
bitmap->storage.sb_page = alloc_page(GFP_KERNEL);
|
bitmap->storage.sb_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
|
||||||
if (bitmap->storage.sb_page == NULL)
|
if (bitmap->storage.sb_page == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
bitmap->storage.sb_page->index = 0;
|
bitmap->storage.sb_page->index = 0;
|
||||||
@ -541,6 +541,7 @@ static int bitmap_new_disk_sb(struct bitmap *bitmap)
|
|||||||
sb->state = cpu_to_le32(bitmap->flags);
|
sb->state = cpu_to_le32(bitmap->flags);
|
||||||
bitmap->events_cleared = bitmap->mddev->events;
|
bitmap->events_cleared = bitmap->mddev->events;
|
||||||
sb->events_cleared = cpu_to_le64(bitmap->mddev->events);
|
sb->events_cleared = cpu_to_le64(bitmap->mddev->events);
|
||||||
|
bitmap->mddev->bitmap_info.nodes = 0;
|
||||||
|
|
||||||
kunmap_atomic(sb);
|
kunmap_atomic(sb);
|
||||||
|
|
||||||
@ -611,8 +612,16 @@ re_read:
|
|||||||
daemon_sleep = le32_to_cpu(sb->daemon_sleep) * HZ;
|
daemon_sleep = le32_to_cpu(sb->daemon_sleep) * HZ;
|
||||||
write_behind = le32_to_cpu(sb->write_behind);
|
write_behind = le32_to_cpu(sb->write_behind);
|
||||||
sectors_reserved = le32_to_cpu(sb->sectors_reserved);
|
sectors_reserved = le32_to_cpu(sb->sectors_reserved);
|
||||||
nodes = le32_to_cpu(sb->nodes);
|
/* XXX: This is a hack to ensure that we don't use clustering
|
||||||
strlcpy(bitmap->mddev->bitmap_info.cluster_name, sb->cluster_name, 64);
|
* in case:
|
||||||
|
* - dm-raid is in use and
|
||||||
|
* - the nodes written in bitmap_sb is erroneous.
|
||||||
|
*/
|
||||||
|
if (!bitmap->mddev->sync_super) {
|
||||||
|
nodes = le32_to_cpu(sb->nodes);
|
||||||
|
strlcpy(bitmap->mddev->bitmap_info.cluster_name,
|
||||||
|
sb->cluster_name, 64);
|
||||||
|
}
|
||||||
|
|
||||||
/* verify that the bitmap-specific fields are valid */
|
/* verify that the bitmap-specific fields are valid */
|
||||||
if (sb->magic != cpu_to_le32(BITMAP_MAGIC))
|
if (sb->magic != cpu_to_le32(BITMAP_MAGIC))
|
||||||
|
Loading…
Reference in New Issue
Block a user