cdrom: respect device capabilities during opening action
[ Upstream commit 366ba7c71e
]
Reading the TOC only works if the device can play audio, otherwise
these commands fail (and possibly bring the device to an unhealthy
state.)
Similarly, cdrom_mmc3_profile() should only be called if the device
supports generic packet commands.
To: Jens Axboe <axboe@kernel.dk>
Cc: linux-kernel@vger.kernel.org
Cc: linux-scsi@vger.kernel.org
Signed-off-by: Diego Elio Pettenò <flameeyes@flameeyes.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
5.4-rM2-2.2.x-imx-squashed
parent
4c45e9ed24
commit
7739bc1e0e
|
@ -996,6 +996,12 @@ static void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype *tracks)
|
||||||
tracks->xa = 0;
|
tracks->xa = 0;
|
||||||
tracks->error = 0;
|
tracks->error = 0;
|
||||||
cd_dbg(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n");
|
cd_dbg(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n");
|
||||||
|
|
||||||
|
if (!CDROM_CAN(CDC_PLAY_AUDIO)) {
|
||||||
|
tracks->error = CDS_NO_INFO;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Grab the TOC header so we can see how many tracks there are */
|
/* Grab the TOC header so we can see how many tracks there are */
|
||||||
ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
|
ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -1162,6 +1168,7 @@ int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev,
|
||||||
ret = open_for_data(cdi);
|
ret = open_for_data(cdi);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
if (CDROM_CAN(CDC_GENERIC_PACKET))
|
||||||
cdrom_mmc3_profile(cdi);
|
cdrom_mmc3_profile(cdi);
|
||||||
if (mode & FMODE_WRITE) {
|
if (mode & FMODE_WRITE) {
|
||||||
ret = -EROFS;
|
ret = -EROFS;
|
||||||
|
@ -2882,6 +2889,9 @@ int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written)
|
||||||
it doesn't give enough information or fails. then we return
|
it doesn't give enough information or fails. then we return
|
||||||
the toc contents. */
|
the toc contents. */
|
||||||
use_toc:
|
use_toc:
|
||||||
|
if (!CDROM_CAN(CDC_PLAY_AUDIO))
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
toc.cdte_format = CDROM_MSF;
|
toc.cdte_format = CDROM_MSF;
|
||||||
toc.cdte_track = CDROM_LEADOUT;
|
toc.cdte_track = CDROM_LEADOUT;
|
||||||
if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))
|
if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))
|
||||||
|
|
Loading…
Reference in New Issue