Commit 1c27030bd21e7e2c68ef5be9f28c63778cf4b27f
1 parent
1a8a74f03f
Exists in
master
and in
20 other branches
gdrom,viocd: Convert to bdops->check_events()
Convert gdrom and viocd from ->media_changed() to ->check_events(). It's unclear how the conditions are cleared and it's possible that it may generate spurious events when polled. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Jens Axboe <axboe@kernel.dk> Cc: Kay Sievers <kay.sievers@vrfy.org>
Showing 2 changed files with 20 additions and 13 deletions Side-by-side Diff
drivers/cdrom/gdrom.c
... | ... | @@ -395,10 +395,12 @@ |
395 | 395 | return CDS_NO_INFO; |
396 | 396 | } |
397 | 397 | |
398 | -static int gdrom_mediachanged(struct cdrom_device_info *cd_info, int ignore) | |
398 | +static unsigned int gdrom_check_events(struct cdrom_device_info *cd_info, | |
399 | + unsigned int clearing, int ignore) | |
399 | 400 | { |
400 | 401 | /* check the sense key */ |
401 | - return (__raw_readb(GDROM_ERROR_REG) & 0xF0) == 0x60; | |
402 | + return (__raw_readb(GDROM_ERROR_REG) & 0xF0) == 0x60 ? | |
403 | + DISK_EVENT_MEDIA_CHANGE : 0; | |
402 | 404 | } |
403 | 405 | |
404 | 406 | /* reset the G1 bus */ |
... | ... | @@ -483,7 +485,7 @@ |
483 | 485 | .open = gdrom_open, |
484 | 486 | .release = gdrom_release, |
485 | 487 | .drive_status = gdrom_drivestatus, |
486 | - .media_changed = gdrom_mediachanged, | |
488 | + .check_events = gdrom_check_events, | |
487 | 489 | .get_last_session = gdrom_get_last_session, |
488 | 490 | .reset = gdrom_hardreset, |
489 | 491 | .audio_ioctl = gdrom_audio_ioctl, |
490 | 492 | |
... | ... | @@ -509,9 +511,10 @@ |
509 | 511 | return 0; |
510 | 512 | } |
511 | 513 | |
512 | -static int gdrom_bdops_mediachanged(struct gendisk *disk) | |
514 | +static unsigned int gdrom_bdops_check_events(struct gendisk *disk, | |
515 | + unsigned int clearing) | |
513 | 516 | { |
514 | - return cdrom_media_changed(gd.cd_info); | |
517 | + return cdrom_check_events(gd.cd_info, clearing); | |
515 | 518 | } |
516 | 519 | |
517 | 520 | static int gdrom_bdops_ioctl(struct block_device *bdev, fmode_t mode, |
... | ... | @@ -530,7 +533,7 @@ |
530 | 533 | .owner = THIS_MODULE, |
531 | 534 | .open = gdrom_bdops_open, |
532 | 535 | .release = gdrom_bdops_release, |
533 | - .media_changed = gdrom_bdops_mediachanged, | |
536 | + .check_events = gdrom_bdops_check_events, | |
534 | 537 | .ioctl = gdrom_bdops_ioctl, |
535 | 538 | }; |
536 | 539 | |
... | ... | @@ -800,6 +803,7 @@ |
800 | 803 | goto probe_fail_cdrom_register; |
801 | 804 | } |
802 | 805 | gd.disk->fops = &gdrom_bdops; |
806 | + gd.disk->events = DISK_EVENT_MEDIA_CHANGE; | |
803 | 807 | /* latch on to the interrupt */ |
804 | 808 | err = gdrom_set_interrupt_handlers(); |
805 | 809 | if (err) |
drivers/cdrom/viocd.c
... | ... | @@ -186,10 +186,11 @@ |
186 | 186 | return ret; |
187 | 187 | } |
188 | 188 | |
189 | -static int viocd_blk_media_changed(struct gendisk *disk) | |
189 | +static unsigned int viocd_blk_check_events(struct gendisk *disk, | |
190 | + unsigned int clearing) | |
190 | 191 | { |
191 | 192 | struct disk_info *di = disk->private_data; |
192 | - return cdrom_media_changed(&di->viocd_info); | |
193 | + return cdrom_check_events(&di->viocd_info, clearing); | |
193 | 194 | } |
194 | 195 | |
195 | 196 | static const struct block_device_operations viocd_fops = { |
... | ... | @@ -197,7 +198,7 @@ |
197 | 198 | .open = viocd_blk_open, |
198 | 199 | .release = viocd_blk_release, |
199 | 200 | .ioctl = viocd_blk_ioctl, |
200 | - .media_changed = viocd_blk_media_changed, | |
201 | + .check_events = viocd_blk_check_events, | |
201 | 202 | }; |
202 | 203 | |
203 | 204 | static int viocd_open(struct cdrom_device_info *cdi, int purpose) |
... | ... | @@ -320,7 +321,8 @@ |
320 | 321 | } |
321 | 322 | } |
322 | 323 | |
323 | -static int viocd_media_changed(struct cdrom_device_info *cdi, int disc_nr) | |
324 | +static unsigned int viocd_check_events(struct cdrom_device_info *cdi, | |
325 | + unsigned int clearing, int disc_nr) | |
324 | 326 | { |
325 | 327 | struct viocd_waitevent we; |
326 | 328 | HvLpEvent_Rc hvrc; |
... | ... | @@ -340,7 +342,7 @@ |
340 | 342 | if (hvrc != 0) { |
341 | 343 | pr_warning("bad rc on HvCallEvent_signalLpEventFast %d\n", |
342 | 344 | (int)hvrc); |
343 | - return -EIO; | |
345 | + return 0; | |
344 | 346 | } |
345 | 347 | |
346 | 348 | wait_for_completion(&we.com); |
... | ... | @@ -354,7 +356,7 @@ |
354 | 356 | return 0; |
355 | 357 | } |
356 | 358 | |
357 | - return we.changed; | |
359 | + return we.changed ? DISK_EVENT_MEDIA_CHANGE : 0; | |
358 | 360 | } |
359 | 361 | |
360 | 362 | static int viocd_lock_door(struct cdrom_device_info *cdi, int locking) |
... | ... | @@ -550,7 +552,7 @@ |
550 | 552 | static struct cdrom_device_ops viocd_dops = { |
551 | 553 | .open = viocd_open, |
552 | 554 | .release = viocd_release, |
553 | - .media_changed = viocd_media_changed, | |
555 | + .check_events = viocd_check_events, | |
554 | 556 | .lock_door = viocd_lock_door, |
555 | 557 | .generic_packet = viocd_packet, |
556 | 558 | .audio_ioctl = viocd_audio_ioctl, |
... | ... | @@ -624,6 +626,7 @@ |
624 | 626 | gendisk->queue = q; |
625 | 627 | gendisk->fops = &viocd_fops; |
626 | 628 | gendisk->flags = GENHD_FL_CD|GENHD_FL_REMOVABLE; |
629 | + gendisk->events = DISK_EVENT_MEDIA_CHANGE; | |
627 | 630 | set_capacity(gendisk, 0); |
628 | 631 | gendisk->private_data = d; |
629 | 632 | d->viocd_disk = gendisk; |