|
@@ -4627,6 +4627,7 @@ static int do_md_run(mddev_t *mddev)
|
|
|
}
|
|
|
set_capacity(mddev->gendisk, mddev->array_sectors);
|
|
|
revalidate_disk(mddev->gendisk);
|
|
|
+ mddev->changed = 1;
|
|
|
kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE);
|
|
|
out:
|
|
|
return err;
|
|
@@ -4715,6 +4716,7 @@ static void md_clean(mddev_t *mddev)
|
|
|
mddev->sync_speed_min = mddev->sync_speed_max = 0;
|
|
|
mddev->recovery = 0;
|
|
|
mddev->in_sync = 0;
|
|
|
+ mddev->changed = 0;
|
|
|
mddev->degraded = 0;
|
|
|
mddev->safemode = 0;
|
|
|
mddev->bitmap_info.offset = 0;
|
|
@@ -4830,6 +4832,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
|
|
|
|
|
|
set_capacity(disk, 0);
|
|
|
mutex_unlock(&mddev->open_mutex);
|
|
|
+ mddev->changed = 1;
|
|
|
revalidate_disk(disk);
|
|
|
|
|
|
if (mddev->ro)
|
|
@@ -6014,7 +6017,7 @@ static int md_open(struct block_device *bdev, fmode_t mode)
|
|
|
atomic_inc(&mddev->openers);
|
|
|
mutex_unlock(&mddev->open_mutex);
|
|
|
|
|
|
- check_disk_size_change(mddev->gendisk, bdev);
|
|
|
+ check_disk_change(bdev);
|
|
|
out:
|
|
|
return err;
|
|
|
}
|
|
@@ -6029,6 +6032,21 @@ static int md_release(struct gendisk *disk, fmode_t mode)
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+static int md_media_changed(struct gendisk *disk)
|
|
|
+{
|
|
|
+ mddev_t *mddev = disk->private_data;
|
|
|
+
|
|
|
+ return mddev->changed;
|
|
|
+}
|
|
|
+
|
|
|
+static int md_revalidate(struct gendisk *disk)
|
|
|
+{
|
|
|
+ mddev_t *mddev = disk->private_data;
|
|
|
+
|
|
|
+ mddev->changed = 0;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
static const struct block_device_operations md_fops =
|
|
|
{
|
|
|
.owner = THIS_MODULE,
|
|
@@ -6039,6 +6057,8 @@ static const struct block_device_operations md_fops =
|
|
|
.compat_ioctl = md_compat_ioctl,
|
|
|
#endif
|
|
|
.getgeo = md_getgeo,
|
|
|
+ .media_changed = md_media_changed,
|
|
|
+ .revalidate_disk= md_revalidate,
|
|
|
};
|
|
|
|
|
|
static int md_thread(void * arg)
|