cdrom: handle TOC

This patch should fix TOC handling for cdroms that can not play audio. It
extends commit af744e3294d09d706c4eae26cffaaa68a8d40337 ("cdrom: don't
check CDC_PLAY_AUDIO in cdrom_count_tracks()") with a safety check and
non-audio ioctls support.

Since CDC_PLAY_AUDIO flag was used not only to check ability to play audio
but also to ensure that audio_ioctl was not NULL, all TOC-related
operations had to use it.

As far as I understand, now audio_ioctl is never NULL, so a sanity check
during device registration should be sufficient.

It was tested on Optiarc AD7203A device, that has no ability to play
audio.

Cc: Tejun Heo <tj@kernel.org>
Cc: Jens Axboe <jens.axboe@oracle.com>
Cc: Borislav Petkov <petkovbb@googlemail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
[bart: remove now unneeded ->audio_ioctl check (noticed by Borislav)]
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>

authored by Alexander Inyukhin and committed by Bartlomiej Zolnierkiewicz bce31b67 d15cad5d

-7
-7
drivers/cdrom/cdrom.c
··· 408 ENSURE(get_last_session, CDC_MULTI_SESSION); 409 ENSURE(get_mcn, CDC_MCN); 410 ENSURE(reset, CDC_RESET); 411 - ENSURE(audio_ioctl, CDC_PLAY_AUDIO); 412 ENSURE(generic_packet, CDC_GENERIC_PACKET); 413 cdi->mc_flags = 0; 414 cdo->n_minors = 0; ··· 2505 2506 /* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/ 2507 2508 - if (!CDROM_CAN(CDC_PLAY_AUDIO)) 2509 - return -ENOSYS; 2510 if (copy_from_user(&q, argp, sizeof(q))) 2511 return -EFAULT; 2512 ··· 2535 2536 /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */ 2537 2538 - if (!CDROM_CAN(CDC_PLAY_AUDIO)) 2539 - return -ENOSYS; 2540 if (copy_from_user(&header, argp, sizeof(header))) 2541 return -EFAULT; 2542 ··· 2557 2558 /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */ 2559 2560 - if (!CDROM_CAN(CDC_PLAY_AUDIO)) 2561 - return -ENOSYS; 2562 if (copy_from_user(&entry, argp, sizeof(entry))) 2563 return -EFAULT; 2564
··· 408 ENSURE(get_last_session, CDC_MULTI_SESSION); 409 ENSURE(get_mcn, CDC_MCN); 410 ENSURE(reset, CDC_RESET); 411 ENSURE(generic_packet, CDC_GENERIC_PACKET); 412 cdi->mc_flags = 0; 413 cdo->n_minors = 0; ··· 2506 2507 /* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/ 2508 2509 if (copy_from_user(&q, argp, sizeof(q))) 2510 return -EFAULT; 2511 ··· 2538 2539 /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */ 2540 2541 if (copy_from_user(&header, argp, sizeof(header))) 2542 return -EFAULT; 2543 ··· 2562 2563 /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */ 2564 2565 if (copy_from_user(&entry, argp, sizeof(entry))) 2566 return -EFAULT; 2567