diff options
author | Jens Axboe <axboe@kernel.dk> | 2018-10-14 15:20:48 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-10-14 15:20:48 -0400 |
commit | 8f94004e2a51a3ea195cf3447eb5d5906f36d8b3 (patch) | |
tree | dfba0bd639cbedbd4c074155237a562d0efedd3f | |
parent | 5e27891e88555fecd8262e110e1a29feca4b0166 (diff) |
cdrom: don't attempt to fiddle with cdo->capability
We can't modify cdo->capability as it is defined as a const.
Change the modification hack to just WARN_ON_ONCE() if we hit
any of the invalid combinations.
This fixes a regression for pcd, which doesn't work after the
constify patch.
Fixes: 853fe1bf7554 ("cdrom: Make device operations read-only")
Tested-by: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | drivers/cdrom/cdrom.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index 10802d1fc554..614ecdbb4ab7 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c | |||
@@ -410,10 +410,10 @@ static int cdrom_get_disc_info(struct cdrom_device_info *cdi, | |||
410 | * hack to have the capability flags defined const, while we can still | 410 | * hack to have the capability flags defined const, while we can still |
411 | * change it here without gcc complaining at every line. | 411 | * change it here without gcc complaining at every line. |
412 | */ | 412 | */ |
413 | #define ENSURE(call, bits) \ | 413 | #define ENSURE(cdo, call, bits) \ |
414 | do { \ | 414 | do { \ |
415 | if (cdo->call == NULL) \ | 415 | if (cdo->call == NULL) \ |
416 | *change_capability &= ~(bits); \ | 416 | WARN_ON_ONCE((cdo)->capability & (bits)); \ |
417 | } while (0) | 417 | } while (0) |
418 | 418 | ||
419 | /* | 419 | /* |
@@ -589,7 +589,6 @@ int register_cdrom(struct cdrom_device_info *cdi) | |||
589 | { | 589 | { |
590 | static char banner_printed; | 590 | static char banner_printed; |
591 | const struct cdrom_device_ops *cdo = cdi->ops; | 591 | const struct cdrom_device_ops *cdo = cdi->ops; |
592 | int *change_capability = (int *)&cdo->capability; /* hack */ | ||
593 | 592 | ||
594 | cd_dbg(CD_OPEN, "entering register_cdrom\n"); | 593 | cd_dbg(CD_OPEN, "entering register_cdrom\n"); |
595 | 594 | ||
@@ -601,16 +600,16 @@ int register_cdrom(struct cdrom_device_info *cdi) | |||
601 | cdrom_sysctl_register(); | 600 | cdrom_sysctl_register(); |
602 | } | 601 | } |
603 | 602 | ||
604 | ENSURE(drive_status, CDC_DRIVE_STATUS); | 603 | ENSURE(cdo, drive_status, CDC_DRIVE_STATUS); |
605 | if (cdo->check_events == NULL && cdo->media_changed == NULL) | 604 | if (cdo->check_events == NULL && cdo->media_changed == NULL) |
606 | *change_capability = ~(CDC_MEDIA_CHANGED | CDC_SELECT_DISC); | 605 | WARN_ON_ONCE(cdo->capability & (CDC_MEDIA_CHANGED | CDC_SELECT_DISC)); |
607 | ENSURE(tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY); | 606 | ENSURE(cdo, tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY); |
608 | ENSURE(lock_door, CDC_LOCK); | 607 | ENSURE(cdo, lock_door, CDC_LOCK); |
609 | ENSURE(select_speed, CDC_SELECT_SPEED); | 608 | ENSURE(cdo, select_speed, CDC_SELECT_SPEED); |
610 | ENSURE(get_last_session, CDC_MULTI_SESSION); | 609 | ENSURE(cdo, get_last_session, CDC_MULTI_SESSION); |
611 | ENSURE(get_mcn, CDC_MCN); | 610 | ENSURE(cdo, get_mcn, CDC_MCN); |
612 | ENSURE(reset, CDC_RESET); | 611 | ENSURE(cdo, reset, CDC_RESET); |
613 | ENSURE(generic_packet, CDC_GENERIC_PACKET); | 612 | ENSURE(cdo, generic_packet, CDC_GENERIC_PACKET); |
614 | cdi->mc_flags = 0; | 613 | cdi->mc_flags = 0; |
615 | cdi->options = CDO_USE_FFLAGS; | 614 | cdi->options = CDO_USE_FFLAGS; |
616 | 615 | ||