diff options
Diffstat (limited to 'drivers/md/md.c')
| -rw-r--r-- | drivers/md/md.c | 31 | 
1 files changed, 27 insertions, 4 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 0cc30ecda4c..818313e277e 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -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)  |