diff options
Diffstat (limited to 'drivers/ide/ide-gd.c')
| -rw-r--r-- | drivers/ide/ide-gd.c | 25 | 
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c index 35c4b43585e..838996a0039 100644 --- a/drivers/ide/ide-gd.c +++ b/drivers/ide/ide-gd.c @@ -250,7 +250,7 @@ static int ide_gd_unlocked_open(struct block_device *bdev, fmode_t mode)  } -static int ide_gd_release(struct gendisk *disk, fmode_t mode) +static void ide_gd_release(struct gendisk *disk, fmode_t mode)  {  	struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj);  	ide_drive_t *drive = idkp->drive; @@ -270,8 +270,6 @@ static int ide_gd_release(struct gendisk *disk, fmode_t mode)  	ide_disk_put(idkp);  	mutex_unlock(&ide_gd_mutex); - -	return 0;  }  static int ide_gd_getgeo(struct block_device *bdev, struct hd_geometry *geo) @@ -285,11 +283,12 @@ static int ide_gd_getgeo(struct block_device *bdev, struct hd_geometry *geo)  	return 0;  } -static int ide_gd_media_changed(struct gendisk *disk) +static unsigned int ide_gd_check_events(struct gendisk *disk, +					unsigned int clearing)  {  	struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj);  	ide_drive_t *drive = idkp->drive; -	int ret; +	bool ret;  	/* do not scan partitions twice if this is a removable device */  	if (drive->dev_flags & IDE_DFLAG_ATTACH) { @@ -297,10 +296,16 @@ static int ide_gd_media_changed(struct gendisk *disk)  		return 0;  	} -	ret = !!(drive->dev_flags & IDE_DFLAG_MEDIA_CHANGED); +	/* +	 * The following is used to force revalidation on the first open on +	 * removeable devices, and never gets reported to userland as +	 * genhd->events is 0.  This is intended as removeable ide disk +	 * can't really detect MEDIA_CHANGE events. +	 */ +	ret = drive->dev_flags & IDE_DFLAG_MEDIA_CHANGED;  	drive->dev_flags &= ~IDE_DFLAG_MEDIA_CHANGED; -	return ret; +	return ret ? DISK_EVENT_MEDIA_CHANGE : 0;  }  static void ide_gd_unlock_native_capacity(struct gendisk *disk) @@ -318,7 +323,7 @@ static int ide_gd_revalidate_disk(struct gendisk *disk)  	struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj);  	ide_drive_t *drive = idkp->drive; -	if (ide_gd_media_changed(disk)) +	if (ide_gd_check_events(disk, 0))  		drive->disk_ops->get_capacity(drive);  	set_capacity(disk, ide_gd_capacity(drive)); @@ -340,7 +345,7 @@ static const struct block_device_operations ide_gd_ops = {  	.release		= ide_gd_release,  	.ioctl			= ide_gd_ioctl,  	.getgeo			= ide_gd_getgeo, -	.media_changed		= ide_gd_media_changed, +	.check_events		= ide_gd_check_events,  	.unlock_native_capacity	= ide_gd_unlock_native_capacity,  	.revalidate_disk	= ide_gd_revalidate_disk  }; @@ -387,7 +392,7 @@ static int ide_gd_probe(ide_drive_t *drive)  	idkp->dev.parent = &drive->gendev;  	idkp->dev.release = ide_disk_release; -	dev_set_name(&idkp->dev, dev_name(&drive->gendev)); +	dev_set_name(&idkp->dev, "%s", dev_name(&drive->gendev));  	if (device_register(&idkp->dev))  		goto out_free_disk;  | 
