|
@@ -553,6 +553,9 @@ static mddev_t * mddev_find(dev_t unit)
|
|
|
{
|
|
|
mddev_t *mddev, *new = NULL;
|
|
|
|
|
|
+ if (unit && MAJOR(unit) != MD_MAJOR)
|
|
|
+ unit &= ~((1<<MdpMinorShift)-1);
|
|
|
+
|
|
|
retry:
|
|
|
spin_lock(&all_mddevs_lock);
|
|
|
|
|
@@ -4138,10 +4141,10 @@ array_size_store(mddev_t *mddev, const char *buf, size_t len)
|
|
|
}
|
|
|
|
|
|
mddev->array_sectors = sectors;
|
|
|
- set_capacity(mddev->gendisk, mddev->array_sectors);
|
|
|
- if (mddev->pers)
|
|
|
+ if (mddev->pers) {
|
|
|
+ set_capacity(mddev->gendisk, mddev->array_sectors);
|
|
|
revalidate_disk(mddev->gendisk);
|
|
|
-
|
|
|
+ }
|
|
|
return len;
|
|
|
}
|
|
|
|
|
@@ -4624,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;
|
|
@@ -4712,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;
|
|
@@ -4827,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)
|
|
@@ -6011,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;
|
|
|
}
|
|
@@ -6026,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,
|
|
@@ -6036,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)
|