Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ide: Convert to bdops->check_events()

Convert ->media_changed() to the new ->check_events() method. The
conversion is mostly mechanical. The only notable change is that
cdrom now doesn't generate any event if @slot_nr isn't CDSL_CURRENT.
It used to return -EINVAL which would be treated as media changed. As
media changer isn't supported anyway, this doesn't make any
difference.

This makes ide emit the standard disk events and allows kernel event
polling. Currently, only MEDIA_CHANGE event is implemented. Adding
support for EJECT_REQUEST shouldn't be difficult; however, given that
ide driver is already deprecated, it probably is best to leave it
alone.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Jens Axboe <axboe@kernel.dk>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: linux-ide@vger.kernel.org

Tejun Heo 5b03a1b1 69e02c59

+20 -15
+6 -4
drivers/ide/ide-cd.c
··· 1177 1177 .open = ide_cdrom_open_real, 1178 1178 .release = ide_cdrom_release_real, 1179 1179 .drive_status = ide_cdrom_drive_status, 1180 - .media_changed = ide_cdrom_check_media_change_real, 1180 + .check_events = ide_cdrom_check_events_real, 1181 1181 .tray_move = ide_cdrom_tray_move, 1182 1182 .lock_door = ide_cdrom_lock_door, 1183 1183 .select_speed = ide_cdrom_select_speed, ··· 1702 1702 } 1703 1703 1704 1704 1705 - static int idecd_media_changed(struct gendisk *disk) 1705 + static unsigned int idecd_check_events(struct gendisk *disk, 1706 + unsigned int clearing) 1706 1707 { 1707 1708 struct cdrom_info *info = ide_drv_g(disk, cdrom_info); 1708 - return cdrom_media_changed(&info->devinfo); 1709 + return cdrom_check_events(&info->devinfo, clearing); 1709 1710 } 1710 1711 1711 1712 static int idecd_revalidate_disk(struct gendisk *disk) ··· 1724 1723 .open = idecd_open, 1725 1724 .release = idecd_release, 1726 1725 .ioctl = idecd_ioctl, 1727 - .media_changed = idecd_media_changed, 1726 + .check_events = idecd_check_events, 1728 1727 .revalidate_disk = idecd_revalidate_disk 1729 1728 }; 1730 1729 ··· 1791 1790 ide_cd_read_toc(drive, &sense); 1792 1791 g->fops = &idecd_ops; 1793 1792 g->flags |= GENHD_FL_REMOVABLE; 1793 + g->events = DISK_EVENT_MEDIA_CHANGE; 1794 1794 add_disk(g); 1795 1795 return 0; 1796 1796
+2 -1
drivers/ide/ide-cd.h
··· 111 111 int ide_cdrom_open_real(struct cdrom_device_info *, int); 112 112 void ide_cdrom_release_real(struct cdrom_device_info *); 113 113 int ide_cdrom_drive_status(struct cdrom_device_info *, int); 114 - int ide_cdrom_check_media_change_real(struct cdrom_device_info *, int); 114 + unsigned int ide_cdrom_check_events_real(struct cdrom_device_info *, 115 + unsigned int clearing, int slot_nr); 115 116 int ide_cdrom_tray_move(struct cdrom_device_info *, int); 116 117 int ide_cdrom_lock_door(struct cdrom_device_info *, int); 117 118 int ide_cdrom_select_speed(struct cdrom_device_info *, int);
+4 -4
drivers/ide/ide-cd_ioctl.c
··· 79 79 return CDS_DRIVE_NOT_READY; 80 80 } 81 81 82 - int ide_cdrom_check_media_change_real(struct cdrom_device_info *cdi, 83 - int slot_nr) 82 + unsigned int ide_cdrom_check_events_real(struct cdrom_device_info *cdi, 83 + unsigned int clearing, int slot_nr) 84 84 { 85 85 ide_drive_t *drive = cdi->handle; 86 86 int retval; ··· 89 89 (void) cdrom_check_status(drive, NULL); 90 90 retval = (drive->dev_flags & IDE_DFLAG_MEDIA_CHANGED) ? 1 : 0; 91 91 drive->dev_flags &= ~IDE_DFLAG_MEDIA_CHANGED; 92 - return retval; 92 + return retval ? DISK_EVENT_MEDIA_CHANGE : 0; 93 93 } else { 94 - return -EINVAL; 94 + return 0; 95 95 } 96 96 } 97 97
+8 -6
drivers/ide/ide-gd.c
··· 285 285 return 0; 286 286 } 287 287 288 - static int ide_gd_media_changed(struct gendisk *disk) 288 + static unsigned int ide_gd_check_events(struct gendisk *disk, 289 + unsigned int clearing) 289 290 { 290 291 struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj); 291 292 ide_drive_t *drive = idkp->drive; 292 - int ret; 293 + bool ret; 293 294 294 295 /* do not scan partitions twice if this is a removable device */ 295 296 if (drive->dev_flags & IDE_DFLAG_ATTACH) { ··· 298 297 return 0; 299 298 } 300 299 301 - ret = !!(drive->dev_flags & IDE_DFLAG_MEDIA_CHANGED); 300 + ret = drive->dev_flags & IDE_DFLAG_MEDIA_CHANGED; 302 301 drive->dev_flags &= ~IDE_DFLAG_MEDIA_CHANGED; 303 302 304 - return ret; 303 + return ret ? DISK_EVENT_MEDIA_CHANGE : 0; 305 304 } 306 305 307 306 static void ide_gd_unlock_native_capacity(struct gendisk *disk) ··· 319 318 struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj); 320 319 ide_drive_t *drive = idkp->drive; 321 320 322 - if (ide_gd_media_changed(disk)) 321 + if (ide_gd_check_events(disk, 0)) 323 322 drive->disk_ops->get_capacity(drive); 324 323 325 324 set_capacity(disk, ide_gd_capacity(drive)); ··· 341 340 .release = ide_gd_release, 342 341 .ioctl = ide_gd_ioctl, 343 342 .getgeo = ide_gd_getgeo, 344 - .media_changed = ide_gd_media_changed, 343 + .check_events = ide_gd_check_events, 345 344 .unlock_native_capacity = ide_gd_unlock_native_capacity, 346 345 .revalidate_disk = ide_gd_revalidate_disk 347 346 }; ··· 413 412 if (drive->dev_flags & IDE_DFLAG_REMOVABLE) 414 413 g->flags = GENHD_FL_REMOVABLE; 415 414 g->fops = &ide_gd_ops; 415 + g->events = DISK_EVENT_MEDIA_CHANGE; 416 416 add_disk(g); 417 417 return 0; 418 418