aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2011-03-09 13:54:27 -0500
committerTejun Heo <tj@kernel.org>2011-03-09 13:54:27 -0500
commit5b03a1b140e13a28ff6be1526892a9dc538ddef6 (patch)
tree63d6acaaf4d3c7855cbe4a76dca73f66cda72c31 /drivers/ide
parent69e02c59a7d962dced8047401b81a8d897e1702e (diff)
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
Diffstat (limited to 'drivers/ide')
-rw-r--r--drivers/ide/ide-cd.c10
-rw-r--r--drivers/ide/ide-cd.h3
-rw-r--r--drivers/ide/ide-cd_ioctl.c8
-rw-r--r--drivers/ide/ide-gd.c14
4 files changed, 20 insertions, 15 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index 0c73fe39a236..a2e29099ee0c 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -1177,7 +1177,7 @@ static struct cdrom_device_ops ide_cdrom_dops = {
1177 .open = ide_cdrom_open_real, 1177 .open = ide_cdrom_open_real,
1178 .release = ide_cdrom_release_real, 1178 .release = ide_cdrom_release_real,
1179 .drive_status = ide_cdrom_drive_status, 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 .tray_move = ide_cdrom_tray_move, 1181 .tray_move = ide_cdrom_tray_move,
1182 .lock_door = ide_cdrom_lock_door, 1182 .lock_door = ide_cdrom_lock_door,
1183 .select_speed = ide_cdrom_select_speed, 1183 .select_speed = ide_cdrom_select_speed,
@@ -1702,10 +1702,11 @@ static int idecd_ioctl(struct block_device *bdev, fmode_t mode,
1702} 1702}
1703 1703
1704 1704
1705static int idecd_media_changed(struct gendisk *disk) 1705static unsigned int idecd_check_events(struct gendisk *disk,
1706 unsigned int clearing)
1706{ 1707{
1707 struct cdrom_info *info = ide_drv_g(disk, cdrom_info); 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
1711static int idecd_revalidate_disk(struct gendisk *disk) 1712static int idecd_revalidate_disk(struct gendisk *disk)
@@ -1723,7 +1724,7 @@ static const struct block_device_operations idecd_ops = {
1723 .open = idecd_open, 1724 .open = idecd_open,
1724 .release = idecd_release, 1725 .release = idecd_release,
1725 .ioctl = idecd_ioctl, 1726 .ioctl = idecd_ioctl,
1726 .media_changed = idecd_media_changed, 1727 .check_events = idecd_check_events,
1727 .revalidate_disk = idecd_revalidate_disk 1728 .revalidate_disk = idecd_revalidate_disk
1728}; 1729};
1729 1730
@@ -1790,6 +1791,7 @@ static int ide_cd_probe(ide_drive_t *drive)
1790 ide_cd_read_toc(drive, &sense); 1791 ide_cd_read_toc(drive, &sense);
1791 g->fops = &idecd_ops; 1792 g->fops = &idecd_ops;
1792 g->flags |= GENHD_FL_REMOVABLE; 1793 g->flags |= GENHD_FL_REMOVABLE;
1794 g->events = DISK_EVENT_MEDIA_CHANGE;
1793 add_disk(g); 1795 add_disk(g);
1794 return 0; 1796 return 0;
1795 1797
diff --git a/drivers/ide/ide-cd.h b/drivers/ide/ide-cd.h
index 93a3cf1b0f3f..1efc936f5b66 100644
--- a/drivers/ide/ide-cd.h
+++ b/drivers/ide/ide-cd.h
@@ -111,7 +111,8 @@ int cdrom_check_status(ide_drive_t *, struct request_sense *);
111int ide_cdrom_open_real(struct cdrom_device_info *, int); 111int ide_cdrom_open_real(struct cdrom_device_info *, int);
112void ide_cdrom_release_real(struct cdrom_device_info *); 112void ide_cdrom_release_real(struct cdrom_device_info *);
113int ide_cdrom_drive_status(struct cdrom_device_info *, int); 113int ide_cdrom_drive_status(struct cdrom_device_info *, int);
114int ide_cdrom_check_media_change_real(struct cdrom_device_info *, int); 114unsigned int ide_cdrom_check_events_real(struct cdrom_device_info *,
115 unsigned int clearing, int slot_nr);
115int ide_cdrom_tray_move(struct cdrom_device_info *, int); 116int ide_cdrom_tray_move(struct cdrom_device_info *, int);
116int ide_cdrom_lock_door(struct cdrom_device_info *, int); 117int ide_cdrom_lock_door(struct cdrom_device_info *, int);
117int ide_cdrom_select_speed(struct cdrom_device_info *, int); 118int ide_cdrom_select_speed(struct cdrom_device_info *, int);
diff --git a/drivers/ide/ide-cd_ioctl.c b/drivers/ide/ide-cd_ioctl.c
index 766b3deeb23c..2a6bc50e8a41 100644
--- a/drivers/ide/ide-cd_ioctl.c
+++ b/drivers/ide/ide-cd_ioctl.c
@@ -79,8 +79,8 @@ int ide_cdrom_drive_status(struct cdrom_device_info *cdi, int slot_nr)
79 return CDS_DRIVE_NOT_READY; 79 return CDS_DRIVE_NOT_READY;
80} 80}
81 81
82int ide_cdrom_check_media_change_real(struct cdrom_device_info *cdi, 82unsigned int ide_cdrom_check_events_real(struct cdrom_device_info *cdi,
83 int slot_nr) 83 unsigned int clearing, int slot_nr)
84{ 84{
85 ide_drive_t *drive = cdi->handle; 85 ide_drive_t *drive = cdi->handle;
86 int retval; 86 int retval;
@@ -89,9 +89,9 @@ int ide_cdrom_check_media_change_real(struct cdrom_device_info *cdi,
89 (void) cdrom_check_status(drive, NULL); 89 (void) cdrom_check_status(drive, NULL);
90 retval = (drive->dev_flags & IDE_DFLAG_MEDIA_CHANGED) ? 1 : 0; 90 retval = (drive->dev_flags & IDE_DFLAG_MEDIA_CHANGED) ? 1 : 0;
91 drive->dev_flags &= ~IDE_DFLAG_MEDIA_CHANGED; 91 drive->dev_flags &= ~IDE_DFLAG_MEDIA_CHANGED;
92 return retval; 92 return retval ? DISK_EVENT_MEDIA_CHANGE : 0;
93 } else { 93 } else {
94 return -EINVAL; 94 return 0;
95 } 95 }
96} 96}
97 97
diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c
index 35c4b43585e3..c4ffd4888939 100644
--- a/drivers/ide/ide-gd.c
+++ b/drivers/ide/ide-gd.c
@@ -285,11 +285,12 @@ static int ide_gd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
285 return 0; 285 return 0;
286} 286}
287 287
288static int ide_gd_media_changed(struct gendisk *disk) 288static unsigned int ide_gd_check_events(struct gendisk *disk,
289 unsigned int clearing)
289{ 290{
290 struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj); 291 struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj);
291 ide_drive_t *drive = idkp->drive; 292 ide_drive_t *drive = idkp->drive;
292 int ret; 293 bool ret;
293 294
294 /* do not scan partitions twice if this is a removable device */ 295 /* do not scan partitions twice if this is a removable device */
295 if (drive->dev_flags & IDE_DFLAG_ATTACH) { 296 if (drive->dev_flags & IDE_DFLAG_ATTACH) {
@@ -297,10 +298,10 @@ static int ide_gd_media_changed(struct gendisk *disk)
297 return 0; 298 return 0;
298 } 299 }
299 300
300 ret = !!(drive->dev_flags & IDE_DFLAG_MEDIA_CHANGED); 301 ret = drive->dev_flags & IDE_DFLAG_MEDIA_CHANGED;
301 drive->dev_flags &= ~IDE_DFLAG_MEDIA_CHANGED; 302 drive->dev_flags &= ~IDE_DFLAG_MEDIA_CHANGED;
302 303
303 return ret; 304 return ret ? DISK_EVENT_MEDIA_CHANGE : 0;
304} 305}
305 306
306static void ide_gd_unlock_native_capacity(struct gendisk *disk) 307static void ide_gd_unlock_native_capacity(struct gendisk *disk)
@@ -318,7 +319,7 @@ static int ide_gd_revalidate_disk(struct gendisk *disk)
318 struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj); 319 struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj);
319 ide_drive_t *drive = idkp->drive; 320 ide_drive_t *drive = idkp->drive;
320 321
321 if (ide_gd_media_changed(disk)) 322 if (ide_gd_check_events(disk, 0))
322 drive->disk_ops->get_capacity(drive); 323 drive->disk_ops->get_capacity(drive);
323 324
324 set_capacity(disk, ide_gd_capacity(drive)); 325 set_capacity(disk, ide_gd_capacity(drive));
@@ -340,7 +341,7 @@ static const struct block_device_operations ide_gd_ops = {
340 .release = ide_gd_release, 341 .release = ide_gd_release,
341 .ioctl = ide_gd_ioctl, 342 .ioctl = ide_gd_ioctl,
342 .getgeo = ide_gd_getgeo, 343 .getgeo = ide_gd_getgeo,
343 .media_changed = ide_gd_media_changed, 344 .check_events = ide_gd_check_events,
344 .unlock_native_capacity = ide_gd_unlock_native_capacity, 345 .unlock_native_capacity = ide_gd_unlock_native_capacity,
345 .revalidate_disk = ide_gd_revalidate_disk 346 .revalidate_disk = ide_gd_revalidate_disk
346}; 347};
@@ -412,6 +413,7 @@ static int ide_gd_probe(ide_drive_t *drive)
412 if (drive->dev_flags & IDE_DFLAG_REMOVABLE) 413 if (drive->dev_flags & IDE_DFLAG_REMOVABLE)
413 g->flags = GENHD_FL_REMOVABLE; 414 g->flags = GENHD_FL_REMOVABLE;
414 g->fops = &ide_gd_ops; 415 g->fops = &ide_gd_ops;
416 g->events = DISK_EVENT_MEDIA_CHANGE;
415 add_disk(g); 417 add_disk(g);
416 return 0; 418 return 0;
417 419