From 6acbe512e548f68c4ab586893495db593a15456f Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Thu, 24 Feb 2011 17:26:41 +1100 Subject: [PATCH] --- yaml --- r: 233661 b: refs/heads/master c: f0b4f7e2f29af678bd9af43422c537dcb6008603 h: refs/heads/master i: 233659: 6ccc28f57ad608a88b6bcd0729964b3cfbbfc31b v: v3 --- [refs] | 2 +- trunk/drivers/md/md.c | 22 +++++++++++++++++++++- trunk/drivers/md/md.h | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 960b3056049f..c5822fb13376 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 93b270f76e7ef3b81001576860c2701931cdc78b +refs/heads/master: f0b4f7e2f29af678bd9af43422c537dcb6008603 diff --git a/trunk/drivers/md/md.c b/trunk/drivers/md/md.c index 330addfe9b77..818313e277e7 100644 --- a/trunk/drivers/md/md.c +++ b/trunk/drivers/md/md.c @@ -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) diff --git a/trunk/drivers/md/md.h b/trunk/drivers/md/md.h index 7e90b8593b2a..12215d437fcc 100644 --- a/trunk/drivers/md/md.h +++ b/trunk/drivers/md/md.h @@ -274,6 +274,8 @@ struct mddev_s atomic_t active; /* general refcount */ atomic_t openers; /* number of active opens */ + int changed; /* True if we might need to + * reread partition info */ int degraded; /* whether md should consider * adding a spare */