md: Fix unfortunate interaction with evms
evms configures md arrays by: open device send ioctl close device for each different ioctl needed. Since 2.6.29, the device can disappear after the 'close' unless a significant configuration has happened to the device. The change made by "SET_ARRAY_INFO" can too minor to stop the device from disappearing, but important enough that losing the change is bad. So: make sure SET_ARRAY_INFO sets mddev->ctime, and keep the device active as long as ctime is non-zero (it gets zeroed with lots of other things when the array is stopped). This is suitable for -stable kernels since 2.6.29. Signed-off-by: NeilBrown <neilb@suse.de> Cc: stable@kernel.org
This commit is contained in:
Родитель
6b7b284958
Коммит
cbd1998377
|
@ -386,7 +386,9 @@ static void mddev_put(mddev_t *mddev)
|
|||
if (!atomic_dec_and_lock(&mddev->active, &all_mddevs_lock))
|
||||
return;
|
||||
if (!mddev->raid_disks && list_empty(&mddev->disks) &&
|
||||
!mddev->hold_active) {
|
||||
mddev->ctime == 0 && !mddev->hold_active) {
|
||||
/* Array is not configured at all, and not held active,
|
||||
* so destroy it */
|
||||
list_del(&mddev->all_mddevs);
|
||||
if (mddev->gendisk) {
|
||||
/* we did a probe so need to clean up.
|
||||
|
@ -5262,6 +5264,10 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info)
|
|||
mddev->minor_version = info->minor_version;
|
||||
mddev->patch_version = info->patch_version;
|
||||
mddev->persistent = !info->not_persistent;
|
||||
/* ensure mddev_put doesn't delete this now that there
|
||||
* is some minimal configuration.
|
||||
*/
|
||||
mddev->ctime = get_seconds();
|
||||
return 0;
|
||||
}
|
||||
mddev->major_version = MD_MAJOR_VERSION;
|
||||
|
|
Загрузка…
Ссылка в новой задаче