DASD: Send 'change' uevents A DASD is only useable after the internal state machine transitioned to 'ready', way after the device has been added to sysfs. So we need to send out a 'change' event here to notify udev. Signed-off-by: Hannes Reinecke diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 0a225cc..447fcdc 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -335,7 +335,9 @@ static int dasd_state_unfmt_to_basic(struct dasd_device *device) static int dasd_state_ready_to_online(struct dasd_device * device) { - int rc; + int rc, i; + struct gendisk *disk = device->bdev->bd_disk; + struct hd_struct *p; if (device->discipline->ready_to_online) { rc = device->discipline->ready_to_online(device); @@ -345,6 +347,15 @@ dasd_state_ready_to_online(struct dasd_device * device) device->state = DASD_STATE_ONLINE; if (device->block) dasd_schedule_block_bh(device->block); + + kobject_uevent(&disk->kobj, KOBJ_CHANGE); + /* send uevents for all partitions */ + for (i = 1; i < disk->minors; i++) { + p = disk->part[i-1]; + if (!p || !p->nr_sects) + continue; + kobject_uevent(&p->kobj, KOBJ_CHANGE); + } return 0; } @@ -353,7 +364,9 @@ dasd_state_ready_to_online(struct dasd_device * device) */ static int dasd_state_online_to_ready(struct dasd_device *device) { - int rc; + int rc, i; + struct gendisk *disk = device->bdev->bd_disk; + struct hd_struct *p; if (device->discipline->online_to_ready) { rc = device->discipline->online_to_ready(device); @@ -361,6 +374,14 @@ static int dasd_state_online_to_ready(struct dasd_device *device) return rc; } device->state = DASD_STATE_READY; + /* send uevents for all partitions */ + for (i = 1; i < disk->minors; i++) { + p = disk->part[i-1]; + if (!p || !p->nr_sects) + continue; + kobject_uevent(&p->kobj, KOBJ_CHANGE); + } + kobject_uevent(&disk->kobj, KOBJ_CHANGE); return 0; }