浏览代码

[PATCH] md: make sure mddev->bitmap_offset gets cleared between array instantiations.

... otherwise we might try to load a bitmap from an array which hasn't one.

The bug is that if you create an array with an internal bitmap, shut it down,
and then create an array with the same md device, the md drive will assume it
should have a bitmap too.  As the array can be created with a different md
device, it is mostly an inconvenience.  I'm pretty sure there is no risk of
data corruption.

Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
NeilBrown 20 年之前
父节点
当前提交
9223214e8d
共有 1 个文件被更改,包括 3 次插入0 次删除
  1. 3 0
      drivers/md/md.c

+ 3 - 0
drivers/md/md.c

@@ -623,6 +623,7 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
 		mddev->raid_disks = sb->raid_disks;
 		mddev->raid_disks = sb->raid_disks;
 		mddev->size = sb->size;
 		mddev->size = sb->size;
 		mddev->events = md_event(sb);
 		mddev->events = md_event(sb);
+		mddev->bitmap_offset = 0;
 
 
 		if (sb->state & (1<<MD_SB_CLEAN))
 		if (sb->state & (1<<MD_SB_CLEAN))
 			mddev->recovery_cp = MaxSector;
 			mddev->recovery_cp = MaxSector;
@@ -938,6 +939,7 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
 		mddev->raid_disks = le32_to_cpu(sb->raid_disks);
 		mddev->raid_disks = le32_to_cpu(sb->raid_disks);
 		mddev->size = le64_to_cpu(sb->size)/2;
 		mddev->size = le64_to_cpu(sb->size)/2;
 		mddev->events = le64_to_cpu(sb->events);
 		mddev->events = le64_to_cpu(sb->events);
+		mddev->bitmap_offset = 0;
 		
 		
 		mddev->recovery_cp = le64_to_cpu(sb->resync_offset);
 		mddev->recovery_cp = le64_to_cpu(sb->resync_offset);
 		memcpy(mddev->uuid, sb->set_uuid, 16);
 		memcpy(mddev->uuid, sb->set_uuid, 16);
@@ -1824,6 +1826,7 @@ static int do_md_stop(mddev_t * mddev, int ro)
 		fput(mddev->bitmap_file);
 		fput(mddev->bitmap_file);
 		mddev->bitmap_file = NULL;
 		mddev->bitmap_file = NULL;
 	}
 	}
+	mddev->bitmap_offset = 0;
 
 
 	/*
 	/*
 	 * Free resources if final stop
 	 * Free resources if final stop